aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2023-03-18 22:05:45 +0000
committerGitHub <noreply@github.com>2023-03-18 22:05:45 +0000
commit6d11830db0045ec77a389d5b013ccf05ca7307b1 (patch)
treecaa4c745f89c88d5da04958369df849d257aa251
parent561153c080466c0782c46598a1d0f41b5f37a779 (diff)
parent6233052babcae6870d1e06844ce79b79789db74b (diff)
downloadperlweeklychallenge-club-6d11830db0045ec77a389d5b013ccf05ca7307b1.tar.gz
perlweeklychallenge-club-6d11830db0045ec77a389d5b013ccf05ca7307b1.tar.bz2
perlweeklychallenge-club-6d11830db0045ec77a389d5b013ccf05ca7307b1.zip
Merge pull request #7742 from fluca1978/PWC208
Pwc208
-rw-r--r--challenge-208/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-208/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-208/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-208/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-208/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-208/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-208/luca-ferrari/postgresql/ch-1.plperl38
-rw-r--r--challenge-208/luca-ferrari/postgresql/ch-1.sql30
-rw-r--r--challenge-208/luca-ferrari/postgresql/ch-2.plperl39
-rw-r--r--challenge-208/luca-ferrari/postgresql/ch-2.sql29
-rw-r--r--challenge-208/luca-ferrari/raku/ch-1.p620
-rw-r--r--challenge-208/luca-ferrari/raku/ch-2.p622
12 files changed, 184 insertions, 0 deletions
diff --git a/challenge-208/luca-ferrari/blog-1.txt b/challenge-208/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..c4f5c7028c
--- /dev/null
+++ b/challenge-208/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2023/03/17/PerlWeeklyChallenge208.html#task1
diff --git a/challenge-208/luca-ferrari/blog-2.txt b/challenge-208/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..4f1f2fde94
--- /dev/null
+++ b/challenge-208/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2023/03/17/PerlWeeklyChallenge208.html#task2
diff --git a/challenge-208/luca-ferrari/blog-3.txt b/challenge-208/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..4264a6b950
--- /dev/null
+++ b/challenge-208/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2023/03/17/PerlWeeklyChallenge208.html#task1plperl
diff --git a/challenge-208/luca-ferrari/blog-4.txt b/challenge-208/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..5fe520ac05
--- /dev/null
+++ b/challenge-208/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2023/03/17/PerlWeeklyChallenge208.html#task2plperl
diff --git a/challenge-208/luca-ferrari/blog-5.txt b/challenge-208/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..a3f589ad87
--- /dev/null
+++ b/challenge-208/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2023/03/17/PerlWeeklyChallenge208.html#task1plpgsql
diff --git a/challenge-208/luca-ferrari/blog-6.txt b/challenge-208/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..c2cdc7716a
--- /dev/null
+++ b/challenge-208/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2023/03/17/PerlWeeklyChallenge208.html#task2plpgsql
diff --git a/challenge-208/luca-ferrari/postgresql/ch-1.plperl b/challenge-208/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..2fc60f38d0
--- /dev/null
+++ b/challenge-208/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,38 @@
+--
+-- Perl Weekly Challenge 208
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-208/>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc208;
+
+/**
+ testdb=> select pwc208.task1_plperl( array['Perl', 'Raku', 'PHP']::text[], array['Raku', 'Perl', 'Java']::text[] );
+ task1_plperl
+--------------
+ Perl
+ Raku
+(2 rows)
+
+*/
+CREATE OR REPLACE FUNCTION
+pwc208.task1_plperl( text[], text[] )
+RETURNS SETOF text
+AS $CODE$
+ my ( $first, $second ) = @_;
+ my %results;
+
+ for my $a ( 0 .. $first->@* ) {
+ next if ! grep( $first->[ $a ], $second->@* );
+
+ my $b = ( grep( $first->[ $a ] eq $second->[ $_ ], 0 .. $second->@* ) )[ 0 ];
+ push $results{ $a + $b }->@*, $first->[ $a ];
+ }
+
+ my $min = ( sort keys %results )[ 0 ];
+ return_next( $_ ) for ( $results{ $min }->@* );
+
+return undef;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-208/luca-ferrari/postgresql/ch-1.sql b/challenge-208/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..fd626bdd31
--- /dev/null
+++ b/challenge-208/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,30 @@
+--
+-- Perl Weekly Challenge 208
+-- Task 1
+--
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-208/>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc208;
+
+CREATE OR REPLACE FUNCTION
+pwc208.task1_plpgsql( f text[], s text[] )
+RETURNS SETOF TEXT
+AS $CODE$
+ WITH ta AS (
+ SELECT t, row_number() over() AS v
+ FROM unnest( f ) t
+ )
+ , tb AS (
+ SELECT t, row_number() over() AS v
+ FROM unnest( s ) t
+ )
+ , res AS (
+ SELECT ta.t, ta.v + tb.v AS v
+ FROM ta JOIN tb ON ta.t = tb.t
+ )
+ SELECT res.t
+ FROM res
+ WHERE res.v = (SELECT min( res.v ) FROM res );
+$CODE$
+LANGUAGE sql;
diff --git a/challenge-208/luca-ferrari/postgresql/ch-2.plperl b/challenge-208/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..6e2f8666fc
--- /dev/null
+++ b/challenge-208/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,39 @@
+--
+-- Perl Weekly Challenge 208
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-208/>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc208;
+
+/*
+testdb=> select pwc208.task2_plperl( array[ 1,2,2,4,5]::int[] );
+ task2_plperl
+--------------------------
+ (2,"Duplicated value 2")
+ (3,"Missing value 3")
+(2 rows)
+
+*/
+CREATE OR REPLACE FUNCTION
+pwc208.task2_plperl( int[] )
+RETURNS TABLE( v int, d text )
+AS $CODE$
+ my ( $list ) = @_;
+ my %results;
+
+ my ( $min, $max ) = ( sort $list->@* )[0, -1];
+ for my $needle ( $min .. $max ) {
+ $results{ $needle } += scalar grep { $_ == $needle } $list->@*;
+ }
+
+ for ( sort keys %results ) {
+ next if $results{ $_ } == 1;
+ return_next( { v => $_, d => "Missing value $_" } ) if ( $results{ $_ } == 0 );
+ return_next( { v => $_, d => "Duplicated value $_" } ) if ( $results{ $_ } > 1 );
+ }
+
+return undef;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-208/luca-ferrari/postgresql/ch-2.sql b/challenge-208/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..01420d9428
--- /dev/null
+++ b/challenge-208/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,29 @@
+--
+-- Perl Weekly Challenge 208
+-- Task 2
+--
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-208/>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc208;
+
+CREATE OR REPLACE FUNCTION
+pwc208.task2_plpgsql( l int[] )
+RETURNS TABLE( v int, d text )
+AS $CODE$
+ WITH res AS (
+ SELECT v, count( vv ) AS c
+ FROM generate_series( l[1], l[ array_length( l, 1 ) ] ) v
+ LEFT JOIN unnest( l ) vv ON vv = v
+ GROUP BY v
+ )
+ SELECT v, 'Duplicated value ' || v
+ FROM res
+ WHERE c > 1
+ UNION
+ SELECT v, 'Missing value ' || v
+ FROM res
+ WHERE c = 0;
+
+$CODE$
+LANGUAGE sql;
diff --git a/challenge-208/luca-ferrari/raku/ch-1.p6 b/challenge-208/luca-ferrari/raku/ch-1.p6
new file mode 100644
index 0000000000..412271a097
--- /dev/null
+++ b/challenge-208/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,20 @@
+#!raku
+
+#
+# Perl Weekly Challenge 208
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-208/>
+#
+
+sub MAIN() {
+ my @first = < Perl Raku PHP Love >;
+ my @second = < Raku Perl Hate >;
+ my %results;
+
+ for 0 ..^ @first.elems {
+ %results{ $_ + @second.first( @first[ $_ ], :k ) }.push: @first[ $_ ] if ( @second.grep: @first[ $_ ] );
+ }
+
+ %results{ %results.keys.min }.join( ',' ).say;
+}
diff --git a/challenge-208/luca-ferrari/raku/ch-2.p6 b/challenge-208/luca-ferrari/raku/ch-2.p6
new file mode 100644
index 0000000000..d05083bbad
--- /dev/null
+++ b/challenge-208/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,22 @@
+#!raku
+
+#
+# Perl Weekly Challenge 208
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-208/>
+#
+
+sub MAIN( *@list where { @list.grep( * ~~ Int ).elems == @list.elems } ) {
+ my %results;
+
+ for @list.min .. @list.max {
+ %results{ $_ } += @list.grep( $_ ).elems;
+ }
+
+
+ for %results.keys.sort {
+ "Duplicated value $_ (found { %results{ $_ } } times)".say if ( %results{ $_ } > 1 );
+ "Missing value $_".say if ( %results{ $_ } == 0 );
+ }
+}