aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2022-05-24 12:46:50 +0100
committerdrbaggy <js5@sanger.ac.uk>2022-05-24 12:46:50 +0100
commit1a000c639c7c650a03df358bab15d7050d5cad27 (patch)
tree0b27dd5ec650272a510dece4c2b5677d3e612d74
parent8ddf34d09876c4c4a04fd3085af3f9dba851d7b9 (diff)
downloadperlweeklychallenge-club-1a000c639c7c650a03df358bab15d7050d5cad27.tar.gz
perlweeklychallenge-club-1a000c639c7c650a03df358bab15d7050d5cad27.tar.bz2
perlweeklychallenge-club-1a000c639c7c650a03df358bab15d7050d5cad27.zip
updated compact versions of code
-rw-r--r--challenge-166/james-smith/perl/ch-2.pl40
1 files changed, 31 insertions, 9 deletions
diff --git a/challenge-166/james-smith/perl/ch-2.pl b/challenge-166/james-smith/perl/ch-2.pl
index a3e8947cf0..cae862e2b8 100644
--- a/challenge-166/james-smith/perl/ch-2.pl
+++ b/challenge-166/james-smith/perl/ch-2.pl
@@ -17,15 +17,43 @@ sub data {
);
}
+# 1 2 3 4 5 6 7 8 9
+#23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+## Super compact version of fetch {79 bytes}
+sub f{my%d;(@_=split/\//),push@{$d{$_[0]}},-d$_?"$_[1]/":$_[1]for glob'*/*';%d}
+
+## Super compact version of parse { 338 byes }
+sub k{my$l=0;my(%d,$F,@p,%u,$T,$H)=@_;(length$_>$l)&&($l=length$_)for
+keys%{{%u=map{$_,1}map{@{$d{$_}}}@p=sort keys%d}},@p;
+say for($H=join'-'x($l+2),('+')x(1+@p)),sprintf($T='|'." %-${l}s |"x@p,@p),$H,
+map({$F=$_;(grep{($d{$_}[0]//'')ne$F}@p)?sprintf$T,map{($d{$_}[0]//'')eq$F?
+shift@{$d{$_}}:''}@p:map{shift@{$d{$_}};()}@p}sort keys%u),$H}
+
+## Merging the fetch/parse into the same function gives us juset 398 bytes of
+## perlly goodness.....
+
+sub z{my($l,%d,$F,@p,%u,$T,$H)=0;(@_=split/\//),push@{$d{$_[0]}},-d$_?"$_[1]/":
+$_[1]for glob'*/*';(length$_>$l)&&($l=length$_)for keys%{{%u=map{$_,1}
+map{@{$d{$_}}}@p=sort keys%d}},@p;say for($H=join'-'x($l+2),('+')x(1+@p)),
+sprintf($T='|'." %-${l}s |"x@p,@p),$H,map({$F=$_;(grep{($d{$_}[0]//'')ne$F}@p)?
+sprintf$T,map{($d{$_}[0]//'')eq$F?shift@{$d{$_}}:''}@p:map{shift@{$d{$_}};()}@p
+}sort keys%u),$H}
+
+# 334 bytes - to work out unique files, work out the column width, and print out
+# those files which are not in all the directories
+
sub fetch {
- my(%data,$f,$sh),opendir( my $dh, '.' );
+ my(%data,$f,$sh), opendir( my $dh, '.' );
opendir( $sh, $f=$_ ), $data{$f} = [ map { -d "$f/$_" ? "$_/" : $_ } grep { $_ ne '.' && $_ ne '..' } sort readdir $sh ]
for grep { -d $_ && $_ ne '.' && $_ ne '..' } readdir $dh;
%data;
}
-k_diff( data ); kc( data );
-k_diff( fetch ); kc( fetch );
+say 'Original - fake data'; k_diff( data ); say '';
+say 'Original - dir. data'; k( data ); say '';
+say 'Compact - fake data'; k_diff( fetch ); say '';
+say 'Compact - dir. data'; k( f ); say '';
+say 'Super compact'; z; say '';
sub k_diff {
my ($len,%dir,$F,$T) = (0,@_);
@@ -58,9 +86,3 @@ sub k_diff {
say $LINE;
}
-sub kc{my$l=0;my(%d,$F,@p,%u,$T,$L)=@_;
-(length$_>$l)&&($l=length$_)for(@p=sort keys%d),keys%{{%u=map{$_,1}map{@{$d{$_}}}@p}};
-say for($T='|'." %-${l}s |"x@p)x 0,$L="+-@{[join'-+-',map{'-'x$l}@p]}-+",sprintf($T,@p),$L,
-map({$F=$_;(grep{($d{$_}[0]//'')ne$F}@p)?(sprintf$T,map{($d{$_}[0]//'')eq$F?shift@{$d{$_}}:''}@p):
-map{shift@{$d{$_}};()}@p}sort keys%u),$L}
-