aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2024-04-22 12:10:47 +0200
committerLuca Ferrari <fluca1978@gmail.com>2024-04-22 14:21:38 +0200
commit5dba324368d526b878978f60d55ae1db3b795804 (patch)
tree578038f03e7698696d8003236b77c99c7ac44136
parentaed41ed119210ab32e32b82af8039f2c1457726b (diff)
downloadperlweeklychallenge-club-5dba324368d526b878978f60d55ae1db3b795804.tar.gz
perlweeklychallenge-club-5dba324368d526b878978f60d55ae1db3b795804.tar.bz2
perlweeklychallenge-club-5dba324368d526b878978f60d55ae1db3b795804.zip
PWC 266
Task 1 Raku done Task 2 Raku done Task 1 PL/Perl done Task 2 PL/Perl done Task 1 PL/PgSQL done Task 2 PL/PgSQL done Task 1 PL/Java done Task 2 PL/Java done Task 1 Python done Task 2 Python done
-rw-r--r--challenge-266/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-10.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-7.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-8.txt1
-rw-r--r--challenge-266/luca-ferrari/blog-9.txt1
-rw-r--r--challenge-266/luca-ferrari/pljava/pom.xml6
-rw-r--r--challenge-266/luca-ferrari/pljava/src/main/java/Task1.java99
-rw-r--r--challenge-266/luca-ferrari/pljava/src/main/java/Task2.java70
-rw-r--r--challenge-266/luca-ferrari/plperl/ch-1.plperl39
-rw-r--r--challenge-266/luca-ferrari/plperl/ch-2.plperl35
-rw-r--r--challenge-266/luca-ferrari/plpgsql/ch-1.sql37
-rw-r--r--challenge-266/luca-ferrari/plpgsql/ch-2.sql38
-rw-r--r--challenge-266/luca-ferrari/python/ch-1.py52
-rw-r--r--challenge-266/luca-ferrari/python/ch-2.py35
-rw-r--r--challenge-266/luca-ferrari/raku/ch-1.raku19
-rw-r--r--challenge-266/luca-ferrari/raku/ch-2.raku37
21 files changed, 474 insertions, 3 deletions
diff --git a/challenge-266/luca-ferrari/blog-1.txt b/challenge-266/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..dccf60d9ed
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task1
diff --git a/challenge-266/luca-ferrari/blog-10.txt b/challenge-266/luca-ferrari/blog-10.txt
new file mode 100644
index 0000000000..59357f2304
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-10.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/[= date -%]/PerlWeeklyChallenge266.html#task2pljava
diff --git a/challenge-266/luca-ferrari/blog-2.txt b/challenge-266/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..29e2e479ec
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task2
diff --git a/challenge-266/luca-ferrari/blog-3.txt b/challenge-266/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..585db603c5
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task1plperl
diff --git a/challenge-266/luca-ferrari/blog-4.txt b/challenge-266/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..c4132dde9f
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task2plperl
diff --git a/challenge-266/luca-ferrari/blog-5.txt b/challenge-266/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..ef375d1a61
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task1plpgsql
diff --git a/challenge-266/luca-ferrari/blog-6.txt b/challenge-266/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..b57c260985
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task2plpgsql
diff --git a/challenge-266/luca-ferrari/blog-7.txt b/challenge-266/luca-ferrari/blog-7.txt
new file mode 100644
index 0000000000..a2466c310d
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-7.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task1python
diff --git a/challenge-266/luca-ferrari/blog-8.txt b/challenge-266/luca-ferrari/blog-8.txt
new file mode 100644
index 0000000000..c6a4d761e7
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-8.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task2python
diff --git a/challenge-266/luca-ferrari/blog-9.txt b/challenge-266/luca-ferrari/blog-9.txt
new file mode 100644
index 0000000000..8a0d2c1889
--- /dev/null
+++ b/challenge-266/luca-ferrari/blog-9.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/04/22/PerlWeeklyChallenge266.html#task1pljava
diff --git a/challenge-266/luca-ferrari/pljava/pom.xml b/challenge-266/luca-ferrari/pljava/pom.xml
index e92939a081..7f4f12ce7f 100644
--- a/challenge-266/luca-ferrari/pljava/pom.xml
+++ b/challenge-266/luca-ferrari/pljava/pom.xml
@@ -7,14 +7,14 @@
<groupId>PWC</groupId>
<artifactId>
- PWC265
+ PWC266
</artifactId>
<version>
1
</version>
- <name>Perl Weekly Challenge 265 with package PWC265</name>
- <description>Implementation of the tasks in PL/Java for PWC 265</description>
+ <name>Perl Weekly Challenge 266 with package PWC266</name>
+ <description>Implementation of the tasks in PL/Java for PWC 266</description>
<properties>
<project.build.sourceEncoding>US-ASCII</project.build.sourceEncoding>
diff --git a/challenge-266/luca-ferrari/pljava/src/main/java/Task1.java b/challenge-266/luca-ferrari/pljava/src/main/java/Task1.java
new file mode 100644
index 0000000000..895641d052
--- /dev/null
+++ b/challenge-266/luca-ferrari/pljava/src/main/java/Task1.java
@@ -0,0 +1,99 @@
+
+
+
+package PWC266;
+
+/**
+ * PL/Java implementation for PWC 266
+ * Task 1
+ * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+ *
+ *
+ * To compile on the local machine:
+
+ $ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/ # if not already set
+ $ mvn clean build
+ $ scp target/PWC266-1.jar luca@rachel:/tmp
+
+
+ * To install into PostgreSQL execute:
+
+ select sqlj.install_jar( 'file:///tmp/PWC266-1.jar', 'PWC266', true );
+ select sqlj.set_classpath( 'public', 'PWC266' );
+
+ select pwc266.task2_pljava();
+
+ and then to redeploy:
+
+ select sqlj.replace_jar( 'file:///tmp/PWC266-1.jar', 'PWC266', true );
+
+*/
+
+import org.postgresql.pljava.*;
+import org.postgresql.pljava.annotation.Function;
+import static org.postgresql.pljava.annotation.Function.Effects.IMMUTABLE;
+import static org.postgresql.pljava.annotation.Function.OnNullInput.RETURNS_NULL;
+
+import java.util.*;
+import java.util.stream.*;
+import java.sql.SQLException;
+import java.util.logging.*;
+import java.sql.ResultSet;
+import java.sql.Date;
+
+public class Task1 {
+
+ private final static Logger logger = Logger.getAnonymousLogger();
+
+ @Function( schema = "pwc266",
+ onNullInput = RETURNS_NULL,
+ effects = IMMUTABLE )
+ public static final String[] task1_pljava( String left, String right ) throws SQLException {
+ logger.log( Level.INFO, "Entering pwc266.task1_pljava" );
+
+ Map<String, Integer> bag_left = new HashMap<String, Integer>();
+ Map<String, Integer> bag_right = new HashMap<String, Integer>();
+
+ classify( bag_left, left );
+ classify( bag_right, right );
+
+
+ List<String> words = deduplicate( bag_left, bag_right );
+ String returning[] = new String[ words.size() ];
+ int i = 0;
+ for ( String word : words )
+ returning[ i++ ] = word;
+
+ return returning;
+ }
+
+
+ private static final List<String> deduplicate( Map<String, Integer> bag_left,
+ Map<String, Integer> bag_right ) {
+
+ List<String> words = new LinkedList<String>();
+
+ for ( String word : bag_left.keySet() ) {
+ if ( bag_left.get( word ) == 1 && ! bag_right.containsKey( word ) )
+ words.add( word );
+ }
+
+ for ( String word : bag_right.keySet() ) {
+ if ( bag_right.get( word ) == 1 && ! bag_left.containsKey( word ) )
+ words.add( word );
+ }
+
+ return words;
+ }
+
+ private static final void classify( Map<String, Integer> bag, String sentence ) {
+ for ( String word : sentence.split( "\\W+" ) ) {
+ word = word.toLowerCase();
+ int count = 1;
+ if ( bag.containsKey( word ) )
+ count += bag.get( word );
+
+ bag.put( word, count );
+ }
+ }
+}
diff --git a/challenge-266/luca-ferrari/pljava/src/main/java/Task2.java b/challenge-266/luca-ferrari/pljava/src/main/java/Task2.java
new file mode 100644
index 0000000000..14f94425dd
--- /dev/null
+++ b/challenge-266/luca-ferrari/pljava/src/main/java/Task2.java
@@ -0,0 +1,70 @@
+
+
+
+package PWC266;
+
+/**
+ * PL/Java implementation for PWC 266
+ * Task 2
+ * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+ *
+ *
+ * To compile on the local machine:
+
+ $ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/ # if not already set
+ $ mvn clean build
+ $ scp target/PWC266-1.jar luca@rachel:/tmp
+
+
+ * To install into PostgreSQL execute:
+
+ select sqlj.install_jar( 'file:///tmp/PWC266-1.jar', 'PWC266', true );
+ select sqlj.set_classpath( 'public', 'PWC266' );
+
+ select pwc266.task2_pljava();
+
+ and then to redeploy:
+
+ select sqlj.replace_jar( 'file:///tmp/PWC266-1.jar', 'PWC266', true );
+
+*/
+
+import org.postgresql.pljava.*;
+import org.postgresql.pljava.annotation.Function;
+import static org.postgresql.pljava.annotation.Function.Effects.IMMUTABLE;
+import static org.postgresql.pljava.annotation.Function.OnNullInput.RETURNS_NULL;
+
+import java.util.*;
+import java.util.stream.*;
+import java.sql.SQLException;
+import java.util.logging.*;
+import java.sql.ResultSet;
+import java.sql.Date;
+
+public class Task2 {
+
+ private final static Logger logger = Logger.getAnonymousLogger();
+
+ @Function( schema = "pwc266",
+ onNullInput = RETURNS_NULL,
+ effects = IMMUTABLE )
+ public static final boolean task2_pljava( int dim, int[] matrix ) throws SQLException {
+ logger.log( Level.INFO, "Entering pwc266.task2_pljava" );
+
+ for ( int row = 0; row < dim; row++ ) {
+ for ( int col = 0; col < dim; col++ ) {
+
+ if ( row == col || col == dim - row - 1 ) {
+ if ( matrix[ row * dim + col ] == 0 )
+ return false;
+ }
+ else if ( matrix[ row * dim + col ] != 0 )
+ return false;
+
+ }
+ }
+
+ return true;
+
+ }
+}
diff --git a/challenge-266/luca-ferrari/plperl/ch-1.plperl b/challenge-266/luca-ferrari/plperl/ch-1.plperl
new file mode 100644
index 0000000000..e9e4b797b9
--- /dev/null
+++ b/challenge-266/luca-ferrari/plperl/ch-1.plperl
@@ -0,0 +1,39 @@
+--
+-- Perl Weekly Challenge 266
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc266;
+
+CREATE OR REPLACE FUNCTION
+pwc266.task1_plperl( text, text )
+RETURNS SETOF text
+AS $CODE$
+
+ my ( $left, $right ) = @_;
+
+ my $bag_left = {};
+ my $bag_right = {};
+
+ $bag_left->{ lc $_ }++ for ( split( /\W+/, $left ) );
+ $bag_right->{ lc $_ }++ for ( split( /\W+/, $right ) );
+
+ for my $word ( keys $bag_left->%* ) {
+ next if $bag_left->{ $word } != 1;
+ next if $right =~ /$word/i;
+
+ return_next( $word );
+ }
+
+ for my $word ( keys $bag_right->%* ) {
+ next if $bag_right->{ $word } != 1;
+ next if $left =~ /$word/i;
+
+ return_next( $word );
+ }
+
+return undef;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-266/luca-ferrari/plperl/ch-2.plperl b/challenge-266/luca-ferrari/plperl/ch-2.plperl
new file mode 100644
index 0000000000..2b80095ed1
--- /dev/null
+++ b/challenge-266/luca-ferrari/plperl/ch-2.plperl
@@ -0,0 +1,35 @@
+--
+-- Perl Weekly Challenge 266
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc266;
+
+CREATE OR REPLACE FUNCTION
+pwc266.task2_plperl( int[][] )
+RETURNS boolean
+AS $CODE$
+
+ my ( $matrix ) = @_;
+
+ my $size = scalar $matrix->@[ 0 ]->@*;
+
+ for my $row ( 0 .. $size - 1 ) {
+ for my $column ( 0 .. $size - 1 ) {
+ # is this the main diagonal?
+ # is the antidiagonal?
+ if ( $row == $column || $column == $size - $row - 1 ) {
+ return 0 if ( $matrix->@[ $row ]->[ $column ] == 0 );
+ }
+ else {
+ return 0 if ( $matrix->@[ $row ]->[ $column ] != 0 );
+ }
+ }
+
+ }
+
+ return 1;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-266/luca-ferrari/plpgsql/ch-1.sql b/challenge-266/luca-ferrari/plpgsql/ch-1.sql
new file mode 100644
index 0000000000..7df21faa26
--- /dev/null
+++ b/challenge-266/luca-ferrari/plpgsql/ch-1.sql
@@ -0,0 +1,37 @@
+--
+-- Perl Weekly Challenge 266
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc266;
+
+CREATE OR REPLACE FUNCTION
+pwc266.task1_plpgsql( l text, r text )
+RETURNS SETOF text
+AS $CODE$
+
+ WITH left_words AS (
+ SELECT w, count( w ) as c
+ FROM regexp_split_to_table( l, '\W+' ) w
+ GROUP BY 1
+ )
+ , right_words AS (
+ SELECT w, count( w ) as c
+ FROM regexp_split_to_table( R, '\W+' ) w
+ GROUP BY 1
+ )
+
+ SELECT w
+ FROM left_words
+ WHERE w NOT IN ( SELECT w FROM right_words )
+ AND c = 1
+ UNION
+ SELECT w
+ FROM right_words
+ WHERE w NOT IN ( SELECT w FROM left_words )
+ AND c = 1
+ ;
+
+$CODE$
+LANGUAGE sql;
diff --git a/challenge-266/luca-ferrari/plpgsql/ch-2.sql b/challenge-266/luca-ferrari/plpgsql/ch-2.sql
new file mode 100644
index 0000000000..95f6ac6c8c
--- /dev/null
+++ b/challenge-266/luca-ferrari/plpgsql/ch-2.sql
@@ -0,0 +1,38 @@
+--
+-- Perl Weekly Challenge 266
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc266;
+
+CREATE OR REPLACE FUNCTION
+pwc266.task2_plpgsql( s int, matrix int[] )
+RETURNS boolean
+AS $CODE$
+DECLARE
+ w int := 0;
+BEGIN
+
+
+ FOR r IN 1 .. s LOOP
+ FOR c IN 1 .. s LOOP
+ w = ( r - 1 ) * s + c;
+ IF r = c OR c = s - r + 1 THEN
+ IF matrix[ w ] = 0 THEN
+ RETURN false;
+ END IF;
+ ELSE
+ IF matrix[ w ] <> 0 THEN
+ RETURN false;
+ END IF;
+ END IF;
+
+ END LOOP;
+ END LOOP;
+
+ RETURN true;
+
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-266/luca-ferrari/python/ch-1.py b/challenge-266/luca-ferrari/python/ch-1.py
new file mode 100644
index 0000000000..3d5f542714
--- /dev/null
+++ b/challenge-266/luca-ferrari/python/ch-1.py
@@ -0,0 +1,52 @@
+#!python
+
+#
+# Perl Weekly Challenge 266
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+#
+
+import sys
+
+# task implementation
+# the return value will be printed
+def task_1( args ):
+ left = args[ 0 ]
+ right = args[ 1 ]
+
+ bag_left = {}
+ bag_right = {}
+
+ # classify
+ for w in left.split():
+ c = 1
+ w = w.lower()
+ if w in bag_left:
+ c += bag_left[ w ]
+
+ bag_left[ w ] = c
+
+ for w in right.split():
+ c = 1
+ w = w.lower()
+ if w in bag_right:
+ c += bag_right[ w ]
+
+ bag_right[ w ] = c
+
+ words = []
+ for w in bag_left:
+ if bag_left[ w ] == 1 and not w in bag_right:
+ words.append( w )
+
+ for w in bag_right:
+ if bag_right[ w ] == 1 and not w in bag_left:
+ words.append( w )
+
+ return words
+
+
+# invoke the main without the command itself
+if __name__ == '__main__':
+ print( task_1( sys.argv[ 1: ] ) )
diff --git a/challenge-266/luca-ferrari/python/ch-2.py b/challenge-266/luca-ferrari/python/ch-2.py
new file mode 100644
index 0000000000..7b5ce0d896
--- /dev/null
+++ b/challenge-266/luca-ferrari/python/ch-2.py
@@ -0,0 +1,35 @@
+#!python
+
+#
+# Perl Weekly Challenge 266
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+#
+
+import sys
+
+# task implementation
+# the return value will be printed
+def task_2( matrix ):
+ size = len( matrix[ 0 ] )
+ for row in range( 0, size ):
+ for col in range( 0, size ):
+ if row == col or col == size - row - 1:
+ if matrix[ row ][ col ] == 0:
+ return 'False'
+ elif matrix[ row ][ col ] != 0:
+ return 'False'
+ return 'True'
+
+
+
+# invoke the main without the command itself
+if __name__ == '__main__':
+ matrix = [
+ [1, 0, 0, 2],
+ [0, 3, 4, 0],
+ [0, 5, 6, 0],
+ [7, 0, 0, 1],
+ ]
+ print( task_2( matrix ) )
diff --git a/challenge-266/luca-ferrari/raku/ch-1.raku b/challenge-266/luca-ferrari/raku/ch-1.raku
new file mode 100644
index 0000000000..611ee1a805
--- /dev/null
+++ b/challenge-266/luca-ferrari/raku/ch-1.raku
@@ -0,0 +1,19 @@
+#!raku
+
+#
+# Perl Weekly Challenge 266
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+#
+
+sub MAIN( Str $left, Str $right ) {
+ my $bag-left = Bag.new( $left.split( / \W+ / ).map( { .lc } ) );
+ my $bag-right = Bag.new( $right.split( / \W+ / ).map( { .lc } ) );
+
+ my @found-words;
+
+ @found-words.push: $_ for $bag-left.keys.grep( -> $left, { $bag-left{ $left } == 1 && ! $bag-right.keys.grep( { $left eq $_ } ) } );
+ @found-words.push: $_ for $bag-right.keys.grep( -> $right, { $bag-right{ $right } == 1 && ! $bag-left.keys.grep( { $right eq $_ } ) } );
+ @found-words.join( ', ' ).say;
+}
diff --git a/challenge-266/luca-ferrari/raku/ch-2.raku b/challenge-266/luca-ferrari/raku/ch-2.raku
new file mode 100644
index 0000000000..c4d08cd03f
--- /dev/null
+++ b/challenge-266/luca-ferrari/raku/ch-2.raku
@@ -0,0 +1,37 @@
+#!raku
+
+#
+# Perl Weekly Challenge 266
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-266>
+#
+
+sub MAIN() {
+
+ my @matrix = [1, 0, 0, 2],
+ [0, 3, 4, 0],
+ [0, 5, 6, 0],
+ [7, 0, 0, 1],
+ ;
+
+
+ my @indexes;
+ my $size = @matrix[ 0 ].elems;
+ for 0 ..^ $size {
+ @indexes.push: [ $_, $_ ]; # main diagonal
+ @indexes.push: [ $_, $size - $_ - 1 ]; # antidiagonal
+ }
+
+ my $row-index = 0;
+ for @matrix -> $row {
+ my @zeros = $row.grep( { $_ != 0 }, :k ).map( { [ $row-index, $_ ] } );
+
+ say 'False' and exit if @zeros.elems != $size / 2;
+ say 'False' and exit if @indexes.grep( * eq any( @zeros ) ).elems != @zeros.elems;
+
+ $row-index++;
+ }
+
+ 'True'.say;
+}