diff options
| -rw-r--r-- | challenge-168/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-168/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-168/polettix/perl/ch-1.pl | 21 | ||||
| -rw-r--r-- | challenge-168/polettix/perl/ch-2.pl | 17 | ||||
| -rw-r--r-- | challenge-168/polettix/perl/cpanfile | 1 | ||||
| -rw-r--r-- | challenge-168/polettix/perl/cpanfile.snapshot | 38 | ||||
| -rw-r--r-- | challenge-168/polettix/raku/ch-1.raku | 28 | ||||
| -rw-r--r-- | challenge-168/polettix/raku/ch-2.raku | 31 |
8 files changed, 138 insertions, 0 deletions
diff --git a/challenge-168/polettix/blog.txt b/challenge-168/polettix/blog.txt new file mode 100644 index 0000000000..f6337130ae --- /dev/null +++ b/challenge-168/polettix/blog.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2022/06/08/pwc168-perrin-prime/ diff --git a/challenge-168/polettix/blog1.txt b/challenge-168/polettix/blog1.txt new file mode 100644 index 0000000000..ad226cc866 --- /dev/null +++ b/challenge-168/polettix/blog1.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2022/06/09/pwc168-home-prime/ diff --git a/challenge-168/polettix/perl/ch-1.pl b/challenge-168/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..e4952fb0ed --- /dev/null +++ b/challenge-168/polettix/perl/ch-1.pl @@ -0,0 +1,21 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; + +use ntheory 'is_prime'; + +my $n = shift // 13; +say join ', ', perrin_primes($n); + +sub perrin_primes ($n) { + my @pps = (2, 3, 5); + my @state = (2, 5, 5); + while (@pps < $n) { + push @state, my $candidate = $state[0] + $state[1]; + shift @state; + push @pps, $candidate if is_prime($candidate); + } + return @pps; +} diff --git a/challenge-168/polettix/perl/ch-2.pl b/challenge-168/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..24a1dd1255 --- /dev/null +++ b/challenge-168/polettix/perl/ch-2.pl @@ -0,0 +1,17 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; + +use ntheory qw< factor >; + +my $n = shift // 10; +say home_prime($n); + +sub home_prime { + my $next = join '', factor($_[0]); + return $next if $next eq $_[0]; + $_[0] = $next; + goto &home_prime; +} diff --git a/challenge-168/polettix/perl/cpanfile b/challenge-168/polettix/perl/cpanfile new file mode 100644 index 0000000000..94ac365d6f --- /dev/null +++ b/challenge-168/polettix/perl/cpanfile @@ -0,0 +1 @@ +requires 'ntheory'; diff --git a/challenge-168/polettix/perl/cpanfile.snapshot b/challenge-168/polettix/perl/cpanfile.snapshot new file mode 100644 index 0000000000..2fd600a3af --- /dev/null +++ b/challenge-168/polettix/perl/cpanfile.snapshot @@ -0,0 +1,38 @@ +# carton snapshot format: version 1.0 +DISTRIBUTIONS + Math-Prime-Util-0.73 + pathname: D/DA/DANAJ/Math-Prime-Util-0.73.tar.gz + provides: + Math::Prime::Util 0.73 + Math::Prime::Util::ChaCha 0.73 + Math::Prime::Util::Entropy 0.73 + Math::Prime::Util::MemFree 0.73 + Math::Prime::Util::PP 0.73 + Math::Prime::Util::PrimeArray 0.73 + Math::Prime::Util::PrimeIterator 0.73 + ntheory 0.73 + requirements: + Carp 0 + Config 0 + Exporter 5.57 + ExtUtils::MakeMaker 0 + Math::BigFloat 1.59 + Math::BigInt 1.88 + Math::Prime::Util::GMP 0.50 + Tie::Array 0 + XSLoader 0.01 + base 0 + constant 0 + perl 5.006002 + Math-Prime-Util-GMP-0.52 + pathname: D/DA/DANAJ/Math-Prime-Util-GMP-0.52.tar.gz + provides: + Math::Prime::Util::GMP 0.52 + requirements: + Carp 0 + Exporter 5.57 + ExtUtils::MakeMaker 0 + Fcntl 0 + XSLoader 0.01 + base 0 + perl 5.006002 diff --git a/challenge-168/polettix/raku/ch-1.raku b/challenge-168/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..28f3b1fb86 --- /dev/null +++ b/challenge-168/polettix/raku/ch-1.raku @@ -0,0 +1,28 @@ +#!/usr/bin/env raku +use v6; + +class PerrinSequence { + has @!state = [3, 0, 2]; + method get () { + @!state.push(@!state[0] + @!state[1]); + return @!state.shift; + } +} + +multi sub MAIN (1) { put 2 } + +multi sub MAIN (2) { put '2, 3' } + +multi sub MAIN (3) { put '2, 3, 5' } + +multi sub MAIN (Int:D $n is copy where * > 3 = 13) { + my $ps = PerrinSequence.new; + $ps.get for 1..7; + my @n-primes = gather while $n > 3 { + my $candidate = $ps.get; + next unless $candidate.is-prime; + take $candidate; + --$n; + } + [2, 3, 5, |@n-primes].join(', ').put; +} diff --git a/challenge-168/polettix/raku/ch-2.raku b/challenge-168/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..5de2d6efd4 --- /dev/null +++ b/challenge-168/polettix/raku/ch-2.raku @@ -0,0 +1,31 @@ +#!/usr/bin/env raku +use v6; +sub MAIN (Int:D $n where * > 1 = 10) { put home-prime($n) } + +sub home-prime ($n is copy) { + loop { + my $m = factors($n).join('').Int; + return $n if $n == $m; + $n = $m; + } +} + +sub factors (Int $remainder is copy) { + return 1 if $remainder <= 1; + state @primes = 2, 3, 5, -> $n is copy { + repeat { $n += 2 } until $n %% none @primes ... { $_ * $_ >= $n } + $n; + } ... *; + gather for @primes -> $factor { + if $factor * $factor > $remainder { + take $remainder if $remainder > 1; + last; + } + + # How many times can we divide by this prime? + while $remainder %% $factor { + take $factor; + last if ($remainder div= $factor) === 1; + } + } +} |
