aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2023-04-03 12:18:58 +0200
committerLuca Ferrari <fluca1978@gmail.com>2023-04-03 12:24:24 +0200
commitc523fbd673bd6651db49e4c1a97908687a9fa035 (patch)
tree846c5c18204344d964d89a819b143a5ba69e10bf
parent1bab1d6247beb4ed475992cc978e74cff4b654f7 (diff)
downloadperlweeklychallenge-club-c523fbd673bd6651db49e4c1a97908687a9fa035.tar.gz
perlweeklychallenge-club-c523fbd673bd6651db49e4c1a97908687a9fa035.tar.bz2
perlweeklychallenge-club-c523fbd673bd6651db49e4c1a97908687a9fa035.zip
Task 2 plperl done
-rw-r--r--challenge-211/luca-ferrari/postgresql/ch-2.plperl40
1 files changed, 40 insertions, 0 deletions
diff --git a/challenge-211/luca-ferrari/postgresql/ch-2.plperl b/challenge-211/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..6513b34abf
--- /dev/null
+++ b/challenge-211/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,40 @@
+--
+-- Perl Weekly Challenge 211
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-211/>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc211;
+
+/*
+estdb=# select pwc211.task2_plperl( array[ 1,2,3,4,5,6,7,8] );
+ task2_plperl
+--------------
+ {1,2,7,8}
+ {3,4,5,6}
+(2 rows)
+
+*/
+CREATE OR REPLACE FUNCTION
+pwc211.task2_plperl( int[] )
+RETURNS SETOF int[]
+AS $CODE$
+ use List::Permutor;
+ use List::Util qw/sum/;
+ my ( $array ) = @_;
+
+ my $permutator = List::Permutor->new( $array->@* );
+ while ( my @current = $permutator->next ) {
+ my ( $split_at ) = ( $#current + 1) / 2;
+ my ( $left, $right ) = ( [ @current[ 0 .. ( $split_at - 1 ) ] ], [ @current[ $split_at .. $#current ] ] );
+
+ if ( ( sum( $left->@* ) / scalar( $left->@* ) ) == ( sum( $right->@* ) / scalar( $right->@* ) ) ) {
+ return_next( $left );
+ return_next( $right );
+ return undef;
+ }
+ }
+
+return undef;
+$CODE$
+LANGUAGE plperlu;