diff options
| author | e78783 <fungcheokyin@gmail.com> | 2022-05-29 01:54:06 +0800 |
|---|---|---|
| committer | e78783 <fungcheokyin@gmail.com> | 2022-05-29 01:54:06 +0800 |
| commit | 9ca48474541d56f48b06b077a86ec6c1776d7fbd (patch) | |
| tree | 4c07dc6c3a10eb76276f398058324f5b7c2c932d /challenge-166 | |
| parent | dad9cb024baf964390231c3183d49b5a2f2957fe (diff) | |
| download | perlweeklychallenge-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.pl | 164 |
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/"); + |
