diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-12-21 15:59:40 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-21 15:59:40 +0000 |
| commit | 9b3d7a11e563e32c66262e90014e8f2747022b55 (patch) | |
| tree | 995c0a9bf39f9b53dbae6699f0adf56eda5b6bc7 | |
| parent | 0749fdf8d822e65657c7002a148a6dceb2741143 (diff) | |
| parent | 236b5d9862f583749e7d27f0272e1dd6230d1c51 (diff) | |
| download | perlweeklychallenge-club-9b3d7a11e563e32c66262e90014e8f2747022b55.tar.gz perlweeklychallenge-club-9b3d7a11e563e32c66262e90014e8f2747022b55.tar.bz2 perlweeklychallenge-club-9b3d7a11e563e32c66262e90014e8f2747022b55.zip | |
Merge pull request #5396 from fluca1978/PWC144
Pwc144
| -rw-r--r-- | challenge-144/luca-ferrari/blog-1.txt | 1 | ||||
| -rw-r--r-- | challenge-144/luca-ferrari/blog-2.txt | 1 | ||||
| -rw-r--r-- | challenge-144/luca-ferrari/blog-3.txt | 1 | ||||
| -rw-r--r-- | challenge-144/luca-ferrari/blog-4.txt | 1 | ||||
| -rw-r--r-- | challenge-144/luca-ferrari/postgresql/ch-1.sql | 71 | ||||
| -rw-r--r-- | challenge-144/luca-ferrari/postgresql/ch-2.sql | 52 | ||||
| -rwxr-xr-x | challenge-144/luca-ferrari/raku/ch-1.p6 | 21 | ||||
| -rwxr-xr-x | challenge-144/luca-ferrari/raku/ch-2.p6 | 40 |
8 files changed, 188 insertions, 0 deletions
diff --git a/challenge-144/luca-ferrari/blog-1.txt b/challenge-144/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..439af3081a --- /dev/null +++ b/challenge-144/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2021/12/20/PerlWeeklyChallenge144.html#task1 diff --git a/challenge-144/luca-ferrari/blog-2.txt b/challenge-144/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..80ac3eb036 --- /dev/null +++ b/challenge-144/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2021/12/20/PerlWeeklyChallenge144.html#task2 diff --git a/challenge-144/luca-ferrari/blog-3.txt b/challenge-144/luca-ferrari/blog-3.txt new file mode 100644 index 0000000000..409920a331 --- /dev/null +++ b/challenge-144/luca-ferrari/blog-3.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2021/12/20/PerlWeeklyChallenge144.html#task1pg diff --git a/challenge-144/luca-ferrari/blog-4.txt b/challenge-144/luca-ferrari/blog-4.txt new file mode 100644 index 0000000000..409920a331 --- /dev/null +++ b/challenge-144/luca-ferrari/blog-4.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2021/12/20/PerlWeeklyChallenge144.html#task1pg diff --git a/challenge-144/luca-ferrari/postgresql/ch-1.sql b/challenge-144/luca-ferrari/postgresql/ch-1.sql new file mode 100644 index 0000000000..c8d7264e7c --- /dev/null +++ b/challenge-144/luca-ferrari/postgresql/ch-1.sql @@ -0,0 +1,71 @@ +/* + * Check if the current number is prime + */ +CREATE OR REPLACE FUNCTION f_is_prime( n int ) +RETURNS bool +AS $CODE$ +DECLARE + divisor int; +BEGIN + FOR divisor IN 2 .. ( n - 1 ) LOOP + IF mod( n, divisor ) = 0 THEN + RETURN false; + END IF; + END LOOP; + + RETURN TRUE; +END +$CODE$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION f_semiprime_factors( n int ) +RETURNS SETOF int +AS $CODE$ +DECLARE + current_number int; +BEGIN + FOR current_number IN 1 .. n LOOP + IF f_is_prime( current_number ) AND mod( n, current_number ) = 0 AND f_is_prime( ( n / current_number ) ) THEN + RETURN NEXT current_number; + END IF; + END LOOP; + + RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + + +CREATE OR REPLACE FUNCTION f_is_semiprime( n int ) +RETURNS bool +AS $CODE$ + SELECT CASE count( * ) + WHEN 0 THEN false + ELSE true + END + FROM f_semiprime_factors( n ) s; +$CODE$ +LANGUAGE sql; + + + +CREATE OR REPLACE FUNCTION f_find_semiprimes( lim int default 100 ) +RETURNS SETOF int +AS $CODE$ +DECLARE + n int; +BEGIN + n := 1; + + WHILE n < lim LOOP + IF f_is_semiprime( n ) THEN + RETURN NEXT n; + END IF; + n := n + 1; + END LOOP; + + RETURN; +END +$CODE$ +LANGUAGE plpgsql; diff --git a/challenge-144/luca-ferrari/postgresql/ch-2.sql b/challenge-144/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..0fa2b07521 --- /dev/null +++ b/challenge-144/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1,52 @@ +CREATE OR REPLACE FUNCTION f_ulam_do_sum( ulam int[] ) +RETURNS SETOF int +AS $CODE$ +DECLARE + left_index int; + right_index int; +BEGIN + + FOR left_index IN 1 .. array_length( ulam, 1 ) LOOP + FOR right_index IN left_index + 1 .. array_length( ulam, 1 ) LOOP + RETURN NEXT ulam[ left_index ] + ulam[ right_index ]; + END LOOP; + END LOOP; + + RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION f_ulam( u int, v int, lim int default 10 ) +RETURNS int[] +AS $CODE$ +DECLARE + ulam int[]; + next_value int; +BEGIN +-- PERFORM array_append( ulam, u ); +-- PERFORM array_append( ulam, v ); +-- PERFORM array_append( ulam, u + v ); + + + ulam := ulam || u || v || u + v; + + WHILE array_length( ulam, 1 ) < lim LOOP + + SELECT vv + INTO next_value + FROM f_ulam_do_sum( ulam ) AS sums( vv ) + WHERE vv > ulam[ array_length( ulam, 1 ) ] + GROUP BY 1 + HAVING COUNT( * ) = 1 + ORDER BY vv + LIMIT 1; + + ulam := ulam || next_value; + END LOOP; + + RETURN ulam; +END +$CODE$ +LANGUAGE plpgsql; diff --git a/challenge-144/luca-ferrari/raku/ch-1.p6 b/challenge-144/luca-ferrari/raku/ch-1.p6 new file mode 100755 index 0000000000..70462d1747 --- /dev/null +++ b/challenge-144/luca-ferrari/raku/ch-1.p6 @@ -0,0 +1,21 @@ +#!raku + +sub MAIN( Int $limit where { $limit > 1 } = 100 ) { + my @semi-primes; + + for 1 .. $limit -> $current-number { + @semi-primes.push: $current-number if ( 1 .. $current-number ).grep( { $_.is-prime + && $current-number %% $_ + && ( $current-number / $_ ).Int.is-prime } ) + .elems > 0; + # for 1 .. $current-number -> $current-divisor { + # next if ! $current-divisor.is-prime; + # next if $current-number !%% $current-divisor; + # next if ! ( $current-number / $current-divisor ).Int.is-prime; + # @semi-primes.push: $current-number; + # last; + # } + } + + @semi-primes.join( ',' ).say; +} diff --git a/challenge-144/luca-ferrari/raku/ch-2.p6 b/challenge-144/luca-ferrari/raku/ch-2.p6 new file mode 100755 index 0000000000..68ed1b9ebe --- /dev/null +++ b/challenge-144/luca-ferrari/raku/ch-2.p6 @@ -0,0 +1,40 @@ +#!raku + +# Sums all the couple of numbers +# in only direction, skipping the duplicated +# values +sub do-sum( @array ) { + my %sums; + + for 0 .. @array.end -> $index-left { + for $index-left ^.. @array.end -> $index-right { + next if $index-left == $index-right; + + %sums{ @array[ $index-left ] + @array[ $index-right ] }++; + } + } + + + my @found; + @found.push: $_.Int if %sums{ $_ } == 1 for %sums.keys; + @found; + +} + + +sub MAIN( Int $u where { $u > 0 }, + Int $v where { $v > 0 }, + Int $limit = 10 ) { + + + + my @ulam = $u, $v, $u + $v; + + while @ulam.elems < $limit { + @ulam.push: do-sum( @ulam ).grep( { $_ > @ulam[ * - 1 ] } ).min; + } + + + @ulam.join( ',' ).say; + +} |
