diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2022-03-17 12:16:00 +0100 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2022-03-17 12:16:00 +0100 |
| commit | 7ea0f8c6a3a7eb5081143d153254b309cee19961 (patch) | |
| tree | 9b128324d1662544770d50d9e6ff5ab9509e8107 | |
| parent | a82c4ec967f1060377070b4cde901bef0d2e1d18 (diff) | |
| download | perlweeklychallenge-club-7ea0f8c6a3a7eb5081143d153254b309cee19961.tar.gz perlweeklychallenge-club-7ea0f8c6a3a7eb5081143d153254b309cee19961.tar.bz2 perlweeklychallenge-club-7ea0f8c6a3a7eb5081143d153254b309cee19961.zip | |
Task 1 and 2 done in Pl/Perl
| -rw-r--r-- | challenge-156/luca-ferrari/postgresql/ch-1.sql | 35 | ||||
| -rw-r--r-- | challenge-156/luca-ferrari/postgresql/ch-2.sql | 48 |
2 files changed, 83 insertions, 0 deletions
diff --git a/challenge-156/luca-ferrari/postgresql/ch-1.sql b/challenge-156/luca-ferrari/postgresql/ch-1.sql new file mode 100644 index 0000000000..70a4513be3 --- /dev/null +++ b/challenge-156/luca-ferrari/postgresql/ch-1.sql @@ -0,0 +1,35 @@ +CREATE SCHEMA IF NOT EXISTS pwc156; + +CREATE OR REPLACE FUNCTION +pwc156.is_prime( int ) +RETURNS bool +AS $CODE$ + return 0 if $_[0] <= 1; + for my $i ( 2 .. $_[0] - 1 ) { + return 0 if $_[0] % $i == 0; + } + + return 1; +$CODE$ +LANGUAGE plperl; + + +CREATE OR REPLACE FUNCTION +pwc156.sumbits( int[] ) +RETURNS int +AS $CODE$ + my $sum = 0; + for my $bit ( @{$_[0]} ) { + $sum += $bit; + } + + return $sum; +$CODE$ +LANGUAGE plperl; + + + +SELECT n +FROM generate_series( 1, 1000 ) n +WHERE pwc156.is_prime( pwc156.sumbits( regexp_split_to_array( n::bit(10)::text, '' )::int[] ) ) +LIMIT 10; diff --git a/challenge-156/luca-ferrari/postgresql/ch-2.sql b/challenge-156/luca-ferrari/postgresql/ch-2.sql new file mode 100644 index 0000000000..ac9d22739c --- /dev/null +++ b/challenge-156/luca-ferrari/postgresql/ch-2.sql @@ -0,0 +1,48 @@ +CREATE SCHEMA IF NOT EXISTS pwc156; + +CREATE OR REPLACE FUNCTION +pwc156.weird( int ) +RETURNS bool +AS $CODE$ + +use Algorithm::Knapsack; +my @divisors; + +for my $i ( 2 .. $_[0] - 1 ) { + push @divisors, $i if $_[0] % $i == 0; +} + +my $sum = 0; +for my $i ( @divisors ) { + $sum += $i; +} + + +return 0 if $sum <= $_[0]; + +my $knapsack = Algorithm::Knapsack->new( + capacity => $_[0], + weights => \@divisors, +); + +$knapsack->compute(); + +foreach my $solution ($knapsack->solutions()) { + my @founds = @divisors[ $solution->@* ]; + my $sum = 0; + $sum += $_ for ( @founds ); + return 0 if $sum == $_[0]; + +} + + +return 1; +$CODE$ +LANGUAGE plperlu; + + + + +SELECT n +FROM generate_series( 1, 100 ) n +WHERE pwc156.weird( n ); |
