diff options
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 |
