aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-05-23 21:18:48 +0100
committerGitHub <noreply@github.com>2022-05-23 21:18:48 +0100
commit3d33d824d6e484b28463f08cb1675ddf7bf3c63e (patch)
tree37709a0adf9b8a2d6c7ce2d6a32ee002f81c096c
parent8ef75eb62757cce883f7a074e224973acbae60da (diff)
parent9c735e1a0679d8765ae3aa28305aa9bea94cc4b7 (diff)
downloadperlweeklychallenge-club-3d33d824d6e484b28463f08cb1675ddf7bf3c63e.tar.gz
perlweeklychallenge-club-3d33d824d6e484b28463f08cb1675ddf7bf3c63e.tar.bz2
perlweeklychallenge-club-3d33d824d6e484b28463f08cb1675ddf7bf3c63e.zip
Merge pull request #6151 from fluca1978/PWC166
PWC 166.
-rw-r--r--challenge-166/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-166/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-166/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-166/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-166/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-166/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-166/luca-ferrari/postgresql/ch-1.plperl57
-rw-r--r--challenge-166/luca-ferrari/postgresql/ch-1.sql23
-rw-r--r--challenge-166/luca-ferrari/postgresql/ch-2.plperl59
-rw-r--r--challenge-166/luca-ferrari/postgresql/ch-2.sql30
-rwxr-xr-xchallenge-166/luca-ferrari/raku/ch-1.p627
-rwxr-xr-xchallenge-166/luca-ferrari/raku/ch-2.p630
-rw-r--r--challenge-166/luca-ferrari/raku/dir_a/Arial.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_a/Comic_Sans.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_a/Georgia.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_a/Helvetica.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_a/Impact.otf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_a/Verdana.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Arial.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Comic_Sans.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Courier_New.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Helvetica.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Impact.otf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Tahoma.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_b/Verdana.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_c/Arial.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_c/Courier_New.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_c/Helvetica.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_c/Impact.otf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_c/Monaco.ttf0
-rw-r--r--challenge-166/luca-ferrari/raku/dir_c/Verdana.ttf0
31 files changed, 232 insertions, 0 deletions
diff --git a/challenge-166/luca-ferrari/blog-1.txt b/challenge-166/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..e4a6b9111c
--- /dev/null
+++ b/challenge-166/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/05/23/PerlWeeklyChallenge166.html#task1
diff --git a/challenge-166/luca-ferrari/blog-2.txt b/challenge-166/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..be8da77805
--- /dev/null
+++ b/challenge-166/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/05/23/PerlWeeklyChallenge166.html#task2
diff --git a/challenge-166/luca-ferrari/blog-3.txt b/challenge-166/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..0158d08a4b
--- /dev/null
+++ b/challenge-166/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/05/23/PerlWeeklyChallenge166.html#task1plperl
diff --git a/challenge-166/luca-ferrari/blog-4.txt b/challenge-166/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..d2e5babbc5
--- /dev/null
+++ b/challenge-166/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/05/23/PerlWeeklyChallenge166.html#task2plperl
diff --git a/challenge-166/luca-ferrari/blog-5.txt b/challenge-166/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..2f55b7ebd6
--- /dev/null
+++ b/challenge-166/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/05/23/PerlWeeklyChallenge166.html#task1plpgsql
diff --git a/challenge-166/luca-ferrari/blog-6.txt b/challenge-166/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..f03f680901
--- /dev/null
+++ b/challenge-166/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/05/23/PerlWeeklyChallenge166.html#task2plpgsql
diff --git a/challenge-166/luca-ferrari/postgresql/ch-1.plperl b/challenge-166/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..93786fd31e
--- /dev/null
+++ b/challenge-166/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,57 @@
+-- Perl Weekly Challenge 166
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc166;
+
+CREATE OR REPLACE FUNCTION
+pwc166.task1_plperl( text, int, int )
+RETURNS SETOF text
+AS $CODE$
+my ($filename, $min, $max) = @_;
+my $line;
+my $substitutions = { o => 0,
+ l => 1,
+ i => 1,
+ s => 5,
+ t => 7 };
+
+open my $file, "<", $filename;
+
+while ( $line = <$file> ) {
+ chomp $line;
+ next if length( $line ) < $min || length( $line ) > $max;
+
+ $line = lc $line;
+ next if $line !~ /^[a..folist]+$/;
+
+ for my $k ( keys( %$substitutions ) ) {
+ $line =~ s/$k/$substitutions->{ $k }/g;
+ }
+
+ return_next( $line );
+}
+
+close $file;
+return undef;
+
+$CODE$
+LANGUAGE plperlu;
+
+
+/*
+testdb=# select * from pwc166.task1_plperl( '/tmp/dictionary.txt', 2, 8 ) limit 10;
+ task1_plperl
+--------------
+ af10a7
+ af007
+ a11
+ a115
+ a1a5
+ a11a5
+ a11
+ a1107
+ a11075
+ a10f7
+(10 rows)
+
+*/
diff --git a/challenge-166/luca-ferrari/postgresql/ch-1.sql b/challenge-166/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..7712cbf4e9
--- /dev/null
+++ b/challenge-166/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,23 @@
+-- Perl Weekly Challenge 166
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc166;
+
+create table if not exists pwc166.dictionary( word text );
+truncate pwc166.dictionary;
+copy pwc166.dictionary from '/tmp/dictionary.txt';
+
+SELECT word,
+ regexp_replace(
+ regexp_replace(
+ regexp_replace(
+ regexp_replace( lower( word ), 'o', '0', 'g' ),
+ 'l|i', '1', 'g' ),
+ 's', '5', 'g' ),
+ 't', '7', 'g' )
+FROM pwc166.dictionary
+WHERE
+length( word ) >= 2
+AND length( word ) <= 8
+AND word ~* '^[a-folist]+$'
+;
diff --git a/challenge-166/luca-ferrari/postgresql/ch-2.plperl b/challenge-166/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..c5cf26ed7f
--- /dev/null
+++ b/challenge-166/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,59 @@
+-- Perl Weekly Challenge 166
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc166;
+
+CREATE OR REPLACE FUNCTION
+pwc166.task2_plperl( text, text, text )
+RETURNS TABLE( dir_a text , dir_b text , dir_c text )
+AS $CODE$
+my ( $dir_a, $dir_b, $dir_c ) = @_;
+my $files = {};
+my @dirs;
+my $index = -1;
+
+for my $current_dir ( @_ ) {
+ elog( INFO, "Opening $current_dir" );
+ $index++;
+ push @dirs, "dir_" . ( 'a' .. 'c' )[ $index ];
+ opendir my $dir, $current_dir;
+ while ( my $entry = readdir( $dir ) ) {
+ my $filename = $entry . ( -f "$current_dir/$entry" ? "" : "/" );
+ push $files->{ $filename }->@*, "dir_" . ( 'a' .. 'c' )[ $index ];
+ }
+ closedir $dir;
+}
+
+for my $filename ( sort keys( $files->%* ) ) {
+ next if scalar( $files->{ $filename }->@* ) == scalar @_;
+ my $hash = {};
+
+ $hash->{ $_ } = undef for @dirs;
+ for my $dir ( $files->{ $filename }->@* ) {
+ $hash->{ $dir } = $filename;
+ }
+
+return_next( $hash );
+}
+
+
+return undef;
+
+$CODE$
+LANGUAGE plperlu;
+
+/*
+testdb=# select * from pwc166.task2_plperl( '/tmp/dir_a', '/tmp/dir_b', '/tmp/dir_c' );
+INFO: Opening /tmp/dir_a
+INFO: Opening /tmp/dir_b
+INFO: Opening /tmp/dir_c
+ dir_a | dir_b | dir_c
+----------------+-----------------+-----------------
+ Comic_Sans.ttf | Comic_Sans.ttf |
+ | Courier_New.ttf | Courier_New.ttf
+ Georgia.ttf | |
+ | | Monaco.ttf
+ | Tahoma.ttf |
+ other_fonts/ | |
+
+*/
diff --git a/challenge-166/luca-ferrari/postgresql/ch-2.sql b/challenge-166/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..bc919f5e08
--- /dev/null
+++ b/challenge-166/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,30 @@
+-- Perl Weekly Challenge 166
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc166;
+
+WITH
+dir_a(f) AS
+(
+ SELECT *
+ FROM pg_ls_dir( '/tmp/dir_a', TRUE, false)
+)
+, dir_b(f) AS
+(
+SELECT *
+FROM pg_ls_dir( '/tmp/dir_b', true, false)
+)
+, dir_c(f) AS
+(
+SELECT *
+FROM pg_ls_dir( '/tmp/dir_c', true,false)
+)
+SELECT a.f as dir_a, b.f as dir_b, c.f as dir_c
+FROM dir_a a
+FULL OUTER JOIN dir_b b on a.f = b.f
+FULL OUTER JOIN dir_c c on c.f = a.f
+WHERE
+a.f IS NULL
+OR b.f IS NULL
+OR c.f IS NULL
+;
diff --git a/challenge-166/luca-ferrari/raku/ch-1.p6 b/challenge-166/luca-ferrari/raku/ch-1.p6
new file mode 100755
index 0000000000..1c07e6d24a
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,27 @@
+#!raku
+
+# Perl Weekly Challenge 166
+
+sub MAIN( Str $filename = '../../data/dictionary.txt', Int $limit = 100 ) {
+ my %substitutions = 'o' => 0, 'l' => 1, 'i' => 1, 's' => 5, 't' => 7;
+
+ my @results = lazy gather {
+ for $filename.IO.lines -> $word is copy {
+ next if $word.chars > 8 || $word.chars < 2;
+ next if $word.lc !~~ / ^ <[a..folist]>+ $ /;
+
+ $word .= lc;
+ my $src-word = $word;
+
+ #$word .= subst( $_, %substitutions{ $_ } ) for %substitutions.keys;
+ for %substitutions.kv -> $k, $v {
+ $word ~~ s:g/$k/$v/;
+ }
+
+ take [ $src-word.uc, $word.uc ];
+ }
+ };
+
+
+ @results[0 .. $limit].map( { "The word $_[0] is translated to $_[1]" } ).join( "\n" ).say;
+}
diff --git a/challenge-166/luca-ferrari/raku/ch-2.p6 b/challenge-166/luca-ferrari/raku/ch-2.p6
new file mode 100755
index 0000000000..b6768e70b9
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,30 @@
+#!raku
+
+# Perl Weekly Challenge 166
+
+sub MAIN( Str $dir-a, Str $dir-b, Str $dir-c ) {
+
+
+ my @dirs = $dir-a, $dir-b, $dir-c;
+ my %files;
+
+ # build the directory content
+ for @dirs -> $current-dir {
+ %files{ $_.basename ~ ( $_.d ?? '/' !! '' ) }.push: $current-dir for $current-dir.IO.dir( test => { $current-dir.IO.d || $current-dir.IO.f } );
+ }
+
+
+ # print the stuff
+ my $header = False;
+ for %files.kv -> $file-name, $dir-names {
+ # skip all entries that are there for all the directories!
+ next if %files{ $file-name }.elems == @dirs.elems;
+
+ "|%-20s|%-20s|%-20s|\n|%s|%s|%s|".sprintf( @dirs, ( '-' x 20 ) xx @dirs.elems ).say and $header = True if ! $header;
+ printf "|%-20s", $dir-names.grep( $_ ) ?? $file-name !! ' ' for @dirs;
+ print "|";
+
+ say "";
+ }
+
+}
diff --git a/challenge-166/luca-ferrari/raku/dir_a/Arial.ttf b/challenge-166/luca-ferrari/raku/dir_a/Arial.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_a/Arial.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_a/Comic_Sans.ttf b/challenge-166/luca-ferrari/raku/dir_a/Comic_Sans.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_a/Comic_Sans.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_a/Georgia.ttf b/challenge-166/luca-ferrari/raku/dir_a/Georgia.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_a/Georgia.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_a/Helvetica.ttf b/challenge-166/luca-ferrari/raku/dir_a/Helvetica.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_a/Helvetica.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_a/Impact.otf b/challenge-166/luca-ferrari/raku/dir_a/Impact.otf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_a/Impact.otf
diff --git a/challenge-166/luca-ferrari/raku/dir_a/Verdana.ttf b/challenge-166/luca-ferrari/raku/dir_a/Verdana.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_a/Verdana.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Arial.ttf b/challenge-166/luca-ferrari/raku/dir_b/Arial.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Arial.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Comic_Sans.ttf b/challenge-166/luca-ferrari/raku/dir_b/Comic_Sans.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Comic_Sans.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Courier_New.ttf b/challenge-166/luca-ferrari/raku/dir_b/Courier_New.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Courier_New.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Helvetica.ttf b/challenge-166/luca-ferrari/raku/dir_b/Helvetica.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Helvetica.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Impact.otf b/challenge-166/luca-ferrari/raku/dir_b/Impact.otf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Impact.otf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Tahoma.ttf b/challenge-166/luca-ferrari/raku/dir_b/Tahoma.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Tahoma.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_b/Verdana.ttf b/challenge-166/luca-ferrari/raku/dir_b/Verdana.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_b/Verdana.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_c/Arial.ttf b/challenge-166/luca-ferrari/raku/dir_c/Arial.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_c/Arial.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_c/Courier_New.ttf b/challenge-166/luca-ferrari/raku/dir_c/Courier_New.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_c/Courier_New.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_c/Helvetica.ttf b/challenge-166/luca-ferrari/raku/dir_c/Helvetica.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_c/Helvetica.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_c/Impact.otf b/challenge-166/luca-ferrari/raku/dir_c/Impact.otf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_c/Impact.otf
diff --git a/challenge-166/luca-ferrari/raku/dir_c/Monaco.ttf b/challenge-166/luca-ferrari/raku/dir_c/Monaco.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_c/Monaco.ttf
diff --git a/challenge-166/luca-ferrari/raku/dir_c/Verdana.ttf b/challenge-166/luca-ferrari/raku/dir_c/Verdana.ttf
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/luca-ferrari/raku/dir_c/Verdana.ttf