aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-159/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-159/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-159/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-159/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-159/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-159/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-159/luca-ferrari/postgresql/ch-1.plperl39
-rw-r--r--challenge-159/luca-ferrari/postgresql/ch-1.sql70
-rw-r--r--challenge-159/luca-ferrari/postgresql/ch-2.plperl57
-rw-r--r--challenge-159/luca-ferrari/postgresql/ch-2.sql43
-rwxr-xr-xchallenge-159/luca-ferrari/raku/ch-1.p616
-rwxr-xr-xchallenge-159/luca-ferrari/raku/ch-2.p630
12 files changed, 261 insertions, 0 deletions
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
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..1ebd6c5112
--- /dev/null
+++ b/challenge-159/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +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;
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;
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..d165df2fed
--- /dev/null
+++ b/challenge-159/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +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;
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 100755
index 0000000000..5f9a75537e
--- /dev/null
+++ b/challenge-159/luca-ferrari/raku/ch-2.p6
@@ -0,0 +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;
+
+}