diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2024-07-16 11:48:42 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-16 11:48:42 +0100 |
| commit | c65f28455c8900599032071d018e679d67cbee1f (patch) | |
| tree | 086b3286d7c97a8cda6bb7057e8d3e072fc40cd0 | |
| parent | 452785082337f497c33a2f9ce1ed96b35d9a3d4c (diff) | |
| parent | d5c82371fcc0e58f01b3457e71d7fff99a709eb4 (diff) | |
| download | perlweeklychallenge-club-c65f28455c8900599032071d018e679d67cbee1f.tar.gz perlweeklychallenge-club-c65f28455c8900599032071d018e679d67cbee1f.tar.bz2 perlweeklychallenge-club-c65f28455c8900599032071d018e679d67cbee1f.zip | |
Merge pull request #10446 from fluca1978/PWC278
PWC 278
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( '' ); +} |
