aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-06-07 12:21:34 +0100
committerGitHub <noreply@github.com>2022-06-07 12:21:34 +0100
commit0b2a99a786aa869a426bc777d6d889bec4b97fd5 (patch)
tree4556cb68e39f92e6dbfd5011012a4dc05a1441fa
parent6ab68abb799c03244d7a492ee2e22c996cb9c4af (diff)
parent8081d2dcb6e12129d204a1b5ddd5cad6d63062c1 (diff)
downloadperlweeklychallenge-club-0b2a99a786aa869a426bc777d6d889bec4b97fd5.tar.gz
perlweeklychallenge-club-0b2a99a786aa869a426bc777d6d889bec4b97fd5.tar.bz2
perlweeklychallenge-club-0b2a99a786aa869a426bc777d6d889bec4b97fd5.zip
Merge pull request #6214 from fluca1978/PWC168
Pwc168
-rw-r--r--challenge-168/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-168/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-1.plperl40
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-1.sql68
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-2.plperl52
-rw-r--r--challenge-168/luca-ferrari/postgresql/ch-2.sql69
-rwxr-xr-xchallenge-168/luca-ferrari/raku/ch-1.p621
-rwxr-xr-xchallenge-168/luca-ferrari/raku/ch-2.p635
12 files changed, 291 insertions, 0 deletions
diff --git a/challenge-168/luca-ferrari/blog-1.txt b/challenge-168/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..2b0b3a1caa
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1
diff --git a/challenge-168/luca-ferrari/blog-2.txt b/challenge-168/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..a3ce243b5c
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2
diff --git a/challenge-168/luca-ferrari/blog-3.txt b/challenge-168/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..e600750e8c
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1plperl
diff --git a/challenge-168/luca-ferrari/blog-4.txt b/challenge-168/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..1423018e36
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2plperl
diff --git a/challenge-168/luca-ferrari/blog-5.txt b/challenge-168/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..79cafaf9e2
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1plpgsql
diff --git a/challenge-168/luca-ferrari/blog-6.txt b/challenge-168/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..65410b3ae8
--- /dev/null
+++ b/challenge-168/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2plpgsql
diff --git a/challenge-168/luca-ferrari/postgresql/ch-1.plperl b/challenge-168/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..585589ec97
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,40 @@
+-- Perl Weekly Challenge 168
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.task1_plperl( int )
+RETURNS SETOF bigint
+AS $CODE$
+ my ( $limit ) = @_;
+ $limit //= 13;
+ my @perrin = (3, 0, 2);
+ my $seen = {};
+
+ my $is_prime = sub {
+ my ( $number ) = @_;
+
+ for ( 2 .. $number - 1 ) {
+ return undef if $number % $_ == 0;
+ }
+
+ return 1;
+ };
+
+ while ( $limit > 0 ) {
+ my $current = $perrin[ -2 ] + $perrin[ -3 ];
+ elog( DEBUG, "Limit $n and current is $current" );
+ push @perrin, $current;
+ next if ! $is_prime->( $current );
+ next if $seen->{ $current };
+
+ # found!
+ $seen->{ $current }++;
+ return_next( $current );
+ $limit--;
+ }
+
+return undef;
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-168/luca-ferrari/postgresql/ch-1.sql b/challenge-168/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..96bda1b3c5
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,68 @@
+-- Perl Weekly Challenge 168
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.is_prime( n bigint )
+RETURNS bool
+AS $CODE$
+DECLARE
+ i bigint;
+BEGIN
+ FOR i IN 2 .. n - 1 LOOP
+ IF n % i = 0 THEN
+ RETURN FALSE;
+ END IF;
+ END LOOP;
+
+ RETURN TRUE;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION
+pwc168.task1_plpgsql( l bigint default 5000 )
+RETURNS SETOF BIGINT
+AS $CODE$
+DECLARE
+ a bigint;
+ b bigint;
+ c bigint;
+ d bigint;
+BEGIN
+ -- bootstrap
+ a := 3;
+ b := 0;
+ c := 2;
+
+ RETURN NEXT a;
+ RETURN NEXT b;
+ RETURN NEXT c;
+
+ WHILE l > 0 LOOP
+ d := a + b;
+ a := b;
+ b := c;
+ c := d;
+
+ RAISE INFO 'Level % value %', l, c;
+ RETURN NEXT c;
+ l := l - 1;
+ END LOOP;
+
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+-- use more than 50 to get all the numbers
+-- BUT THIS CAN BE VERY SLOW from 70 and beyond!
+SELECT DISTINCT n
+FROM pwc168.task1_plpgsql( 50 ) n
+WHERE pwc168.is_prime( n )
+ORDER BY 1
+LIMIT 13;
diff --git a/challenge-168/luca-ferrari/postgresql/ch-2.plperl b/challenge-168/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..e150136c3e
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,52 @@
+-- Perl Weekly Challenge 168
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.task2_plperl( int )
+RETURNS int
+AS $CODE$
+
+my ( $value ) = @_;
+
+my $is_prime = sub {
+ my ( $number ) = @_;
+
+ for ( 2 .. $number - 1 ) {
+ return 0 if ( $number % $_ == 0 );
+ }
+
+ return 1;
+};
+
+my $prime_factors = sub {
+ my ( $number ) = @_;
+ my @factors;
+
+ return if $is_prime->( $number );
+
+ for ( 2 .. $number - 1 ) {
+ next if ! $is_prime->( $_ );
+ next if $number % $_ != 0;
+ next if $_ > $number;
+
+ while ( ( $number % $_ ) == 0 ) {
+ push @factors, $_;
+ $number /= $_;
+ }
+ }
+
+ return @factors;
+};
+
+
+my $value = join( '', $prime_factors->( $value ) );
+while ( ! $is_prime->( $value ) ) {
+ $value = join( '', $prime_factors->( $value ) );
+}
+
+return $value;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-168/luca-ferrari/postgresql/ch-2.sql b/challenge-168/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..c0bffbf930
--- /dev/null
+++ b/challenge-168/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,69 @@
+-- Perl Weekly Challenge 168
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc168;
+
+CREATE OR REPLACE FUNCTION
+pwc168.task2_prime_factors( n int )
+RETURNS SETOF int
+AS $CODE$
+DECLARE
+ i int;
+ p bool;
+BEGIN
+
+ FOR i IN 2 .. n - 1 LOOP
+ p := pwc168.is_prime( i );
+
+ IF p AND n % i = 0 THEN
+ WHILE n % i = 0 LOOP
+ n := n / i;
+ RETURN NEXT i;
+ END LOOP;
+ END IF;
+ END LOOP;
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+/*
+testdb=> select * from pwc168.task2_plpgsql( 10 );
+task2_plpgsql
+---------------
+773
+
+*/
+
+CREATE OR REPLACE FUNCTION
+pwc168.task2_plpgsql( n int DEFAULT 10 )
+RETURNS int
+AS $CODE$
+DECLARE
+ i int;
+ v text;
+ p bool;
+BEGIN
+ v = '0';
+ FOR i IN SELECT * FROM pwc168.task2_prime_factors( n ) LOOP
+ v := v || i;
+ END LOOP;
+
+
+ p := pwc168.is_prime( v::int );
+
+ WHILE NOT p LOOP
+ i := v::int;
+ v = '0';
+ FOR i IN SELECT * FROM pwc168.task2_prime_factors( i ) LOOP
+ v := v || i;
+ END LOOP;
+ p := pwc168.is_prime( v::int );
+ END LOOP;
+
+ RETURN v::int;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-168/luca-ferrari/raku/ch-1.p6 b/challenge-168/luca-ferrari/raku/ch-1.p6
new file mode 100755
index 0000000000..7059667b9b
--- /dev/null
+++ b/challenge-168/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,21 @@
+#!raku
+
+# Perl Weekly Challenge 168
+
+sub MAIN( Int $limit where { $limit > 1 } = 13 ) {
+
+ # this requires too much time!
+ # my @perrin = 3, 0, 2, -> $left, $right { $left + $right } ... *;
+ # my @perrin-primes = @perrin.grep( *.is-prime );
+ # @perrin-primes.unique.head( 3 ).join( "\n" ).say;
+
+ my @perrin = 3, 0, 2;
+ my @perrin-primes;
+
+ while ( @perrin-primes.elems < $limit ) {
+ @perrin.push: @perrin[ * - 2 ] + @perrin[ * - 3 ];
+ @perrin-primes.push: @perrin[ * - 1 ] if @perrin[ * - 1 ].is-prime && ! @perrin-primes.grep( @perrin[ * - 1 ] );
+ }
+
+ @perrin-primes.sort.join( "\n" ).say;
+}
diff --git a/challenge-168/luca-ferrari/raku/ch-2.p6 b/challenge-168/luca-ferrari/raku/ch-2.p6
new file mode 100755
index 0000000000..a19f99a7ca
--- /dev/null
+++ b/challenge-168/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,35 @@
+#!raku
+
+# Perl Weekly Challenge 168
+
+sub prime-factors( Int $n where { $n > 0 } )
+{
+ my $number = $n;
+ my @factors;
+ return $n if $n.is-prime;
+
+ for 2 ..^ $n {
+ next if ! $_.is-prime;
+ next if $number !%% $_;
+ next if $_ > $number;
+
+ while ( $number %% $_ ) {
+ @factors.push: $_;
+ $number /= $_;
+ }
+
+ }
+
+ return @factors;
+}
+
+sub HP( Int $n where { $n > 0 } )
+{
+ my $number = prime-factors( $n ).join.Int;
+ return $number if $number.is-prime;
+ return HP( $number );
+}
+
+sub MAIN( Int $n where { $n > 1 } = 10 ) {
+ say HP( $n );
+}