aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-331/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-10.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-7.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-8.txt1
-rw-r--r--challenge-331/luca-ferrari/blog-9.txt1
-rw-r--r--challenge-331/luca-ferrari/pljava/pom.xml6
-rw-r--r--challenge-331/luca-ferrari/pljava/src/main/java/Task1.java66
-rw-r--r--challenge-331/luca-ferrari/pljava/src/main/java/Task2.java68
-rw-r--r--challenge-331/luca-ferrari/plperl/ch-1.plperl21
-rw-r--r--challenge-331/luca-ferrari/plperl/ch-2.plperl32
-rw-r--r--challenge-331/luca-ferrari/plpgsql/ch-1.sql25
-rw-r--r--challenge-331/luca-ferrari/plpgsql/ch-2.sql48
-rw-r--r--challenge-331/luca-ferrari/python/ch-1.py25
-rw-r--r--challenge-331/luca-ferrari/python/ch-2.py33
-rw-r--r--challenge-331/luca-ferrari/raku/ch-1.raku12
-rw-r--r--challenge-331/luca-ferrari/raku/ch-2.raku18
21 files changed, 361 insertions, 3 deletions
diff --git a/challenge-331/luca-ferrari/blog-1.txt b/challenge-331/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..5f9b31306e
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task1
diff --git a/challenge-331/luca-ferrari/blog-10.txt b/challenge-331/luca-ferrari/blog-10.txt
new file mode 100644
index 0000000000..62b7e27847
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-10.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task2pljava
diff --git a/challenge-331/luca-ferrari/blog-2.txt b/challenge-331/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..0f4f8cf018
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task2
diff --git a/challenge-331/luca-ferrari/blog-3.txt b/challenge-331/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..3a27bab4bc
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task1plperl
diff --git a/challenge-331/luca-ferrari/blog-4.txt b/challenge-331/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..2621e4ea1d
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task2plperl
diff --git a/challenge-331/luca-ferrari/blog-5.txt b/challenge-331/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..242b44f7f1
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task1plpgsql
diff --git a/challenge-331/luca-ferrari/blog-6.txt b/challenge-331/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..27409c02b5
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task2plpgsql
diff --git a/challenge-331/luca-ferrari/blog-7.txt b/challenge-331/luca-ferrari/blog-7.txt
new file mode 100644
index 0000000000..ae2b9e44fb
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-7.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task1python
diff --git a/challenge-331/luca-ferrari/blog-8.txt b/challenge-331/luca-ferrari/blog-8.txt
new file mode 100644
index 0000000000..5ddfcb0729
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-8.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task2python
diff --git a/challenge-331/luca-ferrari/blog-9.txt b/challenge-331/luca-ferrari/blog-9.txt
new file mode 100644
index 0000000000..cee236b386
--- /dev/null
+++ b/challenge-331/luca-ferrari/blog-9.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2025/07/24/PerlWeeklyChallenge331.html#task1pljava
diff --git a/challenge-331/luca-ferrari/pljava/pom.xml b/challenge-331/luca-ferrari/pljava/pom.xml
index a5e9d8f5ff..45f0e495c8 100644
--- a/challenge-331/luca-ferrari/pljava/pom.xml
+++ b/challenge-331/luca-ferrari/pljava/pom.xml
@@ -7,14 +7,14 @@
<groupId>PWC</groupId>
<artifactId>
- PWC330
+ PWC331
</artifactId>
<version>
1
</version>
- <name>Perl Weekly Challenge 330 with package PWC330</name>
- <description>Implementation of the tasks in PL/Java for PWC 330</description>
+ <name>Perl Weekly Challenge 331 with package PWC331</name>
+ <description>Implementation of the tasks in PL/Java for PWC 331</description>
<properties>
<project.build.sourceEncoding>US-ASCII</project.build.sourceEncoding>
diff --git a/challenge-331/luca-ferrari/pljava/src/main/java/Task1.java b/challenge-331/luca-ferrari/pljava/src/main/java/Task1.java
new file mode 100644
index 0000000000..d10194368f
--- /dev/null
+++ b/challenge-331/luca-ferrari/pljava/src/main/java/Task1.java
@@ -0,0 +1,66 @@
+
+
+
+package PWC331;
+
+/**
+ * PL/Java implementation for PWC 331
+ * Task 1
+ * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+ *
+ *
+ * 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/PWC331-1.jar luca@rachel:/tmp
+
+
+ * To install into PostgreSQL execute:
+
+ select sqlj.install_jar( 'file:///tmp/PWC331-1.jar', 'PWC331', true );
+ select sqlj.set_classpath( 'public', 'PWC331' );
+
+ select pwc331.task2_pljava();
+
+ and then to redeploy:
+
+ select sqlj.replace_jar( 'file:///tmp/PWC331-1.jar', 'PWC331', 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 = "pwc331",
+ onNullInput = RETURNS_NULL,
+ effects = IMMUTABLE )
+ public static int task1_pljava( String sentence ) throws SQLException {
+ logger.log( Level.INFO, "Entering pwc331.task1_pljava" );
+
+ int length = 0;
+
+ for ( String s : sentence.split( "\\s+" ) ) {
+ s = s.trim();
+ if ( s.length() == 0 )
+ continue;
+
+ length = s.length();
+ }
+
+ return length;
+ }
+}
diff --git a/challenge-331/luca-ferrari/pljava/src/main/java/Task2.java b/challenge-331/luca-ferrari/pljava/src/main/java/Task2.java
new file mode 100644
index 0000000000..1b4a01182a
--- /dev/null
+++ b/challenge-331/luca-ferrari/pljava/src/main/java/Task2.java
@@ -0,0 +1,68 @@
+
+
+
+package PWC331;
+
+/**
+ * PL/Java implementation for PWC 331
+ * Task 2
+ * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+ *
+ *
+ * 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/PWC331-1.jar luca@rachel:/tmp
+
+
+ * To install into PostgreSQL execute:
+
+ select sqlj.install_jar( 'file:///tmp/PWC331-1.jar', 'PWC331', true );
+ select sqlj.set_classpath( 'public', 'PWC331' );
+
+ select pwc331.task2_pljava();
+
+ and then to redeploy:
+
+ select sqlj.replace_jar( 'file:///tmp/PWC331-1.jar', 'PWC331', 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 = "pwc331",
+ onNullInput = RETURNS_NULL,
+ effects = IMMUTABLE )
+ public static final boolean task2_pljava( String left, String right ) throws SQLException {
+ logger.log( Level.INFO, "Entering pwc331.task2_pljava" );
+
+ if ( left.length() != right.length() )
+ return false;
+
+ left = left.toLowerCase();
+ right = right.toLowerCase();
+ int diff = 0;
+
+ for ( int i = 0; i < left.length(); i++ ) {
+ if ( left.charAt( i ) != right.charAt( i ) )
+ diff++;
+ }
+
+ return diff <= 2;
+ }
+}
diff --git a/challenge-331/luca-ferrari/plperl/ch-1.plperl b/challenge-331/luca-ferrari/plperl/ch-1.plperl
new file mode 100644
index 0000000000..5dd5ce5412
--- /dev/null
+++ b/challenge-331/luca-ferrari/plperl/ch-1.plperl
@@ -0,0 +1,21 @@
+--
+-- Perl Weekly Challenge 331
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc331;
+
+CREATE OR REPLACE FUNCTION
+pwc331.task1_plperl( text )
+RETURNS int
+AS $CODE$
+
+ my ( $sentence ) = @_;
+
+ return (
+ map { length $_ }
+ split( /\s+/, $sentence ) )[ - 1 ];
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-331/luca-ferrari/plperl/ch-2.plperl b/challenge-331/luca-ferrari/plperl/ch-2.plperl
new file mode 100644
index 0000000000..77138ba304
--- /dev/null
+++ b/challenge-331/luca-ferrari/plperl/ch-2.plperl
@@ -0,0 +1,32 @@
+--
+-- Perl Weekly Challenge 331
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc331;
+
+CREATE OR REPLACE FUNCTION
+pwc331.task2_plperl( text, text )
+RETURNS boolean
+AS $CODE$
+
+ my ( $left, $right ) = @_;
+
+ return 1 if ( lc( $left ) eq lc( $right ) );
+ return 0 if ( length( $left ) != length( $right ) );
+
+ my $index = 0;
+ my @l = split //, $left;
+ my @r = split //, $right;
+
+ my @diff =
+ grep { $_->[ 0 ] ne $_->[ 1 ] }
+ map { [ $l[ $index ], $r[ $index++ ] ] }
+ ( 0 .. $#l );
+
+ return $#diff < 2 ? 1 : 0;
+
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-331/luca-ferrari/plpgsql/ch-1.sql b/challenge-331/luca-ferrari/plpgsql/ch-1.sql
new file mode 100644
index 0000000000..08a0b7f26e
--- /dev/null
+++ b/challenge-331/luca-ferrari/plpgsql/ch-1.sql
@@ -0,0 +1,25 @@
+--
+-- Perl Weekly Challenge 331
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc331;
+
+CREATE OR REPLACE FUNCTION
+pwc331.task1_plpgsql( s text )
+RETURNS int
+AS $CODE$
+
+ SELECT l
+ FROM (
+ SELECT length( v::text ) as l, row_number() over () as r
+ FROM regexp_split_to_table( s, '\s+' ) v
+ WHERE length( v::text ) > 0
+ ORDER BY r DESC
+ )
+ LIMIT 1;
+
+
+$CODE$
+LANGUAGE sql;
diff --git a/challenge-331/luca-ferrari/plpgsql/ch-2.sql b/challenge-331/luca-ferrari/plpgsql/ch-2.sql
new file mode 100644
index 0000000000..2b70f3e55e
--- /dev/null
+++ b/challenge-331/luca-ferrari/plpgsql/ch-2.sql
@@ -0,0 +1,48 @@
+--
+-- Perl Weekly Challenge 331
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc331;
+
+CREATE OR REPLACE FUNCTION
+pwc331.task2_plpgsql( l text, r text)
+RETURNS boolean
+AS $CODE$
+DECLARE
+ diffs int := 0;
+BEGIN
+ IF l = r THEN
+ RETURN true;
+ END IF;
+
+ IF length( l ) != length( r ) THEN
+ RETURN false;
+ END IF;
+
+ WITH
+ lt AS (
+ SELECT lc::text, row_number() over () as lr
+ FROM regexp_split_to_table( l, '' ) lc
+ )
+ , rt AS (
+ SELECT rc::text, row_number() over () as rr
+ FROM regexp_split_to_table( r, '' ) rc
+ )
+ SELECT count(*)
+ into diffs
+ FROM lt, rt
+ WHERE rr = lr
+ AND lc <> rc
+ ;
+
+ IF diffs > 2 THEN
+ RETURN false;
+ ELSE
+ RETURN true;
+ END IF;
+
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-331/luca-ferrari/python/ch-1.py b/challenge-331/luca-ferrari/python/ch-1.py
new file mode 100644
index 0000000000..e3b753d623
--- /dev/null
+++ b/challenge-331/luca-ferrari/python/ch-1.py
@@ -0,0 +1,25 @@
+#!python
+
+#
+# Perl Weekly Challenge 331
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+#
+
+import sys
+
+# task implementation
+# the return value will be printed
+def task_1( args ):
+ size = 0
+ for w in args[ 0 ].split() :
+ if len( w ) > 0 :
+ size = len( w )
+
+ return size
+
+
+# invoke the main without the command itself
+if __name__ == '__main__':
+ print( task_1( sys.argv[ 1: ] ) )
diff --git a/challenge-331/luca-ferrari/python/ch-2.py b/challenge-331/luca-ferrari/python/ch-2.py
new file mode 100644
index 0000000000..3dac88144a
--- /dev/null
+++ b/challenge-331/luca-ferrari/python/ch-2.py
@@ -0,0 +1,33 @@
+#!python
+
+#
+# Perl Weekly Challenge 331
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+#
+
+import sys
+
+# task implementation
+# the return value will be printed
+def task_2( args ):
+ left = args[ 0 ].lower()
+ right = args[ 1 ].lower()
+
+ diffs = 0
+
+ if len( left ) != len( right ) :
+ return False
+
+
+ for i in range( 0, len( left ) ) :
+ if left[ i ] != right[ i ] :
+ diffs += 1
+
+
+ return diffs <= 2
+
+# invoke the main without the command itself
+if __name__ == '__main__':
+ print( task_2( sys.argv[ 1: ] ) )
diff --git a/challenge-331/luca-ferrari/raku/ch-1.raku b/challenge-331/luca-ferrari/raku/ch-1.raku
new file mode 100644
index 0000000000..308ca6d1cd
--- /dev/null
+++ b/challenge-331/luca-ferrari/raku/ch-1.raku
@@ -0,0 +1,12 @@
+#!raku
+
+#
+# Perl Weekly Challenge 331
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+#
+
+sub MAIN( Str $string ) {
+ $string.split( /\s+/ ).grep( *.chars > 0 )[ * - 1 ].chars.say;
+}
diff --git a/challenge-331/luca-ferrari/raku/ch-2.raku b/challenge-331/luca-ferrari/raku/ch-2.raku
new file mode 100644
index 0000000000..82a614b304
--- /dev/null
+++ b/challenge-331/luca-ferrari/raku/ch-2.raku
@@ -0,0 +1,18 @@
+#!raku
+
+#
+# Perl Weekly Challenge 331
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-331>
+#
+
+sub MAIN( Str $left, Str $right ) {
+ True.say and exit if ( $left.fc ~~ $right.fc );
+ False.say and exit if ( $left.chars != $right.chars );
+
+ my $permutations = +( [Z] $left.comb, $right.comb ).grep( { $_[ 0 ] ne $_[ 1 ] } );
+ False.say and exit if ( $permutations > 2 );
+ True.say;
+
+}