aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-169/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-169/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-169/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-169/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-169/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-169/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-169/luca-ferrari/postgresql/ch-1.plperl54
-rw-r--r--challenge-169/luca-ferrari/postgresql/ch-1.sql98
-rw-r--r--challenge-169/luca-ferrari/postgresql/ch-2.plperl74
-rw-r--r--challenge-169/luca-ferrari/postgresql/ch-2.sql54
-rwxr-xr-xchallenge-169/luca-ferrari/raku/ch-1.p634
-rwxr-xr-xchallenge-169/luca-ferrari/raku/ch-2.p637
12 files changed, 357 insertions, 0 deletions
diff --git a/challenge-169/luca-ferrari/blog-1.txt b/challenge-169/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..08c1fb1f06
--- /dev/null
+++ b/challenge-169/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/13/PerlWeeklyChallenge169.html#task1
diff --git a/challenge-169/luca-ferrari/blog-2.txt b/challenge-169/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..c243b9281e
--- /dev/null
+++ b/challenge-169/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/13/PerlWeeklyChallenge169.html#task2
diff --git a/challenge-169/luca-ferrari/blog-3.txt b/challenge-169/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..3e35c6e5cd
--- /dev/null
+++ b/challenge-169/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/13/PerlWeeklyChallenge169.html#task1plperl
diff --git a/challenge-169/luca-ferrari/blog-4.txt b/challenge-169/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..4949b6092d
--- /dev/null
+++ b/challenge-169/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/13/PerlWeeklyChallenge169.html#task2plperl
diff --git a/challenge-169/luca-ferrari/blog-5.txt b/challenge-169/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..83424df191
--- /dev/null
+++ b/challenge-169/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/13/PerlWeeklyChallenge169.html#task1plpgsql
diff --git a/challenge-169/luca-ferrari/blog-6.txt b/challenge-169/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..bc9ad3649c
--- /dev/null
+++ b/challenge-169/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/06/13/PerlWeeklyChallenge169.html#task2plpgsql
diff --git a/challenge-169/luca-ferrari/postgresql/ch-1.plperl b/challenge-169/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..8610899ba2
--- /dev/null
+++ b/challenge-169/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,54 @@
+-- Perl Weekly Challenge 169
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc169;
+
+CREATE OR REPLACE FUNCTION
+pwc169.task1_plperl( int )
+RETURNS SETOF int
+AS $CODE$
+ my ($limit) = @_;
+
+ my $is_prime = sub {
+ my ($value) = @_;
+
+ for ( 2 .. $value - 1 ) {
+ return 0 if $value % $_ == 0;
+ }
+
+ return 1;
+ };
+
+ my $compute_factors = sub {
+ my ($value) = @_;
+ my @factors;
+
+ for ( 2 .. $value - 1 ) {
+ next if ! $is_prime->( $_ );
+
+ while ( $value % $_ == 0 ) {
+ push @factors, $_;
+ $value /= $_;
+ }
+ }
+
+ return @factors;
+ };
+
+
+ for ( 1 .. 9999999 ) {
+ my @factors = $compute_factors->( $_ );
+ elog( DEBUG, "Number $_ with factors " . join(',', @factors) );
+ next if ( @factors != 2 );
+ next if $factors[ 0 ] == $factors[ 1 ];
+ if ( length( $factors[ 0 ] ) == length( $factors[ 1 ] ) ) {
+ $limit--;
+ return_next( $_ );
+ }
+
+ last if ! $limit;
+ }
+
+ return undef;
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-169/luca-ferrari/postgresql/ch-1.sql b/challenge-169/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..a2d04d97dc
--- /dev/null
+++ b/challenge-169/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,98 @@
+-- Perl Weekly Challenge 169
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc169;
+
+CREATE OR REPLACE FUNCTION
+pwc169.is_prime( n int )
+RETURNS bool
+AS $CODE$
+DECLARE
+ i int;
+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
+pwc169.compute_factors( n int )
+RETURNS SETOF INT
+AS $CODE$
+DECLARE
+ i int;
+BEGIN
+
+ FOR i IN 2 .. ( n - 1 ) LOOP
+ IF NOT pwc169.is_prime( i ) THEN
+ CONTINUE;
+ END IF;
+
+ WHILE n % i = 0 LOOP
+ RETURN NEXT i;
+ n = n / i;
+ END LOOP;
+ END LOOP;
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION
+pwc169.task1_plpgsql( n int DEFAULT 20 )
+RETURNS SETOF INT
+AS $CODE$
+DECLARE
+ i int;
+ f int;
+ current_length int := 0;
+ current_count int := 0;
+ ok bool := false;
+ previous_f int := 0;
+BEGIN
+
+ FOR i IN 2 .. 100000 LOOP
+
+ current_length := 0;
+ current_count := 0;
+ ok := true;
+ previous_f := 0;
+
+ FOR f IN SELECT * FROM pwc169.compute_factors( i ) ORDER BY 1 LOOP
+
+ current_count := current_count + 1;
+ IF current_length = 0 THEN
+ current_length := length( f::text );
+ END IF;
+
+ IF length( f::text ) <> current_length OR current_count > 2 OR f = previous_f THEN
+ ok := false;
+ EXIT;
+ END IF;
+
+ previous_f := f;
+ END LOOP;
+
+ IF ok AND previous_f <> 0 THEN
+
+ RETURN NEXT i;
+ IF n = 0 THEN
+ RETURN;
+ END IF;
+ n := n - 1;
+ END IF;
+ END LOOP;
+
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-169/luca-ferrari/postgresql/ch-2.plperl b/challenge-169/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..580ce698b9
--- /dev/null
+++ b/challenge-169/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,74 @@
+-- Perl Weekly Challenge 169
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc169;
+
+CREATE OR REPLACE FUNCTION
+pwc169.task2_plperl( int )
+RETURNS SETOF int
+AS $CODE$
+ use Math::BigInt;
+
+
+ my ($limit) = @_;
+
+ my $is_prime = sub {
+ my ($value) = @_;
+
+ for ( 2 .. $value - 1 ) {
+ return 0 if $value % $_ == 0;
+ }
+
+ return 1;
+ };
+
+ my $compute_factors = sub {
+ my ($value) = @_;
+ my @factors;
+
+ for ( 2 .. $value - 1 ) {
+ next if ! $is_prime->( $_ );
+
+ while ( $value % $_ == 0 ) {
+ push @factors, $_;
+ $value /= $_;
+ }
+ }
+
+ return @factors;
+ };
+
+ my $min = sub {
+ my $found = shift @_;
+ for ( @_ ) {
+ $found = $_ if $_ < $found;
+ }
+
+ return $found;
+ };
+
+ my $is_achille = sub {
+ my ($number) = @_;
+ my $bag = {};
+
+ for ( $compute_factors->( $number ) ) {
+ $bag->{ $_ }++;
+ }
+
+ return $min->( values( %$bag ) ) >= 2 && Math::BigInt::bgcd( values( %$bag ) )->numify == 1;
+ };
+
+
+ for ( 1 .. 999999 ) {
+ if ( $is_achille->( $_ ) ) {
+ $limit--;
+ return_next( $_ );
+ }
+
+ last if ! $limit;
+ }
+
+ return undef;
+
+$CODE$
+LANGUAGE plperlu;
diff --git a/challenge-169/luca-ferrari/postgresql/ch-2.sql b/challenge-169/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..4c791bbab3
--- /dev/null
+++ b/challenge-169/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,54 @@
+-- Perl Weekly Challenge 169
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc169;
+
+CREATE OR REPLACE FUNCTION
+pwc169.task2_plpgsql( n int DEFAULT 20 )
+RETURNS SETOF INT
+AS $CODE$
+DECLARE
+ i int;
+ current_min int;
+ current_gcd int;
+ previous_gcd int;
+BEGIN
+
+ FOR i IN 1 .. 999999 LOOP
+
+ WITH bag AS (
+ SELECT f, count(*) AS counter
+ FROM pwc169.compute_factors( i ) f
+ GROUP BY f
+ )
+ SELECT min( counter )
+ INTO current_min
+ FROM bag
+ ;
+
+ IF current_min < 2 THEN
+ CONTINUE;
+ END IF;
+
+ previous_gcd := -1;
+ FOR current_gcd IN SELECT count(f) FROM pwc169.compute_factors( i ) f GROUP BY f LOOP
+ IF previous_gcd < 0 THEN
+ previous_gcd := current_gcd;
+ CONTINUE;
+ END IF;
+
+ previous_gcd := gcd( previous_gcd, current_gcd );
+ END LOOP;
+
+ IF previous_gcd = 1 THEN
+ RETURN NEXT i;
+ IF n = 0 THEN
+ RETURN;
+ END IF;
+ n := n - 1;
+ END IF;
+ END LOOP;
+RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-169/luca-ferrari/raku/ch-1.p6 b/challenge-169/luca-ferrari/raku/ch-1.p6
new file mode 100755
index 0000000000..5ce81cc39b
--- /dev/null
+++ b/challenge-169/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,34 @@
+#!raku
+
+# Perl Weekly Challenge 169
+
+sub is-brilliant( $num ) {
+ my $number = $num;
+
+ # get all the factors
+ my @factors;
+
+ for 2 ..^ $number {
+ next if ! $_.is-prime;
+
+ while ( $number %% $_ ) {
+ @factors.push: $_;
+ $number /= $_;
+ }
+ }
+
+ return False if @factors.elems != 2;
+ return False if @factors[0] == @factors[1];
+ return True if @factors[0].Str.chars == @factors[1].Str.chars;
+}
+
+
+sub MAIN( Int $limit where { $limit > 0 } = 20 ) {
+
+ my @brilliant = lazy gather {
+ take $_ if is-brilliant( $_ ) for 1 .. Inf;
+ };
+
+ @brilliant[ 0 .. $limit ].join( "\n" ).say;
+
+}
diff --git a/challenge-169/luca-ferrari/raku/ch-2.p6 b/challenge-169/luca-ferrari/raku/ch-2.p6
new file mode 100755
index 0000000000..9ecd90fee0
--- /dev/null
+++ b/challenge-169/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,37 @@
+#!raku
+
+# Perl Weekly Challenge 169
+
+sub compute-factors( $num ) {
+ my $number = $num;
+ my @factors;
+
+ for 2 ..^ $number {
+ next if ! $_.is-prime;
+
+ while ( $number %% $_ ) {
+ @factors.push: $_;
+ $number /= $_;
+ }
+ }
+
+ return @factors;
+}
+
+
+sub is-achille( $num )
+{
+ my Bag $bag = Bag.new: compute-factors( $num );
+ return False if $bag.keys.elems <= 1;
+ return $bag.values.min >= 2 && ( [gcd] $bag.values ) == 1;
+}
+
+sub MAIN( Int $limit where { $limit > 0 } = 20 ) {
+
+ my @achille = lazy gather {
+ take $_ if is-achille( $_ ) for 1 .. Inf;
+ };
+
+ @achille[ 0 .. $limit ].join( "\n" ).say;
+
+}