aboutsummaryrefslogtreecommitdiff
path: root/challenge-155
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-03-09 14:07:47 +0000
committerGitHub <noreply@github.com>2022-03-09 14:07:47 +0000
commitd89bcf69802dad405373f7e7c9c710a1824381d2 (patch)
treea81891fc04baf3590decef3b06f4f193ab91c4d8 /challenge-155
parent3d697363ef72ff30750a68c1c624269bef44d70a (diff)
parent81fb697f69a1617fcb3fd4ebeb1eb842b8e5275c (diff)
downloadperlweeklychallenge-club-d89bcf69802dad405373f7e7c9c710a1824381d2.tar.gz
perlweeklychallenge-club-d89bcf69802dad405373f7e7c9c710a1824381d2.tar.bz2
perlweeklychallenge-club-d89bcf69802dad405373f7e7c9c710a1824381d2.zip
Merge pull request #5752 from fluca1978/pwc155
Pwc155
Diffstat (limited to 'challenge-155')
-rw-r--r--challenge-155/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-155/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-155/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-155/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-155/luca-ferrari/postgresql/ch-1.sql94
-rw-r--r--challenge-155/luca-ferrari/postgresql/ch-2.sql37
-rwxr-xr-xchallenge-155/luca-ferrari/raku/ch-1.p622
-rwxr-xr-xchallenge-155/luca-ferrari/raku/ch-2.p626
8 files changed, 183 insertions, 0 deletions
diff --git a/challenge-155/luca-ferrari/blog-1.txt b/challenge-155/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..1027ee8874
--- /dev/null
+++ b/challenge-155/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/03/07/PerlWeeklyChallenge155.html#task1
diff --git a/challenge-155/luca-ferrari/blog-2.txt b/challenge-155/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..cc7a995551
--- /dev/null
+++ b/challenge-155/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/03/07/PerlWeeklyChallenge155.html#task2
diff --git a/challenge-155/luca-ferrari/blog-3.txt b/challenge-155/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..4f4621557a
--- /dev/null
+++ b/challenge-155/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/03/07/PerlWeeklyChallenge155.html#task1plperl
diff --git a/challenge-155/luca-ferrari/blog-4.txt b/challenge-155/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..1cf391c5e7
--- /dev/null
+++ b/challenge-155/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/03/07/PerlWeeklyChallenge155.html#task2plperl
diff --git a/challenge-155/luca-ferrari/postgresql/ch-1.sql b/challenge-155/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..421afabdbd
--- /dev/null
+++ b/challenge-155/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,94 @@
+CREATE SCHEMA IF NOT EXISTS pwc155;
+
+/*
+testdb=> select pwc155.fortunate( 8 ) order by 1;
+fortunate
+-----------
+3
+5
+7
+13
+17
+19
+23
+37
+(8 rows)
+
+
+*/
+
+CREATE OR REPLACE FUNCTION
+pwc155.fortunate( int )
+RETURNS SETOF integer
+AS $CODE$
+
+# a subroutine to see if a number
+# is prime
+my $is_prime = sub {
+ return 1 if $_[0] == 1;
+ return 1 if $_[0] == 2;
+ for my $i ( 2 .. $_[0] - 1 ) {
+ return 0 if $_[0] % $i == 0;
+ }
+
+ return 1;
+};
+
+# generates the first n primes
+my $generate_primes = sub {
+ my @primes;
+ for my $p ( 2 .. 99999 ) {
+ push @primes, $p if $is_prime->( $p );
+ return @primes if @primes == $_[0];
+ }
+};
+
+my $max = sub {
+ my $max = 0;
+ for (@_) {
+ $max = $_ if $_ > $max;
+ }
+
+ elog( DEBUG, "MAX = $max in " . join( ',', @_ ) );
+ return $max;
+};
+
+
+my $pn = sub {
+ my $result = 1;
+ for ( @_ ) {
+ $result *= $_;
+ }
+
+ return $result;
+};
+
+my $limit = $_[0] || 8;
+my %unique;
+
+for my $n ( 1 .. 999999 ) {
+ # generate the first n primes
+ my @primes = $generate_primes->( $n );
+ my $start = $max->( @primes ) + 1;
+ elog( DEBUG, "Primes = " . join( ',', @primes ) . " with max = $start" );
+ for my $m ( $start .. 999999 ) {
+ my $fortunate = $pn->( @primes ) + $m;
+ elog( DEBUG, "Computing $m -> " . $pn->( @primes ) . " + $m = $fortunate = " . $is_prime->( $fortunate ) );
+ next if ! $is_prime->( $fortunate );
+ $unique{ $m }++;
+ next if $unique{ $m } > 1;
+ return_next( $m );
+ last;
+ }
+
+
+ $limit--;
+ last if $limit <= 0;
+
+}
+
+
+
+return undef;
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-155/luca-ferrari/postgresql/ch-2.sql b/challenge-155/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..c3ce9f0b1a
--- /dev/null
+++ b/challenge-155/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,37 @@
+CREATE SCHEMA IF NOT EXISTS pwc155;
+
+/**
+ * Inspired by Abigail's solution and documentation:
+ https://github.com/manwar/perlweeklychallenge-club/pull/5751/commits/8c4b7ad7bd474c48af5bebdb566412d30101f28e
+*/
+/*
+testdb=> select pwc155.pisano_period( 3 );
+DEBUG: Fibonacci is 1,1
+DEBUG: Fibonacci is 1,1,2
+DEBUG: Fibonacci is 1,1,2,3
+DEBUG: 3 found on index 4
+pisano_period
+---------------
+8
+*/
+CREATE OR REPLACE FUNCTION
+pwc155.pisano_period( int )
+RETURNS integer
+AS $CODE$
+
+my @fibonacci;
+for ( 1 .. 999999 ) {
+ push @fibonacci, 1 if $_ <= 1;
+ push @fibonacci, @fibonacci[ -1 ] + @fibonacci[ -2 ];
+ elog( DEBUG, "Fibonacci is " . join( ',', @fibonacci ) );
+ last if @fibonacci[ -1 ] == $_[0];
+}
+
+# get the index
+my $index = $#fibonacci + 1;
+elog( DEBUG, "$_[0] found on index $index");
+return $index * 2 if $_[0] >= 3 and $index % 2 == 0;
+return $index * 4 if $_[0] >= 5 and $index % 2 == 1;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-155/luca-ferrari/raku/ch-1.p6 b/challenge-155/luca-ferrari/raku/ch-1.p6
new file mode 100755
index 0000000000..34c66026c2
--- /dev/null
+++ b/challenge-155/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,22 @@
+#!raku
+
+sub MAIN( Int $limit where { $limit > 0 } = 8 ) {
+ my @fortunate-numbers = lazy gather {
+ for 2 .. Inf {
+ my @pn = ( 1 .. $_ ).grep: *.is-prime;
+ next if ! @pn;
+ for @pn.max + 1 .. Inf -> $m {
+ take $m and last if ( ( [*] @pn ) + $m ).is-prime;
+ }
+ }
+ }
+
+ my @unique-fortunate-numbers;
+ my $last-number = 0;
+ while ( @unique-fortunate-numbers.elems < $limit ) {
+ my $fortunate = @fortunate-numbers[ $last-number++ ];
+ @unique-fortunate-numbers.push: $fortunate if ! @unique-fortunate-numbers.grep: * ~~ $fortunate;
+ }
+
+ @unique-fortunate-numbers[ 0 .. $limit - 1 ].sort.join( "\n" ).say;
+}
diff --git a/challenge-155/luca-ferrari/raku/ch-2.p6 b/challenge-155/luca-ferrari/raku/ch-2.p6
new file mode 100755
index 0000000000..e545f43430
--- /dev/null
+++ b/challenge-155/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,26 @@
+#!raku
+
+sub MAIN( Int $nth where { $nth >= 3 } = 3,
+ Int $accuracy where { $accuracy > 1 } = 5,
+ Bool :$verbose = False ) {
+
+ my @fibonacci = 0, 1, 1, 2, * + * ... *;
+ my @pisano = @fibonacci.map: * % 3;
+
+ # with nth >= 3 the period is always even
+ my $period = 2;
+
+ # build $accuracy arrays to check
+ my @checking.push: @pisano[ ( 0 + $period * $_ ) .. ( $period * ( $_ + 1 ) ) - 1 ] for 1 .. $accuracy;
+
+ # while the array are not all the same, grow them and recheck
+ while ( not [eqv] @checking ) {
+ $period += 2;
+ @checking = ();
+ @checking.push: @pisano[ ( 0 + $period * $_ ) .. ( $period * ( $_ + 1 ) ) - 1 ] for 1 .. $accuracy;
+ }
+
+ @checking.join( "\n" ).join( ',' ).say if $verbose;
+ "Pisano period $nth is $period".say;
+
+}