aboutsummaryrefslogtreecommitdiff
path: root/challenge-166
diff options
context:
space:
mode:
authore78783 <fungcheokyin@gmail.com>2022-05-29 01:54:06 +0800
committere78783 <fungcheokyin@gmail.com>2022-05-29 01:54:06 +0800
commit9ca48474541d56f48b06b077a86ec6c1776d7fbd (patch)
tree4c07dc6c3a10eb76276f398058324f5b7c2c932d /challenge-166
parentdad9cb024baf964390231c3183d49b5a2f2957fe (diff)
downloadperlweeklychallenge-club-9ca48474541d56f48b06b077a86ec6c1776d7fbd.tar.gz
perlweeklychallenge-club-9ca48474541d56f48b06b077a86ec6c1776d7fbd.tar.bz2
perlweeklychallenge-club-9ca48474541d56f48b06b077a86ec6c1776d7fbd.zip
Week 166
Diffstat (limited to 'challenge-166')
-rw-r--r--challenge-166/cheok-yin-fung/perl/ch-1.pl (renamed from challenge-166/perl/ch-1.pl)7
-rw-r--r--challenge-166/cheok-yin-fung/perl/ch-2.pl164
2 files changed, 169 insertions, 2 deletions
diff --git a/challenge-166/perl/ch-1.pl b/challenge-166/cheok-yin-fung/perl/ch-1.pl
index 725fa03774..c4b069c6dc 100644
--- a/challenge-166/perl/ch-1.pl
+++ b/challenge-166/cheok-yin-fung/perl/ch-1.pl
@@ -64,7 +64,8 @@ sub input {
or die "Dictionary IS NOT FOUND.";
while (<FH>) {
chomp;
- push @w, $_ if /^[abcdefolist]+$/ && length $_ <= 8;
+ push @w, $_ if lc($_) =~ /^[abcdefolist0-9]+$/
+ && length $_ <= 8;
}
close FH;
return @w;
@@ -96,7 +97,9 @@ sub filter {
sub transform {
$_ = $_[0];
- die "Not transformable!" unless /^[abcdefolist]+$/ && length $_ <= 8;
+ die "Not transformable!" unless lc($_) =~ /^[abcdefolist0-9]+$/
+ && length $_ <= 8;
tr/olist/01157/;
+ tr/OLIST/01157/;
return "0x". "0" x (8 - length $_) . $_;
}
diff --git a/challenge-166/cheok-yin-fung/perl/ch-2.pl b/challenge-166/cheok-yin-fung/perl/ch-2.pl
new file mode 100644
index 0000000000..10516f818e
--- /dev/null
+++ b/challenge-166/cheok-yin-fung/perl/ch-2.pl
@@ -0,0 +1,164 @@
+#!/usr/bin/perl
+# The Weekly Challenge 166
+# Task 2: K-Directory Diff
+use v5.24.0;
+use warnings;
+use Cwd;
+use Data::Printer;
+use List::Util qw/uniqstr any/;
+
+kd(@ARGV) if defined($ARGV[1]);
+
+my $TEMP_CWD = getcwd;
+
+
+
+sub kd {
+
+ my @dirs = @_;
+
+ $_ =~ s/\/$// foreach @dirs;
+
+ my @subdirs_gonna_p;
+ my @files_gonna_p;
+
+
+ # check whether the directories exist
+
+ my $are_all_available = 1;
+
+ for my $dirname (@dirs) {
+ my $is_it_available = -e -d $dirname;
+ warn "Directory \"$dirname\" does not exist!\n" if !$is_it_available;
+ $are_all_available &&= $is_it_available;
+ }
+
+ if (!$are_all_available) {
+ say "Some directories do not exist!\n";
+ return 0;
+ }
+
+
+ # scraping
+
+ my %subdirs_of_dir;
+ my %files_in_dir;
+
+ for my $dirname (@dirs) {
+ chdir $TEMP_CWD;
+ chdir $dirname;
+ $files_in_dir{$dirname}->@* = grep { ! -d $_ } glob("*");
+ $subdirs_of_dir{$dirname}->@* = glob("*/");
+ }
+
+
+ # reposition
+ chdir $TEMP_CWD;
+
+
+ # K-diff subdirectories
+
+ my @subdirs = uniqstr map {$subdirs_of_dir{$_}->@*} @dirs;
+
+
+ for my $dirname (@subdirs) {
+ my $are_all_available = 1;
+ for my $dir (@dirs) {
+ my $is_it_available
+ = any { $dirname eq $_ } $subdirs_of_dir{$dir}->@*;
+ $are_all_available &&= $is_it_available;
+ last if !$are_all_available;
+ }
+ push @subdirs_gonna_p, $dirname if !$are_all_available;
+ }
+
+ # K-diff files
+ my @files = uniqstr map {$files_in_dir{$_}->@*} @dirs;
+
+ for my $filename (@files) {
+ my $are_all_available = 1;
+ for my $dir (@dirs) {
+ my $is_it_available
+ = any { $filename eq $_ }
+ $files_in_dir{$dir}->@*;
+ $are_all_available &&= $is_it_available;
+ last if !$are_all_available;
+ }
+ push @files_gonna_p, $filename if !$are_all_available;
+ }
+
+ # Printing
+
+ my $N = scalar @dirs;
+
+ # return if the directories are "congruent"
+ return 1 if (scalar @files_gonna_p == 0 && scalar @subdirs_gonna_p == 0);
+
+ for my $dir (@dirs) {
+ my_printf("%16s", $dir);
+ }
+ say "\n" . "-" x (16*$N);
+
+
+ for my $dirname (@subdirs_gonna_p) {
+ for my $dir (@dirs) {
+ if (any {$dirname eq $_} $subdirs_of_dir{$dir}->@*) {
+ my_printf("%16s", $dirname);
+ }
+ else {
+ my_printf("%16s", "");
+ }
+ }
+ say "";
+ }
+
+
+ for my $filename (@files_gonna_p) {
+ for my $dir (@dirs) {
+ if (any {$filename eq $_} $files_in_dir{$dir}->@*) {
+ my_printf("%16s", $filename);
+ }
+ else {
+ my_printf("%16s", "");
+ }
+ }
+ say "";
+ }
+
+ # end subroutine
+ return 1;
+}
+
+
+
+sub my_printf {
+ my $w = $_[1];
+ if (length $w > 14) {
+ if (substr($_[1], -1, 1) eq "/") {
+ $w = substr($w, 0, 12)."*/";
+ }
+ else {
+ $w = substr($w, 0, 12)."**";
+ }
+ }
+ if ( $w !~ /\*/ && $w =~ / / ) {
+ $w = '"'.$w.'"';
+ }
+ printf($_[0], $w);
+}
+
+
+
+use Test::More tests => 4;
+my $whoami = "cheok-yin-fung";
+ok kd("../../../challenge-166/$whoami/perl", "../../../challenge-165/$whoami/perl");
+ok kd("../../../challenge-166/$whoami/", "../../../challenge-165/$whoami/");
+ok kd("../../../challenge-166/$whoami/",
+ "../../../challenge-165/$whoami/",
+ "../../../challenge-156/$whoami/");
+ok kd("../../../challenge-166/$whoami/", "../../../challenge-163/$whoami/",
+ "../../../challenge-158/$whoami/",
+ "../../../challenge-147/$whoami/", "../../../challenge-110/$whoami/",
+ "../../../challenge-078/$whoami/",
+ "../../../challenge-077/$whoami/", "../../../challenge-075/$whoami/");
+