diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-03-09 14:07:47 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-09 14:07:47 +0000 |
| commit | d89bcf69802dad405373f7e7c9c710a1824381d2 (patch) | |
| tree | a81891fc04baf3590decef3b06f4f193ab91c4d8 /challenge-155 | |
| parent | 3d697363ef72ff30750a68c1c624269bef44d70a (diff) | |
| parent | 81fb697f69a1617fcb3fd4ebeb1eb842b8e5275c (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-155/luca-ferrari/blog-2.txt | 1 | ||||
| -rw-r--r-- | challenge-155/luca-ferrari/blog-3.txt | 1 | ||||
| -rw-r--r-- | challenge-155/luca-ferrari/blog-4.txt | 1 | ||||
| -rw-r--r-- | challenge-155/luca-ferrari/postgresql/ch-1.sql | 94 | ||||
| -rw-r--r-- | challenge-155/luca-ferrari/postgresql/ch-2.sql | 37 | ||||
| -rwxr-xr-x | challenge-155/luca-ferrari/raku/ch-1.p6 | 22 | ||||
| -rwxr-xr-x | challenge-155/luca-ferrari/raku/ch-2.p6 | 26 |
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; + +} |
