diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2022-06-13 13:30:29 +0200 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2022-06-13 13:30:29 +0200 |
| commit | 55afa949e1500760e2fbc96f9f980ae551b3a30a (patch) | |
| tree | 626e982aee8a59823c1b81cc547ff014a9cb0480 | |
| parent | 6c7d3c5db13041ff57c2b2cec74d065df218eb0f (diff) | |
| download | perlweeklychallenge-club-55afa949e1500760e2fbc96f9f980ae551b3a30a.tar.gz perlweeklychallenge-club-55afa949e1500760e2fbc96f9f980ae551b3a30a.tar.bz2 perlweeklychallenge-club-55afa949e1500760e2fbc96f9f980ae551b3a30a.zip | |
Task 2 done in plperl
| -rw-r--r-- | challenge-169/luca-ferrari/postgresql/ch-2.plperl | 74 |
1 files changed, 74 insertions, 0 deletions
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; |
