aboutsummaryrefslogtreecommitdiff
path: root/challenge-169
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-06-19 21:12:15 +0100
committerGitHub <noreply@github.com>2022-06-19 21:12:15 +0100
commitce8055a761fe6e150f64630bc800fffa3fd844b6 (patch)
tree0963e9f71dcd2bd125306dcb8c4fbb35f66c497a /challenge-169
parent2af3d4350d27ce40ddcfbd36bf93a2ac1a8548ef (diff)
parent10521e4ca3e0412734d2b66fa26f7db7a59b2e3e (diff)
downloadperlweeklychallenge-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.txt1
-rwxr-xr-xchallenge-169/arne-sommer/perl/achilles-numbers-perl105
-rwxr-xr-xchallenge-169/arne-sommer/perl/brilliant-numbers-perl53
-rwxr-xr-xchallenge-169/arne-sommer/perl/ch-1.pl53
-rwxr-xr-xchallenge-169/arne-sommer/perl/ch-2.pl105
-rwxr-xr-xchallenge-169/arne-sommer/raku/achilles-numbers92
-rwxr-xr-xchallenge-169/arne-sommer/raku/brilliant-numbers34
-rwxr-xr-xchallenge-169/arne-sommer/raku/ch-1.raku34
-rwxr-xr-xchallenge-169/arne-sommer/raku/ch-2.raku92
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;
+}