aboutsummaryrefslogtreecommitdiff
path: root/challenge-169
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-169')
-rw-r--r--challenge-169/laurent-rosenfeld/blog.txt1
-rw-r--r--challenge-169/laurent-rosenfeld/perl/ch-1.pl19
-rw-r--r--challenge-169/laurent-rosenfeld/perl/ch-2.pl88
-rw-r--r--challenge-169/laurent-rosenfeld/raku/ch-1.raku4
-rw-r--r--challenge-169/laurent-rosenfeld/raku/ch-2.raku25
5 files changed, 137 insertions, 0 deletions
diff --git a/challenge-169/laurent-rosenfeld/blog.txt b/challenge-169/laurent-rosenfeld/blog.txt
new file mode 100644
index 0000000000..0d2f2f48df
--- /dev/null
+++ b/challenge-169/laurent-rosenfeld/blog.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/laurent_r/2022/06/perl-weekly-challenge-169-brillant-nummbers-and-achilles-numbers.html
diff --git a/challenge-169/laurent-rosenfeld/perl/ch-1.pl b/challenge-169/laurent-rosenfeld/perl/ch-1.pl
new file mode 100644
index 0000000000..33851060a7
--- /dev/null
+++ b/challenge-169/laurent-rosenfeld/perl/ch-1.pl
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+use feature "say";
+
+my @small_primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
+
+sub combine {
+ my @primes = @_;
+ my %part_result;
+ for my $i (0..$#primes) {
+ for my $j ($i..$#primes) {
+ $part_result{$primes[$i] * $primes[$j]} = 1;
+ }
+ }
+ return sort {$a <=> $b} keys %part_result;
+}
+my @result = combine @small_primes[0..3];
+push @result, combine @small_primes[4..9];
+say "@result[0..19]";
diff --git a/challenge-169/laurent-rosenfeld/perl/ch-2.pl b/challenge-169/laurent-rosenfeld/perl/ch-2.pl
new file mode 100644
index 0000000000..dfe7d432ed
--- /dev/null
+++ b/challenge-169/laurent-rosenfeld/perl/ch-2.pl
@@ -0,0 +1,88 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature qw/say/;
+use Data::Dumper;
+use constant MAX => 500;
+
+my @primes = (2, 3, 5, 7);
+
+# Greatest common divisor of two or more integers
+sub gcd {
+ if (@_ > 2) {
+ return gcd( gcd($_[0], $_[1]), @_[2..$#_]);
+ } else {
+ my ($i, $j) = sort { $a <=> $b } @_;
+ while ($j) {
+ ($i, $j) = ($j, $i % $j);
+ }
+ return $i;
+ }
+}
+
+# Creating a hash of prime factors (as keys) with their powers (as values)
+sub prime_factors {
+ my $num = shift;
+ my $origin_num = $num;
+ my %factors;
+ for my $div (@primes) {
+ while ($num % $div == 0) {
+ $factors{$div}++;
+ $num /= $div;
+ }
+ return %factors if $num == 1;
+ }
+ $factors{$num}++ unless $num == $origin_num;
+ return %factors;
+}
+
+
+# Populating an array of primes up to MAX
+my $current = 9;
+while (1) {
+ my $prime = 1;
+ for my $i (@primes) {
+ my $i_sq = $i * $i;
+ last if $i_sq > $current;
+ $prime = 0, last if $current % $i == 0;
+ }
+ push @primes, $current if $prime;;
+ $current += 2;
+ last if $current > MAX;
+}
+
+my $count = 0;
+for my $n (1..MAX*MAX) {
+ my %factors = prime_factors $n;
+ my @powers = map $factors{$_}, keys %factors;
+ next if grep { $_ < 2} @powers;
+ next if scalar @powers < 2;
+ if (gcd(@powers) == 1) {
+ printf "%4d -> %s\n", $n, join " ", @powers;
+ $count++;
+ last if $count >= 20
+ }
+
+This script displays the following output:
+
+$ perl ./Achilles_nums.pl
+ 72 -> 2 3
+ 108 -> 2 3
+ 200 -> 3 2
+ 288 -> 5 2
+ 392 -> 3 2
+ 432 -> 3 4
+ 500 -> 3 2
+ 648 -> 4 3
+ 675 -> 2 3
+ 800 -> 2 5
+ 864 -> 3 5
+ 968 -> 3 2
+ 972 -> 5 2
+1125 -> 2 3
+1152 -> 2 7
+1323 -> 2 3
+1352 -> 2 3
+1372 -> 2 3
+1568 -> 5 2
+1800 -> 2 2 3
diff --git a/challenge-169/laurent-rosenfeld/raku/ch-1.raku b/challenge-169/laurent-rosenfeld/raku/ch-1.raku
new file mode 100644
index 0000000000..8836b199c0
--- /dev/null
+++ b/challenge-169/laurent-rosenfeld/raku/ch-1.raku
@@ -0,0 +1,4 @@
+my @small-primes = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29;
+my @result = (@small-primes[0..3] X* @small-primes[0..3]).sort.squish;
+append @result, (@small-primes[4..9] X* @small-primes[4..9]).sort.squish;
+say @result[0..19];
diff --git a/challenge-169/laurent-rosenfeld/raku/ch-2.raku b/challenge-169/laurent-rosenfeld/raku/ch-2.raku
new file mode 100644
index 0000000000..6b6a4f1879
--- /dev/null
+++ b/challenge-169/laurent-rosenfeld/raku/ch-2.raku
@@ -0,0 +1,25 @@
+my @primes = (2..1000).grep({.is-prime});
+
+sub prime-factors (UInt $num-in) {
+ my $factors = BagHash.new;
+ my $num = $num-in;
+ for @primes -> $div {
+ while ($num %% $div) {
+ $factors{$div}++;
+ $num div= $div;
+ }
+ return $factors if $num == 1;
+ }
+ $factors{$num}++ unless $num == $num-in;
+ return $factors;
+}
+
+my $count = 0;
+for 1..Inf -> $n {
+ my @powers = (prime-factors $n).values;
+ if @powers.none < 2 and @powers.elems > 1 and ([gcd] @powers) == 1 {
+ say $n.fmt("%4d"), " -> ", @powers;
+ $count++;
+ last if $count >= 20
+ }
+}