diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-06-13 20:40:00 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-13 20:40:00 +0100 |
| commit | 05df90f772a672ccb03acb89ea687a81dc4b3ce0 (patch) | |
| tree | 5095bfb8045e57172211b8ffb1b09b5b48de6fbc | |
| parent | e1d4db40649f017121882a98e051bc07d68d55d5 (diff) | |
| parent | 17295d1bd9106d746e40edfe329c6f555b642c78 (diff) | |
| download | perlweeklychallenge-club-05df90f772a672ccb03acb89ea687a81dc4b3ce0.tar.gz perlweeklychallenge-club-05df90f772a672ccb03acb89ea687a81dc4b3ce0.tar.bz2 perlweeklychallenge-club-05df90f772a672ccb03acb89ea687a81dc4b3ce0.zip | |
Merge pull request #6259 from fluca1978/PWC169
Pwc169
| -rw-r--r-- | challenge-169/luca-ferrari/blog-1.txt | 1 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/blog-2.txt | 1 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/blog-3.txt | 1 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/blog-4.txt | 1 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/blog-5.txt | 1 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/blog-6.txt | 1 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/postgresql/ch-1.plperl | 54 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/postgresql/ch-1.sql | 98 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/postgresql/ch-2.plperl | 74 | ||||
| -rw-r--r-- | challenge-169/luca-ferrari/postgresql/ch-2.sql | 54 | ||||
| -rwxr-xr-x | challenge-169/luca-ferrari/raku/ch-1.p6 | 34 | ||||
| -rwxr-xr-x | challenge-169/luca-ferrari/raku/ch-2.p6 | 37 |
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; + +} |
