diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-06-19 21:12:15 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-19 21:12:15 +0100 |
| commit | ce8055a761fe6e150f64630bc800fffa3fd844b6 (patch) | |
| tree | 0963e9f71dcd2bd125306dcb8c4fbb35f66c497a /challenge-169 | |
| parent | 2af3d4350d27ce40ddcfbd36bf93a2ac1a8548ef (diff) | |
| parent | 10521e4ca3e0412734d2b66fa26f7db7a59b2e3e (diff) | |
| download | perlweeklychallenge-club-ce8055a761fe6e150f64630bc800fffa3fd844b6.tar.gz perlweeklychallenge-club-ce8055a761fe6e150f64630bc800fffa3fd844b6.tar.bz2 perlweeklychallenge-club-ce8055a761fe6e150f64630bc800fffa3fd844b6.zip | |
Merge pull request #6291 from arnesom/branch-for-challenge-169
Arne Sommer
Diffstat (limited to 'challenge-169')
| -rw-r--r-- | challenge-169/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/perl/achilles-numbers-perl | 105 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/perl/brilliant-numbers-perl | 53 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/perl/ch-1.pl | 53 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/perl/ch-2.pl | 105 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/raku/achilles-numbers | 92 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/raku/brilliant-numbers | 34 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/raku/ch-1.raku | 34 | ||||
| -rwxr-xr-x | challenge-169/arne-sommer/raku/ch-2.raku | 92 |
9 files changed, 569 insertions, 0 deletions
diff --git a/challenge-169/arne-sommer/blog.txt b/challenge-169/arne-sommer/blog.txt new file mode 100644 index 0000000000..b6072b4829 --- /dev/null +++ b/challenge-169/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/ambundance-numbers.html diff --git a/challenge-169/arne-sommer/perl/achilles-numbers-perl b/challenge-169/arne-sommer/perl/achilles-numbers-perl new file mode 100755 index 0000000000..1a4c199378 --- /dev/null +++ b/challenge-169/arne-sommer/perl/achilles-numbers-perl @@ -0,0 +1,105 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; +no warnings 'experimental::signatures'; + +use Math::Prime::Util 'is_prime'; + +my $count = shift(@ARGV) || 20; + +die "Please specify a positive integer" unless $count =~ /^[1-9]\d*$/; + +my @achilles = (); + +my $candidate = 0; + +while (@achilles != $count) +{ + $candidate++; + + push(@achilles, $candidate) if is_achilles($candidate); +} + +say join(", ", @achilles); + +sub factors ($number) +{ + return (1) if $number == 1; + return ($number) if is_prime($number); + + my @factors; + + for my $candidate (grep { is_prime($_) } 2 .. $number / 2) + { + while ($number % $candidate == 0) + { + push(@factors, $candidate); + $number /= $candidate; + } + } + + return @factors; +} + +sub divisors ($number) +{ + my @divisors; + + for my $candidate (2 .. $number/2) + { + push(@divisors, $candidate) if $number % $candidate == 0; + } + + return @divisors; +} + +sub is_powerful ($number) +{ + return 1 if $number == 1; + + my @factors = factors($number); + + my %values; + + for my $val (@factors) + { + $values{$val}++; + } + + for my $count (values %values) + { + return 0 if $count == 1; + } + + return 1; +} + +sub is_perfect ($number) +{ + return 1 if $number <= 1; + + my @divisors = divisors($number); + + return 0 unless @divisors; + + for my $divisor (@divisors) + { + my $current = $divisor; + + $current *= $divisor while $current < $number; + + return 1 if $current == $number; + } + + return 0; +} + +sub is_achilles ($number) +{ + return 0 unless is_powerful($number); + return 0 if is_perfect($number); + return 1; +} diff --git a/challenge-169/arne-sommer/perl/brilliant-numbers-perl b/challenge-169/arne-sommer/perl/brilliant-numbers-perl new file mode 100755 index 0000000000..5a6a78d790 --- /dev/null +++ b/challenge-169/arne-sommer/perl/brilliant-numbers-perl @@ -0,0 +1,53 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; +no warnings 'experimental::signatures'; + +use Math::Prime::Util 'is_prime'; + +my $count = shift(@ARGV) || 20; + +die "Please specify a positive integer" unless $count =~ /^[1-9]\d*$/; + +my @bn = (); + +my $candidate = 0; + +while (@bn != $count) +{ + $candidate++; + + push(@bn, $candidate) if is_brilliant($candidate); +} + +say join(", ", @bn); + +sub factors ($number) +{ + return (1) if $number == 1; + return ($number) if is_prime($number); + + my @factors; + + for my $candidate (grep { is_prime($_) } 2 .. $number / 2) + { + while ($number % $candidate == 0) + { + push(@factors, $candidate); + $number /= $candidate; + } + } + + return @factors; +} + +sub is_brilliant ($number) +{ + my @factors = factors($number); + return 0 unless @factors == 2; + return 0 unless length($factors[0]) == length($factors[1]); + return 1; +} diff --git a/challenge-169/arne-sommer/perl/ch-1.pl b/challenge-169/arne-sommer/perl/ch-1.pl new file mode 100755 index 0000000000..5a6a78d790 --- /dev/null +++ b/challenge-169/arne-sommer/perl/ch-1.pl @@ -0,0 +1,53 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; +no warnings 'experimental::signatures'; + +use Math::Prime::Util 'is_prime'; + +my $count = shift(@ARGV) || 20; + +die "Please specify a positive integer" unless $count =~ /^[1-9]\d*$/; + +my @bn = (); + +my $candidate = 0; + +while (@bn != $count) +{ + $candidate++; + + push(@bn, $candidate) if is_brilliant($candidate); +} + +say join(", ", @bn); + +sub factors ($number) +{ + return (1) if $number == 1; + return ($number) if is_prime($number); + + my @factors; + + for my $candidate (grep { is_prime($_) } 2 .. $number / 2) + { + while ($number % $candidate == 0) + { + push(@factors, $candidate); + $number /= $candidate; + } + } + + return @factors; +} + +sub is_brilliant ($number) +{ + my @factors = factors($number); + return 0 unless @factors == 2; + return 0 unless length($factors[0]) == length($factors[1]); + return 1; +} diff --git a/challenge-169/arne-sommer/perl/ch-2.pl b/challenge-169/arne-sommer/perl/ch-2.pl new file mode 100755 index 0000000000..1a4c199378 --- /dev/null +++ b/challenge-169/arne-sommer/perl/ch-2.pl @@ -0,0 +1,105 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; +no warnings 'experimental::signatures'; + +use Math::Prime::Util 'is_prime'; + +my $count = shift(@ARGV) || 20; + +die "Please specify a positive integer" unless $count =~ /^[1-9]\d*$/; + +my @achilles = (); + +my $candidate = 0; + +while (@achilles != $count) +{ + $candidate++; + + push(@achilles, $candidate) if is_achilles($candidate); +} + +say join(", ", @achilles); + +sub factors ($number) +{ + return (1) if $number == 1; + return ($number) if is_prime($number); + + my @factors; + + for my $candidate (grep { is_prime($_) } 2 .. $number / 2) + { + while ($number % $candidate == 0) + { + push(@factors, $candidate); + $number /= $candidate; + } + } + + return @factors; +} + +sub divisors ($number) +{ + my @divisors; + + for my $candidate (2 .. $number/2) + { + push(@divisors, $candidate) if $number % $candidate == 0; + } + + return @divisors; +} + +sub is_powerful ($number) +{ + return 1 if $number == 1; + + my @factors = factors($number); + + my %values; + + for my $val (@factors) + { + $values{$val}++; + } + + for my $count (values %values) + { + return 0 if $count == 1; + } + + return 1; +} + +sub is_perfect ($number) +{ + return 1 if $number <= 1; + + my @divisors = divisors($number); + + return 0 unless @divisors; + + for my $divisor (@divisors) + { + my $current = $divisor; + + $current *= $divisor while $current < $number; + + return 1 if $current == $number; + } + + return 0; +} + +sub is_achilles ($number) +{ + return 0 unless is_powerful($number); + return 0 if is_perfect($number); + return 1; +} diff --git a/challenge-169/arne-sommer/raku/achilles-numbers b/challenge-169/arne-sommer/raku/achilles-numbers new file mode 100755 index 0000000000..75ce3d9c1a --- /dev/null +++ b/challenge-169/arne-sommer/raku/achilles-numbers @@ -0,0 +1,92 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int :c(:$count) where $count > 0 = 20, :$powerful, :$perfect); + +my $bn; + + +if ($powerful && ! $perfect) +{ + $bn := (1 .. Inf).grep( *.&is-powerful ); +} +elsif ($perfect && !$powerful) +{ + $bn := (1 .. Inf).grep( *.&is-perfect ); +} +else +{ + $bn := (1 .. Inf).grep( *.&is-achilles ); +} + +say $bn[^$count].join(", "); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} + +sub divisors ($number, :$not-self, :$not-one) +{ + my @divisors; + + for ($not-one ?? 2 !! 1) .. $number/2 -> $candidate + { + @divisors.push: $candidate if $number %% $candidate; + } + + @divisors.push: $number unless $not-self; + + return @divisors; +} + +sub is-powerful ($number) +{ + return True if $number == 1; + + my @factors = factors($number); + + my $b = @factors.Bag; + + return all($b.values) > 1; +} + +sub is-perfect ($number) +{ + return True if $number <= 1; + + my @divisors = divisors($number, :not-self, :not-one); + + return False unless @divisors.elems; + + for @divisors -> $divisor + { + my $current = $divisor; + + $current *= $divisor while $current < $number; + + return True if $current == $number; + } + + return False; +} + +sub is-achilles ($number) +{ + return False unless $number.&is-powerful; + return False if $number.&is-perfect; + return True; +} diff --git a/challenge-169/arne-sommer/raku/brilliant-numbers b/challenge-169/arne-sommer/raku/brilliant-numbers new file mode 100755 index 0000000000..d508c9c0f0 --- /dev/null +++ b/challenge-169/arne-sommer/raku/brilliant-numbers @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int :c(:$count) where $count > 0 = 20); + +my $bn := (1 .. Inf).grep( *.&is-brilliant ); + +say $bn[^$count].join(", "); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime ) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} + +sub is-brilliant ($number) +{ + my @factors = factors($number); + return False unless @factors.elems == 2; + return False unless @factors[0].chars == @factors[1].chars; + return True; +} diff --git a/challenge-169/arne-sommer/raku/ch-1.raku b/challenge-169/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..d508c9c0f0 --- /dev/null +++ b/challenge-169/arne-sommer/raku/ch-1.raku @@ -0,0 +1,34 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int :c(:$count) where $count > 0 = 20); + +my $bn := (1 .. Inf).grep( *.&is-brilliant ); + +say $bn[^$count].join(", "); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime ) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} + +sub is-brilliant ($number) +{ + my @factors = factors($number); + return False unless @factors.elems == 2; + return False unless @factors[0].chars == @factors[1].chars; + return True; +} diff --git a/challenge-169/arne-sommer/raku/ch-2.raku b/challenge-169/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..75ce3d9c1a --- /dev/null +++ b/challenge-169/arne-sommer/raku/ch-2.raku @@ -0,0 +1,92 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int :c(:$count) where $count > 0 = 20, :$powerful, :$perfect); + +my $bn; + + +if ($powerful && ! $perfect) +{ + $bn := (1 .. Inf).grep( *.&is-powerful ); +} +elsif ($perfect && !$powerful) +{ + $bn := (1 .. Inf).grep( *.&is-perfect ); +} +else +{ + $bn := (1 .. Inf).grep( *.&is-achilles ); +} + +say $bn[^$count].join(", "); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} + +sub divisors ($number, :$not-self, :$not-one) +{ + my @divisors; + + for ($not-one ?? 2 !! 1) .. $number/2 -> $candidate + { + @divisors.push: $candidate if $number %% $candidate; + } + + @divisors.push: $number unless $not-self; + + return @divisors; +} + +sub is-powerful ($number) +{ + return True if $number == 1; + + my @factors = factors($number); + + my $b = @factors.Bag; + + return all($b.values) > 1; +} + +sub is-perfect ($number) +{ + return True if $number <= 1; + + my @divisors = divisors($number, :not-self, :not-one); + + return False unless @divisors.elems; + + for @divisors -> $divisor + { + my $current = $divisor; + + $current *= $divisor while $current < $number; + + return True if $current == $number; + } + + return False; +} + +sub is-achilles ($number) +{ + return False unless $number.&is-powerful; + return False if $number.&is-perfect; + return True; +} |
