aboutsummaryrefslogtreecommitdiff
path: root/challenge-155
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-03-10 12:30:41 +0000
committerGitHub <noreply@github.com>2022-03-10 12:30:41 +0000
commit6c1604643bb7897f73058a7185824247ea03e80f (patch)
treea1e988a1378c5e2d4b331ad11eb3a4196e0018e2 /challenge-155
parentc8ba16beb448d9d2a247bf94c9cb85cdf8615e50 (diff)
parent2dde97db78bb2e97d718c80544c7761c15e7f130 (diff)
downloadperlweeklychallenge-club-6c1604643bb7897f73058a7185824247ea03e80f.tar.gz
perlweeklychallenge-club-6c1604643bb7897f73058a7185824247ea03e80f.tar.bz2
perlweeklychallenge-club-6c1604643bb7897f73058a7185824247ea03e80f.zip
Merge pull request #5761 from polettix/polettix/pwc155
Add polettix's solution to challenge-155
Diffstat (limited to 'challenge-155')
-rw-r--r--challenge-155/polettix/blog.txt1
-rw-r--r--challenge-155/polettix/blog1.txt1
-rw-r--r--challenge-155/polettix/perl/ch-1.pl39
-rw-r--r--challenge-155/polettix/perl/ch-2.pl17
-rw-r--r--challenge-155/polettix/perl/cpanfile1
-rw-r--r--challenge-155/polettix/perl/cpanfile.snapshot31
-rw-r--r--challenge-155/polettix/raku/ch-1.raku45
-rw-r--r--challenge-155/polettix/raku/ch-2.raku15
8 files changed, 150 insertions, 0 deletions
diff --git a/challenge-155/polettix/blog.txt b/challenge-155/polettix/blog.txt
new file mode 100644
index 0000000000..7ae6c3035b
--- /dev/null
+++ b/challenge-155/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2022/03/09/pwc155-fortunate-numbers/
diff --git a/challenge-155/polettix/blog1.txt b/challenge-155/polettix/blog1.txt
new file mode 100644
index 0000000000..68c1c1e8a3
--- /dev/null
+++ b/challenge-155/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2022/03/10/pisano-period/
diff --git a/challenge-155/polettix/perl/ch-1.pl b/challenge-155/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..f1995e598e
--- /dev/null
+++ b/challenge-155/polettix/perl/ch-1.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+use FindBin '$Bin';
+use lib "$Bin/local/lib/perl5";
+use ntheory qw< is_prime next_prime >;
+use List::MoreUtils 'uniq';
+use bigint;
+
+say join ', ', first_fortunate_numbers(shift || 8);
+
+sub first_fortunate_numbers ($n) {
+ my $it = fortunate_numbers_it();
+ my (@cleared, @seen);
+ while (@cleared < $n) {
+ my ($prime, $fn) = $it->();
+ @seen = uniq sort { $a <=> $b } (@seen, $fn);
+ push @cleared, shift @seen while @seen && $seen[0] < $prime;
+ }
+ return @cleared[0 .. $n - 1];
+}
+
+sub fortunate_numbers_it {
+ my $primorial = 1;
+ my $prime = 1; # bear with me please...
+ return sub {
+ $prime = next_prime($prime);
+ $primorial *= $prime;
+ return (2, 3) if $prime == 2;
+ my $n = $prime;
+ while ('necessary') {
+ $n += 2;
+ return ($prime, $n) if is_prime($primorial + $n);
+ }
+ };
+}
diff --git a/challenge-155/polettix/perl/ch-2.pl b/challenge-155/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..a52fab6cbd
--- /dev/null
+++ b/challenge-155/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';
+
+say pisano_period(shift // 3);
+
+sub pisano_period ($n) {
+ my ($fl, $fh) = (0, 1 % $n);
+ my $pp = 0;
+ while ('necessary') {
+ ($fl, $fh) = ($fh, ($fl + $fh) % $n);
+ ++$pp;
+ return $pp if $fl == 0 && $fh == 1 % $n;
+ }
+}
diff --git a/challenge-155/polettix/perl/cpanfile b/challenge-155/polettix/perl/cpanfile
index 91dda9616f..aa20fef593 100644
--- a/challenge-155/polettix/perl/cpanfile
+++ b/challenge-155/polettix/perl/cpanfile
@@ -1 +1,2 @@
requires 'Math::Prime::Util';
+requires 'List::MoreUtils';
diff --git a/challenge-155/polettix/perl/cpanfile.snapshot b/challenge-155/polettix/perl/cpanfile.snapshot
index 2fd600a3af..4927cf8387 100644
--- a/challenge-155/polettix/perl/cpanfile.snapshot
+++ b/challenge-155/polettix/perl/cpanfile.snapshot
@@ -1,5 +1,36 @@
# carton snapshot format: version 1.0
DISTRIBUTIONS
+ Exporter-Tiny-1.002002
+ pathname: T/TO/TOBYINK/Exporter-Tiny-1.002002.tar.gz
+ provides:
+ Exporter::Shiny 1.002002
+ Exporter::Tiny 1.002002
+ requirements:
+ ExtUtils::MakeMaker 6.17
+ perl 5.006001
+ List-MoreUtils-0.430
+ pathname: R/RE/REHSACK/List-MoreUtils-0.430.tar.gz
+ provides:
+ List::MoreUtils 0.430
+ List::MoreUtils::PP 0.430
+ requirements:
+ Exporter::Tiny 0.038
+ ExtUtils::MakeMaker 0
+ List::MoreUtils::XS 0.430
+ List-MoreUtils-XS-0.430
+ pathname: R/RE/REHSACK/List-MoreUtils-XS-0.430.tar.gz
+ provides:
+ List::MoreUtils::XS 0.430
+ requirements:
+ Carp 0
+ ExtUtils::MakeMaker 0
+ File::Basename 0
+ File::Copy 0
+ File::Path 0
+ File::Spec 0
+ IPC::Cmd 0
+ XSLoader 0.22
+ base 0
Math-Prime-Util-0.73
pathname: D/DA/DANAJ/Math-Prime-Util-0.73.tar.gz
provides:
diff --git a/challenge-155/polettix/raku/ch-1.raku b/challenge-155/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..5c6d5bb3fd
--- /dev/null
+++ b/challenge-155/polettix/raku/ch-1.raku
@@ -0,0 +1,45 @@
+#!/usr/bin/env raku
+
+sub MAIN (Int:D $n = 8) {
+ first-fortunate-numbers($n).join(', ').put;
+ return 0;
+}
+
+sub first-fortunate-numbers($n) {
+ my &it = fortunate-numbers-it();
+ my @cleared;
+ my @seen;
+ while @cleared < $n {
+ my ($prime, $fn) = &it();
+ @seen = (@seen.Slip, $fn).sort.unique;
+ @cleared.push: @seen.shift while @seen && @seen[0] < $prime;
+ }
+ return @cleared[^$n];
+}
+
+sub fortunate-numbers-it() {
+ my $primorial = 1;
+ my &pit = primes-it();
+ return sub {
+ my $prime = &pit(); # get next prime
+ $primorial *= $prime; # update the primorial
+ return 2, 3 if $prime == 2;
+ my $n = $prime;
+ loop {
+ $n += 2;
+ return $prime, $n if ($primorial + $n).is-prime;
+ }
+ }
+}
+
+sub primes-it() {
+ my @cache = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47;
+ my $last;
+ return sub {
+ return $last = @cache.shift if @cache;
+ loop {
+ $last += 2;
+ return $last if $last.is-prime;
+ }
+ }
+}
diff --git a/challenge-155/polettix/raku/ch-2.raku b/challenge-155/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..0c9d8b4565
--- /dev/null
+++ b/challenge-155/polettix/raku/ch-2.raku
@@ -0,0 +1,15 @@
+#!/usr/bin/env raku
+use v6;
+
+sub MAIN (Int:D $n = 3) { put pisano-period($n) }
+
+multi sub pisano-period (1) { return 1 }
+multi sub pisano-period ($n) {
+ my ($fl, $fh) = 0, 1;
+ my $pp = 0;
+ loop {
+ ($fl, $fh) = $fh, ($fl + $fh) % $n;
+ ++$pp;
+ return $pp if $fl == 0 && $fh == 1;
+ }
+}