From 14dda6355b6f7ee3734a67fa17f126bfc32e7efd Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 09:41:59 +0200 Subject: Task 1 done --- challenge-159/luca-ferrari/raku/ch-1.p6 | 16 ++++++++++++++++ challenge-159/luca-ferrari/raku/ch-2.p6 | 2 ++ 2 files changed, 18 insertions(+) create mode 100755 challenge-159/luca-ferrari/raku/ch-1.p6 create mode 100644 challenge-159/luca-ferrari/raku/ch-2.p6 diff --git a/challenge-159/luca-ferrari/raku/ch-1.p6 b/challenge-159/luca-ferrari/raku/ch-1.p6 new file mode 100755 index 0000000000..e8a45c1b94 --- /dev/null +++ b/challenge-159/luca-ferrari/raku/ch-1.p6 @@ -0,0 +1,16 @@ +#!raku +# Perl Weekly Challenge 159 + + +sub MAIN( Int $n where { $n > 0 } ) { + my $start = 0/1.Rat; + my $end = 1/1.Rat; + + my @farey = $start, $end; + + for 2 .. $n -> $denominator { + @farey.push( |( 1 .. $denominator ).map: * / $denominator ); + } + + @farey.unique.sort.map( *.nude.join( '/' ) ).say; +} diff --git a/challenge-159/luca-ferrari/raku/ch-2.p6 b/challenge-159/luca-ferrari/raku/ch-2.p6 new file mode 100644 index 0000000000..4f7c3ef22b --- /dev/null +++ b/challenge-159/luca-ferrari/raku/ch-2.p6 @@ -0,0 +1,2 @@ +#!raku +# Perl Weekly Challenge 159 -- cgit From b736fb2f6a230c678badabac696aa77ac0d6c3e1 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 10:05:53 +0200 Subject: Task 2 done --- challenge-159/luca-ferrari/raku/ch-2.p6 | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) mode change 100644 => 100755 challenge-159/luca-ferrari/raku/ch-2.p6 diff --git a/challenge-159/luca-ferrari/raku/ch-2.p6 b/challenge-159/luca-ferrari/raku/ch-2.p6 old mode 100644 new mode 100755 index 4f7c3ef22b..5f9a75537e --- a/challenge-159/luca-ferrari/raku/ch-2.p6 +++ b/challenge-159/luca-ferrari/raku/ch-2.p6 @@ -1,2 +1,30 @@ #!raku # Perl Weekly Challenge 159 + +sub prime-factors( Int $n ) { + my $number = $n; + my @factors; + + my $factor = 2; + while ( $number > 1 && $factor <= $number ) { + if ( $number %% $factor ) { + @factors.push: $factor; + $number /= $factor; + } + else { + $factor++; + } + } + + return @factors; +} + + +sub MAIN( Int $n where { $n > 0 } ) { + + my @prime-factors = prime-factors( $n ); + '0'.say and exit if @prime-factors.elems != @prime-factors.unique.elems; + '1'.say and exit if @prime-factors.unique.elems %% 2; + '-1'.say and exit; + +} -- cgit From b91c8355370302f29a2380e43685737ff644b9f2 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 10:21:30 +0200 Subject: Task 1 done in Pl/Perl --- challenge-159/luca-ferrari/postgresql/ch-1.plperl | 39 +++++++++++++++++++++++ challenge-159/luca-ferrari/postgresql/ch-1.sql | 1 + challenge-159/luca-ferrari/postgresql/ch-2.sql | 1 + 3 files changed, 41 insertions(+) create mode 100644 challenge-159/luca-ferrari/postgresql/ch-1.plperl create mode 100644 challenge-159/luca-ferrari/postgresql/ch-1.sql create mode 100644 challenge-159/luca-ferrari/postgresql/ch-2.sql diff --git a/challenge-159/luca-ferrari/postgresql/ch-1.plperl b/challenge-159/luca-ferrari/postgresql/ch-1.plperl new file mode 100644 index 0000000000..f14fe72613 --- /dev/null +++ b/challenge-159/luca-ferrari/postgresql/ch-1.plperl @@ -0,0 +1,39 @@ +CREATE SCHEMA IF NOT EXISTS pwc159; + +CREATE OR REPLACE FUNCTION +pwc159.farey( int ) +RETURNS SETOF text +AS $CODE$ + my ($n) = @_; + + my %farey; + + for my $denominator ( 2 .. $n ) { + for my $number ( 1 .. $denominator ) { + + # reduce things like 2/4 to 1/2 + ( $denominator, $number ) /= $number if ( $denominator % $number == 0 ); + ( $denominator, $number ) /= $denominator if ( $number % $denominator == 0 ); + + $farey{ $number/$denominator } = "$number/$denominator"; + } + } + + # bootstrap + return_next( '0/1' ); + + my %unique_counter; + for my $key ( sort keys( %farey ) ) { + # ensure only one item is printed out + $unique_counter{ $key }++; + next if $unique_counter{ $key } > 1; + next if $key == 1; # last term in the sequence + + return_next( $farey{ $key } ); + } + + # end term + return_next( '1/1' ); + return undef; +$CODE$ +LANGUAGE plperl; diff --git a/challenge-159/luca-ferrari/postgresql/ch-1.sql b/challenge-159/luca-ferrari/postgresql/ch-1.sql new file mode 100644 index 0000000000..da8824c0c2 --- /dev/null +++ b/challenge-159/luca-ferrari/postgresql/ch-1.sql @@ -0,0 +1 @@ +-- Perl Weekly Challenge 159 diff --git a/challenge-159/luca-ferrari/postgresql/ch-2.sql b/challenge-159/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..da8824c0c2 --- /dev/null +++ b/challenge-159/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1 @@ +-- Perl Weekly Challenge 159 -- cgit From 8409efbb8a1f588f4bb1d0e4134cdc03b6c6d7f8 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 10:34:19 +0200 Subject: Task 1 done in plpgsql --- challenge-159/luca-ferrari/postgresql/ch-1.sql | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/challenge-159/luca-ferrari/postgresql/ch-1.sql b/challenge-159/luca-ferrari/postgresql/ch-1.sql index da8824c0c2..1ebd6c5112 100644 --- a/challenge-159/luca-ferrari/postgresql/ch-1.sql +++ b/challenge-159/luca-ferrari/postgresql/ch-1.sql @@ -1 +1,70 @@ -- Perl Weekly Challenge 159 + + +CREATE SCHEMA IF NOT EXISTS pwc159; + + +CREATE OR REPLACE FUNCTION +pwc159.farey_not_unique( n int ) +RETURNS TABLE( f text, v numeric ) +AS $CODE$ +DECLARE + numerator int; + denominator int; + dd int; + nn int; +BEGIN + + -- bootstrap term + SELECT '0/1', 0 + INTO f, v; + + RETURN NEXT; + + + FOR denominator IN 2 .. n LOOP + FOR numerator IN 1 .. denominator LOOP + nn := numerator; + dd := denominator; + + IF dd % nn = 0 THEN + dd := dd / nn; + nn := 1; + END IF; + + IF nn % dd = 0 THEN + nn := nn / dd; + dd := 1; + END IF; + + IF nn / dd = 1 THEN + CONTINUE; + END IF; + + SELECT nn || '/' || dd, nn/dd::numeric + INTO f, v; + + RETURN NEXT; + + END LOOP; + END LOOP; + + -- end term + SELECT '1/1', 1 + INTO f, v; + + RETURN NEXT; + +RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + +WITH farey AS ( + SELECT distinct( f ), v + FROM pwc159.farey_not_unique( 5 ) + ORDER BY v +) +SELECT f +FROM farey; -- cgit From afb541c10466df9d9ca45c17f3056fd11a016e47 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 10:53:44 +0200 Subject: Task 2 plperl --- challenge-159/luca-ferrari/postgresql/ch-2.plperl | 57 +++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 challenge-159/luca-ferrari/postgresql/ch-2.plperl diff --git a/challenge-159/luca-ferrari/postgresql/ch-2.plperl b/challenge-159/luca-ferrari/postgresql/ch-2.plperl new file mode 100644 index 0000000000..8dce608e5a --- /dev/null +++ b/challenge-159/luca-ferrari/postgresql/ch-2.plperl @@ -0,0 +1,57 @@ +CREATE SCHEMA IF NOT EXISTS pwc159; + +/** +testdb=> select pwc159.mobius( 5 ); + mobius +-------- + -1 +(1 row) + +*/ +CREATE OR REPLACE FUNCTION +pwc159.mobius( int ) +RETURNS int +AS $CODE$ + + my ( $n ) = @_; + + # a routine to compute the prime + # factors of the given number + my $prime_factors = sub { + my ( $number ) = @_; + my %factors; + + my $factor = 2; + while ( $number > 1 && $factor <= $number ) { + if ( $number % $factor == 0 ) { + $factors{ $factor }++; + $number /= $factor; + } + else { + $factor++; + } + } + + return %factors; + }; + + + my %prime_factors = $prime_factors->( $n ); + + # to get the unique prime factors I have to "count" + # them only once per key + my @unique_prime_factors; + my $occurrencies_prime_factors = 0; + for ( keys %prime_factors ) { + push @unique_prime_factors, $_; + $occurrencies_prime_factors += $prime_factors{ $_ }; + } + + + return 0 if @unique_prime_factors != $occurrencies_prime_factors; + return 1 if @unique_prime_factors % 2 == 0; + return -1; + + +$CODE$ +LANGUAGE plperl; -- cgit From d6c45c1e8fbd72ec613baff00a8214a270f3f6cb Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 11:06:28 +0200 Subject: Task 2 done in plpgsql --- challenge-159/luca-ferrari/postgresql/ch-2.sql | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/challenge-159/luca-ferrari/postgresql/ch-2.sql b/challenge-159/luca-ferrari/postgresql/ch-2.sql index da8824c0c2..d165df2fed 100644 --- a/challenge-159/luca-ferrari/postgresql/ch-2.sql +++ b/challenge-159/luca-ferrari/postgresql/ch-2.sql @@ -1 +1,43 @@ -- Perl Weekly Challenge 159 + +CREATE SCHEMA IF NOT EXISTS pwc159; + +CREATE OR REPLACE FUNCTION +pwc159.prime_factors( n int ) +RETURNS SETOF int +AS $CODE$ +DECLARE + factor int; +BEGIN + factor := 2; + + WHILE ( factor <= n AND n > 1 ) LOOP + IF n % factor = 0 THEN + n := n / factor; + RETURN NEXT factor; + ELSE + factor := factor + 1; + END IF; + END LOOP; + + RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + +\set n 5 + +WITH count_prime_factors( c, cc ) AS +( + SELECT count( distinct pf ), count( pf ) + FROM pwc159.prime_factors( :n ) pf +) +SELECT :n AS number, + CASE + WHEN c - cc <> 0 THEN 0 + WHEN c % 2 = 0 THEN 1 + ELSE -1 + END + +FROM count_prime_factors; -- cgit From 593f633c0d938cf962a5ffd4c99e4ed08acb9b99 Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 4 Apr 2022 11:51:35 +0200 Subject: Blog references --- challenge-159/luca-ferrari/blog-1.txt | 1 + challenge-159/luca-ferrari/blog-2.txt | 1 + challenge-159/luca-ferrari/blog-3.txt | 1 + challenge-159/luca-ferrari/blog-4.txt | 1 + challenge-159/luca-ferrari/blog-5.txt | 1 + challenge-159/luca-ferrari/blog-6.txt | 1 + 6 files changed, 6 insertions(+) create mode 100644 challenge-159/luca-ferrari/blog-1.txt create mode 100644 challenge-159/luca-ferrari/blog-2.txt create mode 100644 challenge-159/luca-ferrari/blog-3.txt create mode 100644 challenge-159/luca-ferrari/blog-4.txt create mode 100644 challenge-159/luca-ferrari/blog-5.txt create mode 100644 challenge-159/luca-ferrari/blog-6.txt diff --git a/challenge-159/luca-ferrari/blog-1.txt b/challenge-159/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..adc4af027c --- /dev/null +++ b/challenge-159/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/04/04/PerlWeeklyChallenge159.html#task1 diff --git a/challenge-159/luca-ferrari/blog-2.txt b/challenge-159/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..970839190a --- /dev/null +++ b/challenge-159/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/04/04/PerlWeeklyChallenge159.html#task2 diff --git a/challenge-159/luca-ferrari/blog-3.txt b/challenge-159/luca-ferrari/blog-3.txt new file mode 100644 index 0000000000..a94ecf67bb --- /dev/null +++ b/challenge-159/luca-ferrari/blog-3.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/04/04/PerlWeeklyChallenge159.html#task1plperl diff --git a/challenge-159/luca-ferrari/blog-4.txt b/challenge-159/luca-ferrari/blog-4.txt new file mode 100644 index 0000000000..5b29fd9d65 --- /dev/null +++ b/challenge-159/luca-ferrari/blog-4.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/04/04/PerlWeeklyChallenge159.html#task2plperl diff --git a/challenge-159/luca-ferrari/blog-5.txt b/challenge-159/luca-ferrari/blog-5.txt new file mode 100644 index 0000000000..41f44f9511 --- /dev/null +++ b/challenge-159/luca-ferrari/blog-5.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/04/04/PerlWeeklyChallenge159.html#task1plpgsql diff --git a/challenge-159/luca-ferrari/blog-6.txt b/challenge-159/luca-ferrari/blog-6.txt new file mode 100644 index 0000000000..f955882f6d --- /dev/null +++ b/challenge-159/luca-ferrari/blog-6.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/04/04/PerlWeeklyChallenge159.html#task2plpgsql -- cgit