From 419a75e0d3adf1af222938e20750cb6e60b36639 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 6 Jun 2022 10:15:06 +0200 Subject: Task 1 done --- challenge-168/luca-ferrari/raku/ch-1.p6 | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 challenge-168/luca-ferrari/raku/ch-1.p6 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; +} -- cgit From 77bfa9e18674bfaf4b56008dfdd7d7534411323c Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 6 Jun 2022 10:41:12 +0200 Subject: Task 2 done --- challenge-168/luca-ferrari/raku/ch-2.p6 | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 challenge-168/luca-ferrari/raku/ch-2.p6 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 ); +} -- cgit From 611da5f504c10b1526225254a81737fd2c513a2c Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 6 Jun 2022 13:07:46 +0200 Subject: Task 2 plperl done --- challenge-168/luca-ferrari/postgresql/ch-2.plperl | 52 +++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 challenge-168/luca-ferrari/postgresql/ch-2.plperl 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; -- cgit From d15943fd67cb4b91ebce5865524ec67d3db266a1 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 6 Jun 2022 14:15:21 +0200 Subject: Task 1 plperl done --- challenge-168/luca-ferrari/postgresql/ch-1.plperl | 40 +++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 challenge-168/luca-ferrari/postgresql/ch-1.plperl 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; -- cgit From 8aab0ee88dcc4da077724213a0f05743980ff57b Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 6 Jun 2022 14:15:34 +0200 Subject: Task 1 and 2 in plpgsql --- challenge-168/luca-ferrari/postgresql/ch-1.sql | 68 +++++++++++++++++++++++++ challenge-168/luca-ferrari/postgresql/ch-2.sql | 69 ++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 challenge-168/luca-ferrari/postgresql/ch-1.sql create mode 100644 challenge-168/luca-ferrari/postgresql/ch-2.sql 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.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; -- cgit From 8081d2dcb6e12129d204a1b5ddd5cad6d63062c1 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 6 Jun 2022 15:38:33 +0200 Subject: Blog references --- challenge-168/luca-ferrari/blog-1.txt | 1 + challenge-168/luca-ferrari/blog-2.txt | 1 + challenge-168/luca-ferrari/blog-3.txt | 1 + challenge-168/luca-ferrari/blog-4.txt | 1 + challenge-168/luca-ferrari/blog-5.txt | 1 + challenge-168/luca-ferrari/blog-6.txt | 1 + 6 files changed, 6 insertions(+) create mode 100644 challenge-168/luca-ferrari/blog-1.txt create mode 100644 challenge-168/luca-ferrari/blog-2.txt create mode 100644 challenge-168/luca-ferrari/blog-3.txt create mode 100644 challenge-168/luca-ferrari/blog-4.txt create mode 100644 challenge-168/luca-ferrari/blog-5.txt create mode 100644 challenge-168/luca-ferrari/blog-6.txt 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 -- cgit