aboutsummaryrefslogtreecommitdiff
path: root/challenge-166
diff options
context:
space:
mode:
authorNiels van Dijke <perlboy@cpan.org>2022-05-28 19:53:06 +0000
committerNiels van Dijke <perlboy@cpan.org>2022-05-28 19:53:06 +0000
commitc2a40bd4ab0837995e00840836cfcab38f15b42f (patch)
tree82fbea962fcee3bbfcd896886c3c487e2e53f214 /challenge-166
parent6e43062f0244390ce55de00fc4a640895cf2f157 (diff)
downloadperlweeklychallenge-club-c2a40bd4ab0837995e00840836cfcab38f15b42f.tar.gz
perlweeklychallenge-club-c2a40bd4ab0837995e00840836cfcab38f15b42f.tar.bz2
perlweeklychallenge-club-c2a40bd4ab0837995e00840836cfcab38f15b42f.zip
w166 - Task 1 & 2
Diffstat (limited to 'challenge-166')
-rwxr-xr-xchallenge-166/perlboy1967/perl/ch-1.pl86
-rwxr-xr-xchallenge-166/perlboy1967/perl/ch-2.pl57
-rw-r--r--challenge-166/perlboy1967/perl/dir_a/a0
-rw-r--r--challenge-166/perlboy1967/perl/dir_a/all0
-rw-r--r--challenge-166/perlboy1967/perl/dir_a/b0
-rw-r--r--challenge-166/perlboy1967/perl/dir_a/c0
-rw-r--r--challenge-166/perlboy1967/perl/dir_b/a0
-rw-r--r--challenge-166/perlboy1967/perl/dir_b/all0
-rw-r--r--challenge-166/perlboy1967/perl/dir_b/c0
-rw-r--r--challenge-166/perlboy1967/perl/dir_b/d0
-rw-r--r--challenge-166/perlboy1967/perl/dir_c/all0
-rw-r--r--challenge-166/perlboy1967/perl/dir_c/b0
-rw-r--r--challenge-166/perlboy1967/perl/dir_c/c0
-rw-r--r--challenge-166/perlboy1967/perl/dir_c/d0
-rw-r--r--challenge-166/perlboy1967/perl/dir_d/all0
-rw-r--r--challenge-166/perlboy1967/perl/dir_d/c0
16 files changed, 143 insertions, 0 deletions
diff --git a/challenge-166/perlboy1967/perl/ch-1.pl b/challenge-166/perlboy1967/perl/ch-1.pl
new file mode 100755
index 0000000000..8de1a2949b
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/ch-1.pl
@@ -0,0 +1,86 @@
+#!/bin/perl
+
+=pod
+
+The Weekly Challenge - 164
+ - https://theweeklychallenge.org/blog/perl-weekly-challenge-166/#TASK1
+
+Author: Niels 'PerlBoy' van Dijke
+
+Task 1: Hexadecimal Words
+Submitted by: Ryan J Thompson
+
+As an old systems programmer, whenever I needed to come up with a 32-bit number,
+I would reach for the tired old examples like 0xDeadBeef and 0xC0dedBad. I want more!
+
+Write a program that will read from a dictionary and find 2- to 8-letter words that
+can be “spelled” in hexadecimal, with the addition of the following letter substitutions:
+
+ o -> 0 (e.g., 0xf00d = “food”)
+ l -> 1
+ i -> 1
+ s -> 5
+ t -> 7
+
+=cut
+
+use v5.16;
+
+use File::Slurp;
+use List::Util qw(sum);
+use List::MoreUtils qw(uniq);
+
+my $dictFile = shift // '../../../data/dictionary.txt';
+
+# Challenge
+printf "Challenge: %-8s => %s\n", $_, tr/olist/01157/r for(hexWords($dictFile));
+
+# Optional 1
+printf "Optional 1: %-8s => %s\n", $_, tr/ost/057/r for(hexWords2($dictFile));
+
+# Optional 2
+printf "Optional 2: %-8s => %s\n", $_, tr/ost/057/r for(hexPhrase($dictFile));
+
+
+sub hexWords ($) {
+ my ($dictFile) = @_;
+
+ return grep{chomp && /^[a-folist]{2,8}$/}
+ read_file $dictFile;
+}
+
+
+sub hexWords2 ($) {
+ my ($dictFile) = @_;
+
+ return grep{chomp && /^[a-fost]{2,8}$/}
+ read_file $dictFile;
+}
+
+
+sub hexPhrase ($) {
+ my ($dictFile) = @_;
+
+ my @res;
+ my %hwl;
+
+ my @hw = grep {/^[^ost][[a-fost]{1,5}$/} hexWords2($dictFile);
+ map { push(@{$hwl{length($_)}},$_) } @hw;
+
+ my @l = (
+ [2,2,2,2], [2,2,4], [2,3,3], [2,4,2], [2,6],
+ [3,2,3], [3,3,2], [3,5],
+ [4,2,2], [4,4],
+ [5,3],
+ [6,2]
+ );
+ foreach my $ar (@l) {
+ foreach my $w (glob '{'.join('}:{', map { join(',', @{$hwl{$_}}) } @$ar).'}') {
+ my @w = map { ucfirst } split(/:/,$w);
+ $w = join('', @w);
+ push(@res, $w) if (length(join('',uniq(@w))) == 8);
+ }
+ }
+
+ return @res;
+}
diff --git a/challenge-166/perlboy1967/perl/ch-2.pl b/challenge-166/perlboy1967/perl/ch-2.pl
new file mode 100755
index 0000000000..9c92e13834
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/ch-2.pl
@@ -0,0 +1,57 @@
+#!/bin/perl
+
+=pod
+
+The Weekly Challenge - 166
+ - https://theweeklychallenge.org/blog/perl-weekly-challenge-166/#TASK2
+
+Author: Niels 'PerlBoy' van Dijke
+
+Task 2: K-Directory Diff
+Submitted by: Ryan J Thompson
+
+Given a few (three or more) directories (non-recursively), display a side-by-side
+difference of files that are missing from at least one of the directories. Do not
+display files that exist in every directory.
+
+Since the task is non-recursive, if you encounter a subdirectory, append a /, but
+otherwise treat it the same as a regular file.
+
+=cut
+
+use v5.16;
+
+use List::Util qw(max);
+use Data::Printer;
+
+@ARGV = (grep {-d } glob('*')) unless @ARGV;
+
+kDirDiff(@ARGV);
+
+sub kDirDiff (@) {
+ my (@dirs) = sort @_;
+
+ my %dirEntries;
+ my %maxLength;
+
+ # Build filelist presence map
+ for my $dir (@dirs) {
+ $maxLength{$dir} = length($dir);
+ opendir(D, $dir);
+ map {
+ $_ .= '/' if (-d "$dir/$_");
+ $dirEntries{$_}{$dir}++;
+ $maxLength{$dir} = max($maxLength{$dir}, length($_));
+ } readdir(D);
+ }
+
+ # Create report
+ my $fmt = join(' | ', map { "%-$maxLength{$_}s" } sort keys(%maxLength))."\n";
+
+ printf($fmt, @dirs);
+ printf($fmt =~ tr/ /-/r, map { '-' x $maxLength{$_} } @dirs);
+ foreach my $f (sort keys %dirEntries) {
+ printf($fmt, map { exists $dirEntries{$f}{$_} ? $f : '' } @dirs)
+ unless (scalar @dirs == scalar keys %{$dirEntries{$f}});
+ }
+}
diff --git a/challenge-166/perlboy1967/perl/dir_a/a b/challenge-166/perlboy1967/perl/dir_a/a
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_a/a
diff --git a/challenge-166/perlboy1967/perl/dir_a/all b/challenge-166/perlboy1967/perl/dir_a/all
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_a/all
diff --git a/challenge-166/perlboy1967/perl/dir_a/b b/challenge-166/perlboy1967/perl/dir_a/b
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_a/b
diff --git a/challenge-166/perlboy1967/perl/dir_a/c b/challenge-166/perlboy1967/perl/dir_a/c
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_a/c
diff --git a/challenge-166/perlboy1967/perl/dir_b/a b/challenge-166/perlboy1967/perl/dir_b/a
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_b/a
diff --git a/challenge-166/perlboy1967/perl/dir_b/all b/challenge-166/perlboy1967/perl/dir_b/all
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_b/all
diff --git a/challenge-166/perlboy1967/perl/dir_b/c b/challenge-166/perlboy1967/perl/dir_b/c
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_b/c
diff --git a/challenge-166/perlboy1967/perl/dir_b/d b/challenge-166/perlboy1967/perl/dir_b/d
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_b/d
diff --git a/challenge-166/perlboy1967/perl/dir_c/all b/challenge-166/perlboy1967/perl/dir_c/all
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_c/all
diff --git a/challenge-166/perlboy1967/perl/dir_c/b b/challenge-166/perlboy1967/perl/dir_c/b
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_c/b
diff --git a/challenge-166/perlboy1967/perl/dir_c/c b/challenge-166/perlboy1967/perl/dir_c/c
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_c/c
diff --git a/challenge-166/perlboy1967/perl/dir_c/d b/challenge-166/perlboy1967/perl/dir_c/d
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_c/d
diff --git a/challenge-166/perlboy1967/perl/dir_d/all b/challenge-166/perlboy1967/perl/dir_d/all
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_d/all
diff --git a/challenge-166/perlboy1967/perl/dir_d/c b/challenge-166/perlboy1967/perl/dir_d/c
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-166/perlboy1967/perl/dir_d/c