diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2024-07-04 12:07:31 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-04 12:07:31 +0100 |
| commit | 5643586f6b68265209c87dafb3ae700da82f5727 (patch) | |
| tree | d83659a112a8c8cb86614378a7322c37f5ef8bb0 | |
| parent | d3cd6c8a7072e6f3566176284074c04501bfe8e3 (diff) | |
| parent | 9b806204f4bed333bb80aff676272d7c87b77dd8 (diff) | |
| download | perlweeklychallenge-club-5643586f6b68265209c87dafb3ae700da82f5727.tar.gz perlweeklychallenge-club-5643586f6b68265209c87dafb3ae700da82f5727.tar.bz2 perlweeklychallenge-club-5643586f6b68265209c87dafb3ae700da82f5727.zip | |
Merge pull request #10365 from fluca1978/PWC276
PWC 276
21 files changed, 337 insertions, 3 deletions
diff --git a/challenge-276/luca-ferrari/blog-1.txt b/challenge-276/luca-ferrari/blog-1.txt new file mode 100644 index 0000000000..49d7276abd --- /dev/null +++ b/challenge-276/luca-ferrari/blog-1.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task1 diff --git a/challenge-276/luca-ferrari/blog-10.txt b/challenge-276/luca-ferrari/blog-10.txt new file mode 100644 index 0000000000..6c64e028e3 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-10.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/[= date -%]/PerlWeeklyChallenge276.html#task2pljava diff --git a/challenge-276/luca-ferrari/blog-2.txt b/challenge-276/luca-ferrari/blog-2.txt new file mode 100644 index 0000000000..f20106e7ff --- /dev/null +++ b/challenge-276/luca-ferrari/blog-2.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task2 diff --git a/challenge-276/luca-ferrari/blog-3.txt b/challenge-276/luca-ferrari/blog-3.txt new file mode 100644 index 0000000000..814397d1b4 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-3.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task1plperl diff --git a/challenge-276/luca-ferrari/blog-4.txt b/challenge-276/luca-ferrari/blog-4.txt new file mode 100644 index 0000000000..c79f006e15 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-4.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task2plperl diff --git a/challenge-276/luca-ferrari/blog-5.txt b/challenge-276/luca-ferrari/blog-5.txt new file mode 100644 index 0000000000..3170dd6bb5 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-5.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task1plpgsql diff --git a/challenge-276/luca-ferrari/blog-6.txt b/challenge-276/luca-ferrari/blog-6.txt new file mode 100644 index 0000000000..61f21b1afa --- /dev/null +++ b/challenge-276/luca-ferrari/blog-6.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task2plpgsql diff --git a/challenge-276/luca-ferrari/blog-7.txt b/challenge-276/luca-ferrari/blog-7.txt new file mode 100644 index 0000000000..fb77b818d9 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-7.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task1python diff --git a/challenge-276/luca-ferrari/blog-8.txt b/challenge-276/luca-ferrari/blog-8.txt new file mode 100644 index 0000000000..336e7be525 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-8.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task2python diff --git a/challenge-276/luca-ferrari/blog-9.txt b/challenge-276/luca-ferrari/blog-9.txt new file mode 100644 index 0000000000..f17316ad26 --- /dev/null +++ b/challenge-276/luca-ferrari/blog-9.txt @@ -0,0 +1 @@ +https://fluca1978.github.io/2024/07/03/PerlWeeklyChallenge276.html#task1pljava diff --git a/challenge-276/luca-ferrari/pljava/pom.xml b/challenge-276/luca-ferrari/pljava/pom.xml index ea10099725..ab36c0045b 100644 --- a/challenge-276/luca-ferrari/pljava/pom.xml +++ b/challenge-276/luca-ferrari/pljava/pom.xml @@ -7,14 +7,14 @@ <groupId>PWC</groupId> <artifactId> - PWC275 + PWC276 </artifactId> <version> 1 </version> - <name>Perl Weekly Challenge 275 with package PWC275</name> - <description>Implementation of the tasks in PL/Java for PWC 275</description> + <name>Perl Weekly Challenge 276 with package PWC276</name> + <description>Implementation of the tasks in PL/Java for PWC 276</description> <properties> <project.build.sourceEncoding>US-ASCII</project.build.sourceEncoding> diff --git a/challenge-276/luca-ferrari/pljava/src/main/java/Task1.java b/challenge-276/luca-ferrari/pljava/src/main/java/Task1.java new file mode 100644 index 0000000000..b07f0eae45 --- /dev/null +++ b/challenge-276/luca-ferrari/pljava/src/main/java/Task1.java @@ -0,0 +1,62 @@ + + + +package PWC276; + +/** + * PL/Java implementation for PWC 276 + * Task 1 + * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> + * + * + * 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/PWC276-1.jar luca@rachel:/tmp + + + * To install into PostgreSQL execute: + + select sqlj.install_jar( 'file:///tmp/PWC276-1.jar', 'PWC276', true ); + select sqlj.set_classpath( 'public', 'PWC276' ); + + select pwc276.task2_pljava(); + + and then to redeploy: + + select sqlj.replace_jar( 'file:///tmp/PWC276-1.jar', 'PWC276', 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 = "pwc276", + onNullInput = RETURNS_NULL, + effects = IMMUTABLE ) + public static final String[] task1_pljava( int[] hours ) throws SQLException { + logger.log( Level.INFO, "Entering pwc276.task1_pljava" ); + + List<String> result = new LinkedList<String>(); + for ( int i = 0; i < hours.length - 1; i++ ) + for ( int j = i + 1; j < hours.length; j++ ) + if ( ( hours[ i ] + hours[ j ] ) % 24 == 0 ) + result.add( String.format( "%02d + %02d", hours[ i ], hours[ j ] ) ); + + return result.toArray( new String[ 0 ] ); + } +} diff --git a/challenge-276/luca-ferrari/pljava/src/main/java/Task2.java b/challenge-276/luca-ferrari/pljava/src/main/java/Task2.java new file mode 100644 index 0000000000..4899a3f15e --- /dev/null +++ b/challenge-276/luca-ferrari/pljava/src/main/java/Task2.java @@ -0,0 +1,75 @@ + + + +package PWC276; + +/** + * PL/Java implementation for PWC 276 + * Task 2 + * See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> + * + * + * 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/PWC276-1.jar luca@rachel:/tmp + + + * To install into PostgreSQL execute: + + select sqlj.install_jar( 'file:///tmp/PWC276-1.jar', 'PWC276', true ); + select sqlj.set_classpath( 'public', 'PWC276' ); + + select pwc276.task2_pljava(); + + and then to redeploy: + + select sqlj.replace_jar( 'file:///tmp/PWC276-1.jar', 'PWC276', 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 = "pwc276", + onNullInput = RETURNS_NULL, + effects = IMMUTABLE ) + public static final int task2_pljava( int[] nums ) throws SQLException { + logger.log( Level.INFO, "Entering pwc276.task2_pljava" ); + + final Map<Integer, List<Integer>> frequency = new HashMap<Integer, List<Integer>>(); + + Arrays.stream( nums ) + .forEach( v -> { + int freq = (int) Arrays.stream( nums ).filter( k -> k == v ).count(); + frequency.putIfAbsent( freq, new LinkedList<Integer>() ); + if ( ! frequency.get( freq ).contains( v ) ) + frequency.get( freq ).add( v ); + } ); + + final int[] max = new int[]{ 0, 0 }; + // find out the max frequency + frequency.keySet().stream().forEach( k -> { + if ( k > max[ 0 ] ) { + max[ 0 ] = k; + max[ 1 ] = frequency.get( k ).size(); + } + } ); + + return max[ 1 ]; + } +} diff --git a/challenge-276/luca-ferrari/plperl/ch-1.plperl b/challenge-276/luca-ferrari/plperl/ch-1.plperl new file mode 100644 index 0000000000..f1c7e03e4e --- /dev/null +++ b/challenge-276/luca-ferrari/plperl/ch-1.plperl @@ -0,0 +1,24 @@ +-- +-- Perl Weekly Challenge 276 +-- Task 1 +-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +-- + +CREATE SCHEMA IF NOT EXISTS pwc276; + +CREATE OR REPLACE FUNCTION +pwc276.task1_plperl( int[] ) +RETURNS SETOF int[] +AS $CODE$ + use Algorithm::Combinatorics qw/ combinations /; + + my ( $hours ) = @_; + my $iterator = combinations( \ $hours->@*, 2 ); + while( my $c = $iterator->next ) { + return_next( $c ) if ( ( $c->@[ 0 ] + $c->@[ 1 ] ) % 24 == 0 ); + } + + return undef; + +$CODE$ +LANGUAGE plperlu; diff --git a/challenge-276/luca-ferrari/plperl/ch-2.plperl b/challenge-276/luca-ferrari/plperl/ch-2.plperl new file mode 100644 index 0000000000..7eea6a5c05 --- /dev/null +++ b/challenge-276/luca-ferrari/plperl/ch-2.plperl @@ -0,0 +1,27 @@ +-- +-- Perl Weekly Challenge 276 +-- Task 2 +-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +-- + +CREATE SCHEMA IF NOT EXISTS pwc276; + +CREATE OR REPLACE FUNCTION +pwc276.task2_plperl( int[] ) +RETURNS int +AS $CODE$ + + my ( $nums ) = @_; + die "Need only positives" if ( grep { $_ <= 0 } $nums->@* ); + + my $frequency = {}; + for my $current ( $nums->@* ) { + my $count = scalar grep { $_ == $current } $nums->@*; + push $frequency->{ $count }->@*, $current if ( ! grep { $_ == $current } $frequency->{ $count }->@* ); + } + + my $max_frequency = ( sort( { $b <=> $a } keys $frequency->%* ) )[ 0 ]; + return scalar $frequency->{ $max_frequency }->@*; + +$CODE$ +LANGUAGE plperl; diff --git a/challenge-276/luca-ferrari/plpgsql/ch-1.sql b/challenge-276/luca-ferrari/plpgsql/ch-1.sql new file mode 100644 index 0000000000..e25dc4d1a2 --- /dev/null +++ b/challenge-276/luca-ferrari/plpgsql/ch-1.sql @@ -0,0 +1,25 @@ +-- +-- Perl Weekly Challenge 276 +-- Task 1 +-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +-- + +CREATE SCHEMA IF NOT EXISTS pwc276; + +CREATE OR REPLACE FUNCTION +pwc276.task1_plpgsql( hours int[] ) +RETURNS TABLE( l int, r int ) +AS $CODE$ + + WITH elems AS ( SELECT v::int, row_number() OVER ( ORDER BY v ) AS r + FROM unnest( hours ) v + ) + + SELECT l.v::int, r.v::int + FROM elems l, elems r + WHERE mod( ( l.v::int + r.v::int ), 24 ) = 0 + AND l.r < r. r + ; + +$CODE$ +LANGUAGE sql; diff --git a/challenge-276/luca-ferrari/plpgsql/ch-2.sql b/challenge-276/luca-ferrari/plpgsql/ch-2.sql new file mode 100644 index 0000000000..8f2a453dfc --- /dev/null +++ b/challenge-276/luca-ferrari/plpgsql/ch-2.sql @@ -0,0 +1,28 @@ +-- +-- Perl Weekly Challenge 276 +-- Task 2 +-- See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +-- + +CREATE SCHEMA IF NOT EXISTS pwc276; + +CREATE OR REPLACE FUNCTION +pwc276.task2_plpgsql( nums int[] ) +RETURNS int +AS $CODE$ + WITH freq AS ( + SELECT count( v ) as frequency, v + FROM unnest( nums ) v + GROUP BY v + ) + , max_freq AS ( SELECT frequency FROM freq + ORDER BY 1 DESC + LIMIT 1 + ) + SELECT count( f ) + FROM freq f + WHERE f.frequency = ( SELECT frequency FROM max_freq ) + + ; +$CODE$ +LANGUAGE sql; diff --git a/challenge-276/luca-ferrari/python/ch-1.py b/challenge-276/luca-ferrari/python/ch-1.py new file mode 100644 index 0000000000..c38a3489ef --- /dev/null +++ b/challenge-276/luca-ferrari/python/ch-1.py @@ -0,0 +1,22 @@ +#!python + +# +# Perl Weekly Challenge 276 +# Task 1 +# +# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +# + +import sys +from itertools import combinations + +# task implementation +# the return value will be printed +def task_1( args ): + hours = list( map( int, args ) ) + return list( filter( lambda v: ( v[ 0 ] + v[ 1 ] ) % 24 == 0, list( combinations( hours, 2 ) ) ) ) + + +# invoke the main without the command itself +if __name__ == '__main__': + print( task_1( sys.argv[ 1: ] ) ) diff --git a/challenge-276/luca-ferrari/python/ch-2.py b/challenge-276/luca-ferrari/python/ch-2.py new file mode 100644 index 0000000000..adb177062d --- /dev/null +++ b/challenge-276/luca-ferrari/python/ch-2.py @@ -0,0 +1,35 @@ +#!python + +# +# Perl Weekly Challenge 276 +# Task 2 +# +# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +# + +import sys + +# task implementation +# the return value will be printed +def task_2( args ): + nums = list( map( int, args ) ) + frequency = {} + max_freq = 0 + + for x in nums: + freq = len( list( filter( lambda v: v == x, nums ) ) ) + if freq > max_freq: + max_freq = freq + + if not freq in frequency: + frequency[ freq ] = [] + + if not x in frequency[ freq ]: + frequency[ freq ].append( x ) + + + return len( frequency[ max_freq ] ) + +# invoke the main without the command itself +if __name__ == '__main__': + print( task_2( sys.argv[ 1: ] ) ) diff --git a/challenge-276/luca-ferrari/raku/ch-1.raku b/challenge-276/luca-ferrari/raku/ch-1.raku new file mode 100644 index 0000000000..4bf28ca5bc --- /dev/null +++ b/challenge-276/luca-ferrari/raku/ch-1.raku @@ -0,0 +1,12 @@ +#!raku + +# +# Perl Weekly Challenge 276 +# Task 1 +# +# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +# + +sub MAIN( *@hours where { @hours.elems == @hours.grep( * ~~ Int ) } ) { + @hours.combinations( 2 ).grep( { ( $_[ 0 ] + $_[ 1 ] ) %% 24 } ).say; +} diff --git a/challenge-276/luca-ferrari/raku/ch-2.raku b/challenge-276/luca-ferrari/raku/ch-2.raku new file mode 100644 index 0000000000..8986c07cf3 --- /dev/null +++ b/challenge-276/luca-ferrari/raku/ch-2.raku @@ -0,0 +1,14 @@ +#!raku + +# +# Perl Weekly Challenge 276 +# Task 2 +# +# See <https://perlweeklychallenge.org/blog/perl-weekly-challenge-276> +# + +sub MAIN( *@nums where { @nums.elems == @nums.grep( { $_ ~~ Int && $_ > 0 } ).elems } ) { + my %frequency; + %frequency{ @nums.grep( * ~~ $_ ).elems }.push: $_ for @nums; + %frequency{ %frequency.keys.max }.unique.elems.say; +} |
