diff options
| author | drbaggy <js5@sanger.ac.uk> | 2022-06-07 13:50:49 +0100 |
|---|---|---|
| committer | drbaggy <js5@sanger.ac.uk> | 2022-06-07 13:50:49 +0100 |
| commit | 26c48d1d97f7882cfd69edea26b78cf7a5095b69 (patch) | |
| tree | b761863c543dac609a7404b524d7cc997d19de6d | |
| parent | 8788ff5949846c60508766c5c407fde159e832d3 (diff) | |
| parent | 031fbe8a0c7289a18eb966600fe424891d7875e1 (diff) | |
| download | perlweeklychallenge-club-26c48d1d97f7882cfd69edea26b78cf7a5095b69.tar.gz perlweeklychallenge-club-26c48d1d97f7882cfd69edea26b78cf7a5095b69.tar.bz2 perlweeklychallenge-club-26c48d1d97f7882cfd69edea26b78cf7a5095b69.zip | |
Merge remote-tracking branch 'upstream/master'
67 files changed, 4632 insertions, 2106 deletions
diff --git a/challenge-167/adam-russell/perl/ch-1.pl b/challenge-167/adam-russell/perl/ch-1.pl index 7dda485fdc..4bfd74d9ac 100644 --- a/challenge-167/adam-russell/perl/ch-1.pl +++ b/challenge-167/adam-russell/perl/ch-1.pl @@ -7,13 +7,16 @@ use boolean; use Math::Primality qw/is_prime/; sub is_circular_prime{ - my($x) = @_; + my($x, $circular) = @_; my @digits = split(//, $x); + my @rotations; for my $i (0 .. @digits - 1){ @digits = (@digits[1 .. @digits - 1], $digits[0]); my $candidate = join("", @digits) + 0; + push @rotations, $candidate; return false if !is_prime($candidate); } + map{$circular->{$_} = -1} @rotations; return true; } @@ -23,9 +26,8 @@ sub first_n_circular_primes{ my %circular; my @circular_primes; { - if(is_circular_prime($i) && !$circular{join("", sort {$a <=> $b} split(//, $i))}){ + if(!$circular{$i} && is_circular_prime($i, \%circular)){ push @circular_primes, $i; - $circular{join("", sort {$a <=> $b} split(//, $i))} = -1; } $i++; redo if @circular_primes < $n; diff --git a/challenge-167/adam-russell/perl/ch-2.pl b/challenge-167/adam-russell/perl/ch-2.pl index ba38e6c0dd..6b2214bb1c 100644 --- a/challenge-167/adam-russell/perl/ch-2.pl +++ b/challenge-167/adam-russell/perl/ch-2.pl @@ -34,7 +34,7 @@ sub gamma{ } MAIN:{ - print gamma(3) . "\n"; - print gamma(5) . "\n"; - print gamma(7) . "\n"; + printf("%.2f\n",gamma(3)); + printf("%.2f\n",gamma(5)); + printf("%.2f\n",gamma(7)); }
\ No newline at end of file diff --git a/challenge-167/jaldhar-h-vyas/blog.txt b/challenge-167/jaldhar-h-vyas/blog.txt new file mode 100644 index 0000000000..401873b45e --- /dev/null +++ b/challenge-167/jaldhar-h-vyas/blog.txt @@ -0,0 +1 @@ +https://www.braincells.com/perl/2022/06/perl_weekly_challenge_week_167.html
\ No newline at end of file diff --git a/challenge-167/jaldhar-h-vyas/perl/ch-1.pl b/challenge-167/jaldhar-h-vyas/perl/ch-1.pl new file mode 100755 index 0000000000..1f5b9007a9 --- /dev/null +++ b/challenge-167/jaldhar-h-vyas/perl/ch-1.pl @@ -0,0 +1,46 @@ +#!/usr/bin/perl +use 5.030; +use warnings; + +sub isPrime { + my ($n) = @_; + + if ($n < 2) { + return undef; + } + + if ($n == 2) { + return 1; + } + + for my $i (2 .. sqrt($n)) { + if ($n % $i == 0) { + return undef; + } + } + + return 1; +} + +my @circularPrimes; +my $n = 99; + +outer: while (scalar @circularPrimes < 10) { + $n++; + + unless ($n =~ /^[1379]+$/) { + next; + } + + my $rotated = $n; + for (0 .. length $n) { + unless (isPrime($rotated) && ! grep { $_ == $rotated } @circularPrimes) { + next outer; + } + + $rotated = substr($rotated, 1) . substr($rotated, 0, 1); + } + push @circularPrimes, $n; +} + +say join q{, }, @circularPrimes; diff --git a/challenge-167/jaldhar-h-vyas/perl/ch-2.pl b/challenge-167/jaldhar-h-vyas/perl/ch-2.pl new file mode 100755 index 0000000000..de90de30ea --- /dev/null +++ b/challenge-167/jaldhar-h-vyas/perl/ch-2.pl @@ -0,0 +1,49 @@ +#!/usr/bin/perl +use 5.030; +use warnings; +use utf8; +use Math::Complex qw/ Im Re pi /; +use Math::Round qw/ nearest /; +use constant ε => 1e-7; + +sub dropImaginary { + my ($z) = @_; + + if (abs(Im($z)) < ε) { + $z = Re($z); + } + + return $z; +} + +sub Γ { + my ($z) = @_; + $z = Math::Complex->new($z); + + if (Re($z) < .5) { + return pi / sin(pi * $z) / Γ(1 - $z); + } else { + my @coefficients = qw/ + 676.5203681218851 + -1259.1392167224028 + 771.32342877765313 + -176.61502916214059 + 12.507343278686905 + -0.13857109526572012 + 9.9843695780195716e-6 + 1.5056327351493116e-7 + /; + $z -= 1; + my $sum = 0.99999999999980993; + my $i = 0; + for my $c (@coefficients) { + $sum += $c / ($z + 1 + $i++); + } + my $t = $z + scalar @coefficients - 0.5; + return dropImaginary(sqrt(2 * pi) * $t ** ($z + 0.5) * exp(-$t) * $sum); + } +} + +for my $i (3, 5, 7) { + say nearest(0.01, Γ($i)); +} diff --git a/challenge-167/jaldhar-h-vyas/raku/ch-1.raku b/challenge-167/jaldhar-h-vyas/raku/ch-1.raku new file mode 100755 index 0000000000..90f8adb86b --- /dev/null +++ b/challenge-167/jaldhar-h-vyas/raku/ch-1.raku @@ -0,0 +1,26 @@ +#!/usr/bin/raku + +sub MAIN() { + my @circularPrimes; + my $n = 99; + + outer: while @circularPrimes.elems < 10 { + $n++; + + unless $n ~~ /^ <[1379]>+ $/ { + next; + } + + my $rotated = $n; + for 0 ..^ $n.chars { + unless $rotated.is-prime && $rotated.Int ∉ @circularPrimes { + next outer; + } + + $rotated = $rotated.substr(1 .. *) ~ $rotated.substr(0, 1); + } + @circularPrimes.push($n); + } + + @circularPrimes.join(q{, }).say; +}
\ No newline at end of file diff --git a/challenge-167/jaldhar-h-vyas/raku/ch-2.raku b/challenge-167/jaldhar-h-vyas/raku/ch-2.raku new file mode 100755 index 0000000000..add7e1e8bd --- /dev/null +++ b/challenge-167/jaldhar-h-vyas/raku/ch-2.raku @@ -0,0 +1,45 @@ +#!/usr/bin/raku + +sub Γ(Real $n) { + my $z = Complex.new($n, 0); + + if $z.re < 0.5 { + return pi / sin(pi * $z) / Γ(1 - $z); + } else { + my @coefficients = < + 676.5203681218851 + -1259.1392167224028 + 771.32342877765313 + -176.61502916214059 + 12.507343278686905 + -0.13857109526572012 + 9.9843695780195716e-6 + 1.5056327351493116e-7 + >; + $z -= 1; + my $sum = 0.99999999999980993; + my $i = 0; + for @coefficients -> $c { + $sum += $c / ($z + 1 + $i++); + } + my $t = $z + @coefficients.elems - 0.5; + return dropImaginary(sqrt(2 * pi) * $t ** ($z + 0.5) * exp(-$t) * $sum); + } +} + +sub dropImaginary(Complex $n) { + constant ε = 1e-7; + my $z = $n; + + if $z.im.abs < ε { + $z = $z.re; + } + + return $z; +} + +sub MAIN() { + for (3, 5, 7) -> $i { + say Γ($i).round(0.01); + } +}
\ No newline at end of file diff --git a/challenge-168/luca-ferrari/blog-1.txt b/challenge-168/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..2b0b3a1caa --- /dev/null +++ b/challenge-168/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1 diff --git a/challenge-168/luca-ferrari/blog-2.txt b/challenge-168/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..a3ce243b5c --- /dev/null +++ b/challenge-168/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2 diff --git a/challenge-168/luca-ferrari/blog-3.txt b/challenge-168/luca-ferrari/blog-3.txt new file mode 100644 index 0000000000..e600750e8c --- /dev/null +++ b/challenge-168/luca-ferrari/blog-3.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1plperl diff --git a/challenge-168/luca-ferrari/blog-4.txt b/challenge-168/luca-ferrari/blog-4.txt new file mode 100644 index 0000000000..1423018e36 --- /dev/null +++ b/challenge-168/luca-ferrari/blog-4.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2plperl diff --git a/challenge-168/luca-ferrari/blog-5.txt b/challenge-168/luca-ferrari/blog-5.txt new file mode 100644 index 0000000000..79cafaf9e2 --- /dev/null +++ b/challenge-168/luca-ferrari/blog-5.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task1plpgsql diff --git a/challenge-168/luca-ferrari/blog-6.txt b/challenge-168/luca-ferrari/blog-6.txt new file mode 100644 index 0000000000..65410b3ae8 --- /dev/null +++ b/challenge-168/luca-ferrari/blog-6.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2022/06/06/PerlWeeklyChallenge168.html#task2plpgsql diff --git a/challenge-168/luca-ferrari/postgresql/ch-1.plperl b/challenge-168/luca-ferrari/postgresql/ch-1.plperl new file mode 100644 index 0000000000..585589ec97 --- /dev/null +++ b/challenge-168/luca-ferrari/postgresql/ch-1.plperl @@ -0,0 +1,40 @@ +-- Perl Weekly Challenge 168 +-- Task 1 + +CREATE SCHEMA IF NOT EXISTS pwc168; + +CREATE OR REPLACE FUNCTION +pwc168.task1_plperl( int ) +RETURNS SETOF bigint +AS $CODE$ + my ( $limit ) = @_; + $limit //= 13; + my @perrin = (3, 0, 2); + my $seen = {}; + + my $is_prime = sub { + my ( $number ) = @_; + + for ( 2 .. $number - 1 ) { + return undef if $number % $_ == 0; + } + + return 1; + }; + + while ( $limit > 0 ) { + my $current = $perrin[ -2 ] + $perrin[ -3 ]; + elog( DEBUG, "Limit $n and current is $current" ); + push @perrin, $current; + next if ! $is_prime->( $current ); + next if $seen->{ $current }; + + # found! + $seen->{ $current }++; + return_next( $current ); + $limit--; + } + +return undef; +$CODE$ +LANGUAGE plperl; diff --git a/challenge-168/luca-ferrari/postgresql/ch-1.sql b/challenge-168/luca-ferrari/postgresql/ch-1.sql new file mode 100644 index 0000000000..96bda1b3c5 --- /dev/null +++ b/challenge-168/luca-ferrari/postgresql/ch-1.sql @@ -0,0 +1,68 @@ +-- Perl Weekly Challenge 168 +-- Task 1 + +CREATE SCHEMA IF NOT EXISTS pwc168; + +CREATE OR REPLACE FUNCTION +pwc168.is_prime( n bigint ) +RETURNS bool +AS $CODE$ +DECLARE + i bigint; +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 +pwc168.task1_plpgsql( l bigint default 5000 ) +RETURNS SETOF BIGINT +AS $CODE$ +DECLARE + a bigint; + b bigint; + c bigint; + d bigint; +BEGIN + -- bootstrap + a := 3; + b := 0; + c := 2; + + RETURN NEXT a; + RETURN NEXT b; + RETURN NEXT c; + + WHILE l > 0 LOOP + d := a + b; + a := b; + b := c; + c := d; + + RAISE INFO 'Level % value %', l, c; + RETURN NEXT c; + l := l - 1; + END LOOP; + + +RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + +-- use more than 50 to get all the numbers +-- BUT THIS CAN BE VERY SLOW from 70 and beyond! +SELECT DISTINCT n +FROM pwc168.task1_plpgsql( 50 ) n +WHERE pwc168.is_prime( n ) +ORDER BY 1 +LIMIT 13; diff --git a/challenge-168/luca-ferrari/postgresql/ch-2.plperl b/challenge-168/luca-ferrari/postgresql/ch-2.plperl new file mode 100644 index 0000000000..e150136c3e --- /dev/null +++ b/challenge-168/luca-ferrari/postgresql/ch-2.plperl @@ -0,0 +1,52 @@ +-- Perl Weekly Challenge 168 +-- Task 2 + +CREATE SCHEMA IF NOT EXISTS pwc168; + +CREATE OR REPLACE FUNCTION +pwc168.task2_plperl( int ) +RETURNS int +AS $CODE$ + +my ( $value ) = @_; + +my $is_prime = sub { + my ( $number ) = @_; + + for ( 2 .. $number - 1 ) { + return 0 if ( $number % $_ == 0 ); + } + + return 1; +}; + +my $prime_factors = sub { + my ( $number ) = @_; + my @factors; + + return if $is_prime->( $number ); + + for ( 2 .. $number - 1 ) { + next if ! $is_prime->( $_ ); + next if $number % $_ != 0; + next if $_ > $number; + + while ( ( $number % $_ ) == 0 ) { + push @factors, $_; + $number /= $_; + } + } + + return @factors; +}; + + +my $value = join( '', $prime_factors->( $value ) ); +while ( ! $is_prime->( $value ) ) { + $value = join( '', $prime_factors->( $value ) ); +} + +return $value; + +$CODE$ +LANGUAGE plperl; diff --git a/challenge-168/luca-ferrari/postgresql/ch-2.sql b/challenge-168/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..c0bffbf930 --- /dev/null +++ b/challenge-168/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1,69 @@ +-- Perl Weekly Challenge 168 +-- Task 2 + +CREATE SCHEMA IF NOT EXISTS pwc168; + +CREATE OR REPLACE FUNCTION +pwc168.task2_prime_factors( n int ) +RETURNS SETOF int +AS $CODE$ +DECLARE + i int; + p bool; +BEGIN + + FOR i IN 2 .. n - 1 LOOP + p := pwc168.is_prime( i ); + + IF p AND n % i = 0 THEN + WHILE n % i = 0 LOOP + n := n / i; + RETURN NEXT i; + END LOOP; + END IF; + END LOOP; + +RETURN; +END +$CODE$ +LANGUAGE plpgsql; + + +/* +testdb=> select * from pwc168.task2_plpgsql( 10 ); +task2_plpgsql +--------------- +773 + +*/ + +CREATE OR REPLACE FUNCTION +pwc168.task2_plpgsql( n int DEFAULT 10 ) +RETURNS int +AS $CODE$ +DECLARE + i int; + v text; + p bool; +BEGIN + v = '0'; + FOR i IN SELECT * FROM pwc168.task2_prime_factors( n ) LOOP + v := v || i; + END LOOP; + + + p := pwc168.is_prime( v::int ); + + WHILE NOT p LOOP + i := v::int; + v = '0'; + FOR i IN SELECT * FROM pwc168.task2_prime_factors( i ) LOOP + v := v || i; + END LOOP; + p := pwc168.is_prime( v::int ); + END LOOP; + + RETURN v::int; +END +$CODE$ +LANGUAGE plpgsql; diff --git a/challenge-168/luca-ferrari/raku/ch-1.p6 b/challenge-168/luca-ferrari/raku/ch-1.p6 new file mode 100755 index 0000000000..7059667b9b --- /dev/null +++ b/challenge-168/luca-ferrari/raku/ch-1.p6 @@ -0,0 +1,21 @@ +#!raku + +# Perl Weekly Challenge 168 + +sub MAIN( Int $limit where { $limit > 1 } = 13 ) { + |
