diff options
| author | drbaggy <js5@sanger.ac.uk> | 2022-05-24 12:46:50 +0100 |
|---|---|---|
| committer | drbaggy <js5@sanger.ac.uk> | 2022-05-24 12:46:50 +0100 |
| commit | 1a000c639c7c650a03df358bab15d7050d5cad27 (patch) | |
| tree | 0b27dd5ec650272a510dece4c2b5677d3e612d74 | |
| parent | 8ddf34d09876c4c4a04fd3085af3f9dba851d7b9 (diff) | |
| download | perlweeklychallenge-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.pl | 40 |
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} - |
