aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2024-07-03 09:59:54 +0200
committerLuca Ferrari <fluca1978@gmail.com>2024-07-03 11:50:34 +0200
commit9b806204f4bed333bb80aff676272d7c87b77dd8 (patch)
treed83659a112a8c8cb86614378a7322c37f5ef8bb0
parentd3cd6c8a7072e6f3566176284074c04501bfe8e3 (diff)
downloadperlweeklychallenge-club-9b806204f4bed333bb80aff676272d7c87b77dd8.tar.gz
perlweeklychallenge-club-9b806204f4bed333bb80aff676272d7c87b77dd8.tar.bz2
perlweeklychallenge-club-9b806204f4bed333bb80aff676272d7c87b77dd8.zip
PWC 276
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 PL/Java done Task 2 PL/Java done Task 1 Python done Task 2 Python done
-rw-r--r--challenge-276/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-10.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-7.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-8.txt1
-rw-r--r--challenge-276/luca-ferrari/blog-9.txt1
-rw-r--r--challenge-276/luca-ferrari/pljava/pom.xml6
-rw-r--r--challenge-276/luca-ferrari/pljava/src/main/java/Task1.java62
-rw-r--r--challenge-276/luca-ferrari/pljava/src/main/java/Task2.java75
-rw-r--r--challenge-276/luca-ferrari/plperl/ch-1.plperl24
-rw-r--r--challenge-276/luca-ferrari/plperl/ch-2.plperl27
-rw-r--r--challenge-276/luca-ferrari/plpgsql/ch-1.sql25
-rw-r--r--challenge-276/luca-ferrari/plpgsql/ch-2.sql28
-rw-r--r--challenge-276/luca-ferrari/python/ch-1.py22
-rw-r--r--challenge-276/luca-ferrari/python/ch-2.py35
-rw-r--r--challenge-276/luca-ferrari/raku/ch-1.raku12
-rw-r--r--challenge-276/luca-ferrari/raku/ch-2.raku14
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;
+}