From 52e2018af75d08a9b77b8e3bb56a7b2fffc6f42b Mon Sep 17 00:00:00 2001 From: Luca Ferrari Date: Mon, 22 Jan 2024 08:54:32 +0100 Subject: PWC 253 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 Python done Task 2 Python done Task 1 PL/Java done Task 2 PL/Java done --- challenge-253/luca-ferrari/blog-1.txt | 1 + challenge-253/luca-ferrari/blog-10.txt | 1 + challenge-253/luca-ferrari/blog-2.txt | 1 + challenge-253/luca-ferrari/blog-3.txt | 1 + challenge-253/luca-ferrari/blog-4.txt | 1 + challenge-253/luca-ferrari/blog-5.txt | 1 + challenge-253/luca-ferrari/blog-6.txt | 1 + challenge-253/luca-ferrari/blog-7.txt | 1 + challenge-253/luca-ferrari/blog-8.txt | 1 + challenge-253/luca-ferrari/blog-9.txt | 1 + challenge-253/luca-ferrari/pljava/pom.xml | 67 +++++++++++++++++++ .../luca-ferrari/pljava/src/main/java/Task1.java | 49 ++++++++++++++ .../luca-ferrari/pljava/src/main/java/Task2.java | 75 ++++++++++++++++++++++ challenge-253/luca-ferrari/plperl/ch-1.plperl | 28 ++++++++ challenge-253/luca-ferrari/plperl/ch-2.plperl | 38 +++++++++++ challenge-253/luca-ferrari/plpgsql/ch-1.sql | 24 +++++++ challenge-253/luca-ferrari/plpgsql/ch-2.sql | 40 ++++++++++++ challenge-253/luca-ferrari/python/ch-1.python | 28 ++++++++ challenge-253/luca-ferrari/python/ch-2.python | 49 ++++++++++++++ challenge-253/luca-ferrari/raku/ch-1.raku | 12 ++++ challenge-253/luca-ferrari/raku/ch-2.raku | 29 +++++++++ 21 files changed, 449 insertions(+) create mode 100644 challenge-253/luca-ferrari/blog-1.txt create mode 100644 challenge-253/luca-ferrari/blog-10.txt create mode 100644 challenge-253/luca-ferrari/blog-2.txt create mode 100644 challenge-253/luca-ferrari/blog-3.txt create mode 100644 challenge-253/luca-ferrari/blog-4.txt create mode 100644 challenge-253/luca-ferrari/blog-5.txt create mode 100644 challenge-253/luca-ferrari/blog-6.txt create mode 100644 challenge-253/luca-ferrari/blog-7.txt create mode 100644 challenge-253/luca-ferrari/blog-8.txt create mode 100644 challenge-253/luca-ferrari/blog-9.txt create mode 100644 challenge-253/luca-ferrari/pljava/pom.xml create mode 100644 challenge-253/luca-ferrari/pljava/src/main/java/Task1.java create mode 100644 challenge-253/luca-ferrari/pljava/src/main/java/Task2.java create mode 100644 challenge-253/luca-ferrari/plperl/ch-1.plperl create mode 100644 challenge-253/luca-ferrari/plperl/ch-2.plperl create mode 100644 challenge-253/luca-ferrari/plpgsql/ch-1.sql create mode 100644 challenge-253/luca-ferrari/plpgsql/ch-2.sql create mode 100644 challenge-253/luca-ferrari/python/ch-1.python create mode 100644 challenge-253/luca-ferrari/python/ch-2.python create mode 100644 challenge-253/luca-ferrari/raku/ch-1.raku create mode 100644 challenge-253/luca-ferrari/raku/ch-2.raku diff --git a/challenge-253/luca-ferrari/blog-1.txt b/challenge-253/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..a812e9dccc --- /dev/null +++ b/challenge-253/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task1 diff --git a/challenge-253/luca-ferrari/blog-10.txt b/challenge-253/luca-ferrari/blog-10.txt new file mode 100644 index 0000000000..5b8450592a --- /dev/null +++ b/challenge-253/luca-ferrari/blog-10.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/[= date -%]/PerlWeeklyChallenge253.html#task2pljava diff --git a/challenge-253/luca-ferrari/blog-2.txt b/challenge-253/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..cbf694933d --- /dev/null +++ b/challenge-253/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task2 diff --git a/challenge-253/luca-ferrari/blog-3.txt b/challenge-253/luca-ferrari/blog-3.txt new file mode 100644 index 0000000000..d8c14d0691 --- /dev/null +++ b/challenge-253/luca-ferrari/blog-3.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task1plperl diff --git a/challenge-253/luca-ferrari/blog-4.txt b/challenge-253/luca-ferrari/blog-4.txt new file mode 100644 index 0000000000..627b98ae6e --- /dev/null +++ b/challenge-253/luca-ferrari/blog-4.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task2plperl diff --git a/challenge-253/luca-ferrari/blog-5.txt b/challenge-253/luca-ferrari/blog-5.txt new file mode 100644 index 0000000000..07ebc3095b --- /dev/null +++ b/challenge-253/luca-ferrari/blog-5.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task1plpgsql diff --git a/challenge-253/luca-ferrari/blog-6.txt b/challenge-253/luca-ferrari/blog-6.txt new file mode 100644 index 0000000000..eecee2c6bb --- /dev/null +++ b/challenge-253/luca-ferrari/blog-6.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task2plpgsql diff --git a/challenge-253/luca-ferrari/blog-7.txt b/challenge-253/luca-ferrari/blog-7.txt new file mode 100644 index 0000000000..7091a103e7 --- /dev/null +++ b/challenge-253/luca-ferrari/blog-7.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task1python diff --git a/challenge-253/luca-ferrari/blog-8.txt b/challenge-253/luca-ferrari/blog-8.txt new file mode 100644 index 0000000000..2a5fe0f0da --- /dev/null +++ b/challenge-253/luca-ferrari/blog-8.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task2python diff --git a/challenge-253/luca-ferrari/blog-9.txt b/challenge-253/luca-ferrari/blog-9.txt new file mode 100644 index 0000000000..09d1d4786f --- /dev/null +++ b/challenge-253/luca-ferrari/blog-9.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/01/22/PerlWeeklyChallenge253.html#task1pljava diff --git a/challenge-253/luca-ferrari/pljava/pom.xml b/challenge-253/luca-ferrari/pljava/pom.xml new file mode 100644 index 0000000000..d9047c527c --- /dev/null +++ b/challenge-253/luca-ferrari/pljava/pom.xml @@ -0,0 +1,67 @@ + + 4.0.0 + + PWC + PWC253 + 1 + + Perl Weekly Challenge 253 + Implementation of the tasks in PL/Java for PWC 253 + + + US-ASCII + + + + + org.postgresql + pljava-api + 1.6.6 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 9 + + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + + + + true + + + + + + + pljava.ddr + + + true + + + + + + + + + + diff --git a/challenge-253/luca-ferrari/pljava/src/main/java/Task1.java b/challenge-253/luca-ferrari/pljava/src/main/java/Task1.java new file mode 100644 index 0000000000..af8329b557 --- /dev/null +++ b/challenge-253/luca-ferrari/pljava/src/main/java/Task1.java @@ -0,0 +1,49 @@ +package PWC253; + +/** + * PL/Java implementation for PWC 253 + * Task 1 + * See + * + * To install into PostgreSQL execute: + + select sqlj.install_jar( 'file:///tmp/PWC253.1.jar', 'PWC253', true ); + select sqlj.set_classpath( 'public', 'PWC253' ); + + select task$tn_pljava(); + +*/ + +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.logging.*; + +public class Task1 { + private final static Logger logger = Logger.getAnonymousLogger(); + + @Function( onNullInput = RETURNS_NULL, effects = IMMUTABLE ) + public static final String[] task1_pljava( String separator, String[] words ) { + List result = new LinkedList(); + logger.info( "Entering task1_pljava" ); + for ( String w : words ) { + if ( ! w.contains( separator ) ) + result.add( w ); + else + System.out.println( "SPLITTO " + w ); + for ( String ww : w.split( "[" + separator + "]" ) ) { + result.add( ww ); + } + } + + return result.toArray( new String[ result.size() ] ); + } + + @Function + public static void logMessage(String logLevel, String message) { + Logger.getAnonymousLogger().log(Level.parse(logLevel), message); + } +} diff --git a/challenge-253/luca-ferrari/pljava/src/main/java/Task2.java b/challenge-253/luca-ferrari/pljava/src/main/java/Task2.java new file mode 100644 index 0000000000..9afa1e555f --- /dev/null +++ b/challenge-253/luca-ferrari/pljava/src/main/java/Task2.java @@ -0,0 +1,75 @@ +package PWC253; + +/** + * PL/Java implementation for PWC 253 + * Task 2 + * See + * + * To install into PostgreSQL execute: + + select sqlj.install_jar( 'file:///tmp/PWC253.1.jar', 'PWC253', true ); + select sqlj.set_classpath( 'public', 'PWC253' ); + + select task$tn_pljava(); + +*/ + +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.*; + +/* + example of invocation + + java=# select task2_pljava( 4 , array[ + [1, 0, 0, 0], + [1, 1, 1, 1], + [1, 0, 0, 0], + [1, 0, 0, 0] + ] ); + task2_pljava +-------------- + {0,2,3,1} +(1 row) + + +*/ +public class Task2 { + + @Function( onNullInput = RETURNS_NULL, effects = IMMUTABLE ) + public static final Integer[] task2_pljava( int size, int[] matrix ) throws Exception { + int row_index = 0; + Map> ones = new HashMap>(); + + int number_of_ones = 0; + + for ( int i = 0; i < matrix.length; i++ ) { + number_of_ones += matrix[ i ]; + if ( ( i + 1 ) % size == 0 || i == matrix.length ) { + + if ( ! ones.containsKey( number_of_ones ) ) + ones.put( number_of_ones, new LinkedList() ); + + ones.get( number_of_ones ).add( row_index++ ); + number_of_ones = 0; + } + + + } + + List keys = new LinkedList( ones.keySet() ); + Collections.sort( keys ); + + List result = new LinkedList(); + for ( int k : keys ) { + List values = ones.get( k ); + Collections.sort( values ); + result.addAll( values ); + } + + return result.toArray( new Integer[ result.size() ] ); + } +} diff --git a/challenge-253/luca-ferrari/plperl/ch-1.plperl b/challenge-253/luca-ferrari/plperl/ch-1.plperl new file mode 100644 index 0000000000..0d75a2c6a2 --- /dev/null +++ b/challenge-253/luca-ferrari/plperl/ch-1.plperl @@ -0,0 +1,28 @@ +-- +-- Perl Weekly Challenge 253 +-- Task 1 +-- See +-- + +CREATE SCHEMA IF NOT EXISTS pwc253; + +CREATE OR REPLACE FUNCTION +pwc253.task1_plperl( char, text[] ) +RETURNS SETOF text +AS $CODE$ + + my ( $separator, $words ) = @_; + for my $word ( $words->@* ) { + my $pattern = qr/ [$separator] /x; + + if ( $word !~ $pattern ) { + return_next( $word ); + next; + } + + return_next( $_ ) for ( split( /$pattern/, $word ) ); + } + +return undef; +$CODE$ +LANGUAGE plperl; diff --git a/challenge-253/luca-ferrari/plperl/ch-2.plperl b/challenge-253/luca-ferrari/plperl/ch-2.plperl new file mode 100644 index 0000000000..2d7abeb5c6 --- /dev/null +++ b/challenge-253/luca-ferrari/plperl/ch-2.plperl @@ -0,0 +1,38 @@ +-- +-- Perl Weekly Challenge 253 +-- Task 2 +-- See +-- + +CREATE SCHEMA IF NOT EXISTS pwc253; + +/** + * Example of invocation + testdb=> select pwc253.task2_plperl( array[ [1, 1, 0, 0, 0], + [1, 1, 1, 1, 0], + [1, 0, 0, 0, 0], + [1, 1, 0, 0, 0], + [1, 1, 1, 1, 1] ] ); +*/ +CREATE OR REPLACE FUNCTION +pwc253.task2_plperl( int[] ) +RETURNS SETOF int +AS $CODE$ + + my ( $matrix ) = @_; + + my $ones = {}; + + for my $row_index ( 0 .. $matrix->@* - 1 ) { + my $count = scalar grep { $_ == 1 } $matrix->[ $row_index ]->@*; + push $ones->{ $count }->@*, $row_index; + } + + for my $count ( sort keys $ones->%* ) { + return_next( $_ ) for ( sort $ones->{ $count }->@* ); + } + +return undef; + +$CODE$ +LANGUAGE plperl; diff --git a/challenge-253/luca-ferrari/plpgsql/ch-1.sql b/challenge-253/luca-ferrari/plpgsql/ch-1.sql new file mode 100644 index 0000000000..78911752d1 --- /dev/null +++ b/challenge-253/luca-ferrari/plpgsql/ch-1.sql @@ -0,0 +1,24 @@ +-- +-- Perl Weekly Challenge 253 +-- Task 1 +-- See +-- + +CREATE SCHEMA IF NOT EXISTS pwc253; + +CREATE OR REPLACE FUNCTION +pwc253.task1_plpgsql( s char, words text[] ) +RETURNS SETOF text +AS $CODE$ +DECLARE + current_word text; +BEGIN + FOREACH current_word IN ARRAY words LOOP + RETURN QUERY + SELECT regexp_split_to_table( current_word, '[' || s || ']' ); + END LOOP; + +RETURN; +END +$CODE$ +LANGUAGE plpgsql; diff --git a/challenge-253/luca-ferrari/plpgsql/ch-2.sql b/challenge-253/luca-ferrari/plpgsql/ch-2.sql new file mode 100644 index 0000000000..80971effac --- /dev/null +++ b/challenge-253/luca-ferrari/plpgsql/ch-2.sql @@ -0,0 +1,40 @@ +-- +-- Perl Weekly Challenge 253 +-- Task 2 +-- See +-- + +CREATE SCHEMA IF NOT EXISTS pwc253; + +CREATE OR REPLACE FUNCTION +pwc253.task2_plpgsql( matrix int[][] ) +RETURNS SETOF int +AS $CODE$ +DECLARE + current_row int[]; + c_ones int; +BEGIN + CREATE TEMPORARY TABLE IF NOT EXISTS ones( r int, c int ); + TRUNCATE ones; + + FOR i IN 1 .. array_length( matrix, 1 ) LOOP + c_ones := 0; + FOR j IN 1 .. array_length( matrix, 2 ) LOOP + c_ones := c_ones + matrix[ i ][ j ]; + END LOOP; + + INSERT INTO ones + SELECT i, c_ones; + + END LOOP; + + RETURN QUERY + SELECT r + FROM ones + ORDER BY c DESC, r ASC; + + +RETURN; +END +$CODE$ +LANGUAGE plpgsql; diff --git a/challenge-253/luca-ferrari/python/ch-1.python b/challenge-253/luca-ferrari/python/ch-1.python new file mode 100644 index 0000000000..07a97f09cd --- /dev/null +++ b/challenge-253/luca-ferrari/python/ch-1.python @@ -0,0 +1,28 @@ +#!python + +# +# Perl Weekly Challenge 253 +# Task 1 +# +# See +# + +import sys +import re + +# task implementation +# the return value will be printed +def task_1( args ): + separator = args[ 0 ]; + split_words = [] + for i in range( 1, len( args ) ): + current_words = args[ i ] + for w in re.split( "[%s]" % separator, current_words ): + split_words.append( w ) + + return ','.join( split_words ) + + +# invoke the main without the command itself +if __name__ == '__main__': + print( task_1( sys.argv[ 1: ] ) ) diff --git a/challenge-253/luca-ferrari/python/ch-2.python b/challenge-253/luca-ferrari/python/ch-2.python new file mode 100644 index 0000000000..2e4abff0e5 --- /dev/null +++ b/challenge-253/luca-ferrari/python/ch-2.python @@ -0,0 +1,49 @@ +#!python + +# +# Perl Weekly Challenge 253 +# Task 2 +# +# See +# + +import sys +import collections + +# task implementation +# the return value will be printed +def task_2( args ): + ones = {} + for row_index in range( 0, len( args ) ): + sum = 0 + for x in args[ row_index ]: + sum += x + + if not sum in ones: + ones[ str( sum ) ] = [] + + ones[ str( sum ) ].append( row_index ) + + keys = list( ones.keys() ) + keys.sort() + result = "" + for k in keys: + ones[ k ].sort() + for v in ones[ k ]: + result += str( v ) + ',' + + + return result + + + +# invoke the main without the command itself +if __name__ == '__main__': + matrix = [ + [1, 1, 0, 0, 0], + [1, 1, 1, 1, 0], + [1, 0, 0, 0, 0], + [1, 1, 0, 0, 0], + [1, 1, 1, 1, 1] + ] + print( task_2( matrix ) ) diff --git a/challenge-253/luca-ferrari/raku/ch-1.raku b/challenge-253/luca-ferrari/raku/ch-1.raku new file mode 100644 index 0000000000..e907262eea --- /dev/null +++ b/challenge-253/luca-ferrari/raku/ch-1.raku @@ -0,0 +1,12 @@ +#!raku + +# +# Perl Weekly Challenge 253 +# Task 1 +# +# See +# + +sub MAIN( $separator, *@words ) { + @words.split( $separator, :skip-empty ).join( ',' ).say; +} diff --git a/challenge-253/luca-ferrari/raku/ch-2.raku b/challenge-253/luca-ferrari/raku/ch-2.raku new file mode 100644 index 0000000000..2d0a7da4e5 --- /dev/null +++ b/challenge-253/luca-ferrari/raku/ch-2.raku @@ -0,0 +1,29 @@ +#!raku + +# +# Perl Weekly Challenge 253 +# Task 2 +# +# See +# + +sub MAIN() { + + my $matrix = [ + [1, 1, 0, 0, 0], + [1, 1, 1, 1, 0], + [1, 0, 0, 0, 0], + [1, 1, 0, 0, 0], + [1, 1, 1, 1, 1] + ]; + + my %ones; + for 0 ..^ $matrix.elems -> $row_index { + my $count = $matrix[ $row_index ].grep( * ~~ 1 ).elems; + %ones{ $count }.push: $row_index; + } + + + my @rows.push: |%ones{ $_ }.sort for %ones.keys.sort; + @rows.join( ', ').say; +} -- cgit