aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2024-07-16 11:48:42 +0100
committerGitHub <noreply@github.com>2024-07-16 11:48:42 +0100
commitc65f28455c8900599032071d018e679d67cbee1f (patch)
tree086b3286d7c97a8cda6bb7057e8d3e072fc40cd0
parent452785082337f497c33a2f9ce1ed96b35d9a3d4c (diff)
parentd5c82371fcc0e58f01b3457e71d7fff99a709eb4 (diff)
downloadperlweeklychallenge-club-c65f28455c8900599032071d018e679d67cbee1f.tar.gz
perlweeklychallenge-club-c65f28455c8900599032071d018e679d67cbee1f.tar.bz2
perlweeklychallenge-club-c65f28455c8900599032071d018e679d67cbee1f.zip
Merge pull request #10446 from fluca1978/PWC278
PWC 278
-rw-r--r--challenge-278/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-10.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-7.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-8.txt1
-rw-r--r--challenge-278/luca-ferrari/blog-9.txt1
-rw-r--r--challenge-278/luca-ferrari/pljava/pom.xml6
-rw-r--r--challenge-278/luca-ferrari/pljava/src/main/java/Task1.java70
-rw-r--r--challenge-278/luca-ferrari/pljava/src/main/java/Task2.java74
-rw-r--r--challenge-278/luca-ferrari/plperl/ch-1.plperl26
-rw-r--r--challenge-278/luca-ferrari/plperl/ch-2.plperl28
-rw-r--r--challenge-278/luca-ferrari/plpgsql/ch-1.sql24
-rw-r--r--challenge-278/luca-ferrari/plpgsql/ch-2.sql44
-rw-r--r--challenge-278/luca-ferrari/python/ch-1.py30
-rw-r--r--challenge-278/luca-ferrari/python/ch-2.py33
-rw-r--r--challenge-278/luca-ferrari/raku/ch-1.raku18
-rw-r--r--challenge-278/luca-ferrari/raku/ch-2.raku20
21 files changed, 380 insertions, 3 deletions
diff --git a/challenge-278/luca-ferrari/blog-1.txt b/challenge-278/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..0cac861685
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task1
diff --git a/challenge-278/luca-ferrari/blog-10.txt b/challenge-278/luca-ferrari/blog-10.txt
new file mode 100644
index 0000000000..c487be047a
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-10.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task2pljava
diff --git a/challenge-278/luca-ferrari/blog-2.txt b/challenge-278/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..77230b3c71
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task2
diff --git a/challenge-278/luca-ferrari/blog-3.txt b/challenge-278/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..6bd5a942d9
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task1plperl
diff --git a/challenge-278/luca-ferrari/blog-4.txt b/challenge-278/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..4db440def6
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task2plperl
diff --git a/challenge-278/luca-ferrari/blog-5.txt b/challenge-278/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..de8ef6f542
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task1plpgsql
diff --git a/challenge-278/luca-ferrari/blog-6.txt b/challenge-278/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..1ff0240663
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task2plpgsql
diff --git a/challenge-278/luca-ferrari/blog-7.txt b/challenge-278/luca-ferrari/blog-7.txt
new file mode 100644
index 0000000000..bf33a239c0
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-7.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task1python
diff --git a/challenge-278/luca-ferrari/blog-8.txt b/challenge-278/luca-ferrari/blog-8.txt
new file mode 100644
index 0000000000..39ab39115a
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-8.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task2python
diff --git a/challenge-278/luca-ferrari/blog-9.txt b/challenge-278/luca-ferrari/blog-9.txt
new file mode 100644
index 0000000000..fbe06ade3b
--- /dev/null
+++ b/challenge-278/luca-ferrari/blog-9.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2024/07/15/PerlWeeklyChallenge278.html#task1pljava
diff --git a/challenge-278/luca-ferrari/pljava/pom.xml b/challenge-278/luca-ferrari/pljava/pom.xml
index ab36c0045b..9402a684d7 100644
--- a/challenge-278/luca-ferrari/pljava/pom.xml
+++ b/challenge-278/luca-ferrari/pljava/pom.xml
@@ -7,14 +7,14 @@
<groupId>PWC</groupId>
<artifactId>
- PWC276
+ PWC278
</artifactId>
<version>
1
</version>
- <name>Perl Weekly Challenge 276 with package PWC276</name>
- <description>Implementation of the tasks in PL/Java for PWC 276</description>
+ <name>Perl Weekly Challenge 278 with package PWC278</name>
+ <description>Implementation of the tasks in PL/Java for PWC 278</description>
<properties>
<project.build.sourceEncoding>US-ASCII</project.build.sourceEncoding>
diff --git a/challenge-278/luca-ferrari/pljava/src/main/java/Task1.java b/challenge-278/luca-ferrari/pljava/src/main/java/Task1.java
new file mode 100644
index 0000000000..b56caa6e51
--- /dev/null
+++ b/challenge-278/luca-ferrari/pljava/src/main/java/Task1.java
@@ -0,0 +1,70 @@
+
+
+
+package PWC278;
+
+/**
+ * PL/Java implementation for PWC 278
+ * Task 1
+ * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+ *
+ *
+ * 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/PWC278-1.jar luca@rachel:/tmp
+
+
+ * To install into PostgreSQL execute:
+
+ select sqlj.install_jar( 'file:///tmp/PWC278-1.jar', 'PWC278', true );
+ select sqlj.set_classpath( 'public', 'PWC278' );
+
+ select pwc278.task2_pljava();
+
+ and then to redeploy:
+
+ select sqlj.replace_jar( 'file:///tmp/PWC278-1.jar', 'PWC278', 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;
+import java.util.regex.*;
+
+public class Task1 {
+
+ private final static Logger logger = Logger.getAnonymousLogger();
+
+ @Function( schema = "pwc278",
+ onNullInput = RETURNS_NULL,
+ effects = IMMUTABLE )
+ public static final String task1_pljava( String[] words ) throws SQLException {
+ logger.log( Level.INFO, "Entering pwc278.task1_pljava" );
+
+ final Map<Integer, String> sorted = new HashMap<Integer, String>();
+ Stream.of( words ).forEach( word -> {
+ Pattern pattern = Pattern.compile( "^([a-zA-Z]+)(\\d+)+$" );
+ Matcher m = pattern.matcher( word );
+ if ( m.matches() ) {
+ sorted.put( Integer.parseInt( m.group( 2 ) ),
+ m.group( 1 ) );
+ }
+ } );
+
+ return sorted.entrySet().stream()
+ .sorted( Comparator.comparing( Map.Entry::getKey ) )
+ .map( Map.Entry::getValue )
+ .collect( Collectors.joining( " " ) );
+ }
+}
diff --git a/challenge-278/luca-ferrari/pljava/src/main/java/Task2.java b/challenge-278/luca-ferrari/pljava/src/main/java/Task2.java
new file mode 100644
index 0000000000..ad79c4417f
--- /dev/null
+++ b/challenge-278/luca-ferrari/pljava/src/main/java/Task2.java
@@ -0,0 +1,74 @@
+
+
+
+package PWC278;
+
+/**
+ * PL/Java implementation for PWC 278
+ * Task 2
+ * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+ *
+ *
+ * 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/PWC278-1.jar luca@rachel:/tmp
+
+
+ * To install into PostgreSQL execute:
+
+ select sqlj.install_jar( 'file:///tmp/PWC278-1.jar', 'PWC278', true );
+ select sqlj.set_classpath( 'public', 'PWC278' );
+
+ select pwc278.task2_pljava();
+
+ and then to redeploy:
+
+ select sqlj.replace_jar( 'file:///tmp/PWC278-1.jar', 'PWC278', 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 = "pwc278",
+ onNullInput = RETURNS_NULL,
+ effects = IMMUTABLE )
+ public static final String task2_pljava( String word, String c ) throws SQLException {
+ logger.log( Level.INFO, "Entering pwc278.task2_pljava" );
+
+ if ( ! word.contains( c ) )
+ return word;
+
+ final List<String> left = new LinkedList<String>();
+ final List<String> right = new LinkedList<String>();
+ final boolean[] found = { false };
+ Stream.of( word.split( "" ) ).forEach( letter -> {
+ if ( found[ 0 ] )
+ right.add( letter );
+ else {
+ left.add( letter );
+
+ if ( letter.equals( c ) )
+ found[ 0 ] = true;
+ }
+ } );
+
+ Collections.sort( left );
+ return left.stream().collect( Collectors.joining() ) + right.stream().collect( Collectors.joining() );
+ }
+}
diff --git a/challenge-278/luca-ferrari/plperl/ch-1.plperl b/challenge-278/luca-ferrari/plperl/ch-1.plperl
new file mode 100644
index 0000000000..0aacf81c20
--- /dev/null
+++ b/challenge-278/luca-ferrari/plperl/ch-1.plperl
@@ -0,0 +1,26 @@
+--
+-- Perl Weekly Challenge 278
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc278;
+
+CREATE OR REPLACE FUNCTION
+pwc278.task1_plperl( text[] )
+RETURNS SETOF text
+AS $CODE$
+
+ my ( $words ) = @_;
+ my %sorted;
+
+ for ( $words->@* ) {
+ my ( $word, $position ) = ( $_ =~ / ^ ([a-zA-Z]+) (\d+) $ /x );
+ $sorted{ $position } = $word;
+ }
+
+ return_next( $sorted{ $_ } ) for ( sort keys %sorted );
+ return undef;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-278/luca-ferrari/plperl/ch-2.plperl b/challenge-278/luca-ferrari/plperl/ch-2.plperl
new file mode 100644
index 0000000000..359b6a65e2
--- /dev/null
+++ b/challenge-278/luca-ferrari/plperl/ch-2.plperl
@@ -0,0 +1,28 @@
+--
+-- Perl Weekly Challenge 278
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc278;
+
+CREATE OR REPLACE FUNCTION
+pwc278.task2_plperl( text, text )
+RETURNS text
+AS $CODE$
+
+ my ( $word, $char ) = @_;
+
+ return $word if ( $word !~ / $char /x );
+
+ my @original = split //, $word;
+ my @chars;
+ for ( @original ) {
+ push @chars, $_;
+ last if $_ eq $char;
+ }
+
+ return join( '', sort( @chars ), @original[ $#chars + 1 .. $#original ] );
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-278/luca-ferrari/plpgsql/ch-1.sql b/challenge-278/luca-ferrari/plpgsql/ch-1.sql
new file mode 100644
index 0000000000..dfbc14b996
--- /dev/null
+++ b/challenge-278/luca-ferrari/plpgsql/ch-1.sql
@@ -0,0 +1,24 @@
+--
+-- Perl Weekly Challenge 278
+-- Task 1
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc278;
+
+CREATE OR REPLACE FUNCTION
+pwc278.task1_plpgsql( words text[] )
+RETURNS SETOF text
+AS $CODE$
+
+ WITH numbered AS (
+ SELECT substring( v::text from '^[a-zA-Z]+' ) as word
+ , substring( v::text from '\d+$' )::int as index
+ FROM unnest( words ) v
+ )
+ SELECT word
+ FROM numbered
+ ORDER BY index
+ ;
+$CODE$
+LANGUAGE sql;
diff --git a/challenge-278/luca-ferrari/plpgsql/ch-2.sql b/challenge-278/luca-ferrari/plpgsql/ch-2.sql
new file mode 100644
index 0000000000..b271d36da0
--- /dev/null
+++ b/challenge-278/luca-ferrari/plpgsql/ch-2.sql
@@ -0,0 +1,44 @@
+--
+-- Perl Weekly Challenge 278
+-- Task 2
+-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+--
+
+CREATE SCHEMA IF NOT EXISTS pwc278;
+
+CREATE OR REPLACE FUNCTION
+pwc278.task2_plpgsql( w text, c char )
+RETURNS text
+AS $CODE$
+
+ WITH letters( l, i ) AS (
+ SELECT *
+ FROM regexp_split_to_table( w, '' )
+ WITH ORDINALITY AS v( text, int )
+ )
+ , first_part AS (
+ SELECT l
+ FROM letters
+ WHERE i <= position( c IN w )
+ ORDER BY l
+ )
+ , second_part AS (
+
+ SELECT l
+ FROM letters
+ WHERE i > position( c IN w )
+ ORDER BY i
+ )
+ , all_letters AS (
+ SELECT l
+ FROM first_part
+ UNION ALL
+ SELECT l
+ FROM second_part
+ )
+ SELECT string_agg( l, '' )
+ FROM all_letters
+ ;
+
+$CODE$
+LANGUAGE sql;
diff --git a/challenge-278/luca-ferrari/python/ch-1.py b/challenge-278/luca-ferrari/python/ch-1.py
new file mode 100644
index 0000000000..c2a980ed76
--- /dev/null
+++ b/challenge-278/luca-ferrari/python/ch-1.py
@@ -0,0 +1,30 @@
+#!python
+
+#
+# Perl Weekly Challenge 278
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+#
+
+import sys
+import re
+
+# task implementation
+# the return value will be printed
+def task_1( args ):
+ sorted_words = {}
+ pattern = re.compile( "^([a-zA-Z]+)(\\d)+$" )
+
+ for w in args:
+ m = pattern.match( w )
+ sorted_words[ str( m.group( 2 ) ) ] = m.group( 1 )
+
+ sorted_words = dict( sorted( sorted_words.items() ) )
+ return ' '.join( sorted_words.values() )
+
+
+
+# invoke the main without the command itself
+if __name__ == '__main__':
+ print( task_1( sys.argv[ 1: ] ) )
diff --git a/challenge-278/luca-ferrari/python/ch-2.py b/challenge-278/luca-ferrari/python/ch-2.py
new file mode 100644
index 0000000000..f82d4cf753
--- /dev/null
+++ b/challenge-278/luca-ferrari/python/ch-2.py
@@ -0,0 +1,33 @@
+#!python
+
+#
+# Perl Weekly Challenge 278
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+#
+
+import sys
+
+# task implementation
+# the return value will be printed
+def task_2( args ):
+ word = args[ 0 ]
+ c = args[ 1 ]
+
+ if not c in word:
+ return word
+
+ left = []
+
+ for x in word:
+ left.append( x )
+ if x == c:
+ break
+
+ return ''.join( list( sorted( left ) ) ) + word[ len( left ) : len( word ) ]
+
+
+# invoke the main without the command itself
+if __name__ == '__main__':
+ print( task_2( sys.argv[ 1: ] ) )
diff --git a/challenge-278/luca-ferrari/raku/ch-1.raku b/challenge-278/luca-ferrari/raku/ch-1.raku
new file mode 100644
index 0000000000..2ebb0d8241
--- /dev/null
+++ b/challenge-278/luca-ferrari/raku/ch-1.raku
@@ -0,0 +1,18 @@
+#!raku
+
+#
+# Perl Weekly Challenge 278
+# Task 1
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+#
+
+sub MAIN( *@words ) {
+ my %phrase;
+ for @words {
+ / ^ (<[a..zA..Z]>+) (\d) $ /;
+ %phrase{ $/[ 1 ] } = $/[ 0 ].Str;
+ }
+
+ %phrase.sort.map( { .value } ).join( ' ' ).say;
+}
diff --git a/challenge-278/luca-ferrari/raku/ch-2.raku b/challenge-278/luca-ferrari/raku/ch-2.raku
new file mode 100644
index 0000000000..7d75be0233
--- /dev/null
+++ b/challenge-278/luca-ferrari/raku/ch-2.raku
@@ -0,0 +1,20 @@
+#!raku
+
+#
+# Perl Weekly Challenge 278
+# Task 2
+#
+# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-278>
+#
+
+sub MAIN( Str $word, Str $char ) {
+ $word.say and exit if ( $word !~~ / $char / );
+
+ my @chars;
+ for $word.comb {
+ @chars.push: $_;
+ last if $_ eq $char;
+ }
+
+ say @chars.sort.join( '' ) ~ $word.comb[ @chars.elems .. * ].join( '' );
+}