diff options
| author | drbaggy <js5@sanger.ac.uk> | 2022-04-26 12:19:51 +0100 |
|---|---|---|
| committer | drbaggy <js5@sanger.ac.uk> | 2022-04-26 12:19:51 +0100 |
| commit | d420d32bc6b70e2e3326eedd73a16208ffc6bb4a (patch) | |
| tree | 4f32a50334fd7fa161f81381d5ee7481db9d2d95 | |
| parent | 7686306ed62b205e651dcff9a4ed6eb115033192 (diff) | |
| download | perlweeklychallenge-club-d420d32bc6b70e2e3326eedd73a16208ffc6bb4a.tar.gz perlweeklychallenge-club-d420d32bc6b70e2e3326eedd73a16208ffc6bb4a.tar.bz2 perlweeklychallenge-club-d420d32bc6b70e2e3326eedd73a16208ffc6bb4a.zip | |
tidied up output
| -rw-r--r-- | challenge-162/james-smith/perl/ch-2.pl | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/challenge-162/james-smith/perl/ch-2.pl b/challenge-162/james-smith/perl/ch-2.pl index 1cc3f6cb36..13e779d4d3 100644 --- a/challenge-162/james-smith/perl/ch-2.pl +++ b/challenge-162/james-smith/perl/ch-2.pl @@ -9,34 +9,38 @@ use Benchmark qw(cmpthese timethis); use Data::Dumper qw(Dumper); is( encrypt('playfair example', 'hide the gold in the tree stump'), 'bmodzbxdnabekudmuixmmouvif' ); +is( encrypt('playfajr example', 'hide the gold in the tree stump'), 'bmodzbxdnabekudmuixmmouvif' ); is( decrypt('perl and raku', 'siderwrdulfipaarkcrw'), 'thewexeklychallengex' ); -is( encrypt('abc','xxx'), 'yyyyyy' ); -is( decrypt('abc','yyyyyy'), 'xxxxxx' ); +is( encrypt('abc','xxx'), 'xxxxxx' ); +is( decrypt('abc','xxxxxx'), 'xxxxxx' ); done_testing(); -sub encrypt { return _crypt( 1,@_); } -sub decrypt { return _crypt(-1,@_); } - sub _crypt { - my($o,$key,$p,$out,@r,%l) = (shift,shift,0,''); ## Initialise variables and get mapping... - ($_ eq 'j' && ($_='i')), exists $l{$_} || ($l{$_}=[int $p/5,($p++)%5]) ## %l maps letter to position - for grep { /[a-z]/ } split(//,$key),'a'..'i','k'..'z'; - $r[$l{$_}[0]][$l{$_}[1]]=$_ for keys %l; ## @r maps position to letter - - my @seq = grep {/[a-z]/} split //, lc shift =~ s{j}{i}gr; ## Prep sequence - - while(my($m,$n)=splice @seq,0,2) { ## Loop through letter pairs - unshift(@seq,$n), $n='x' if $n && $n eq $m && $o == 1; ## Deal with case when both letters the same - ## Only do when encrypting.. - $n ||= 'x'; ## Pad if required... - $out.= $l{$m}[0] eq $l{$n}[0] ? $r[ $l{$m}[0] ][($l{$m}[1]+$o)%5]. + my( $o, $key, $p, $out, @r, %l ) = ( shift, shift, 0, '' ); ## Initialise variables and get mapping... + exists $l{$_} || ( $l{$_}=[int $p/5,($p++)%5] ) ## %l maps letter to position + for grep { /[a-z]/ } split ( //, $key =~s/j/i/gr ), 'a'..'i', 'k'..'z'; ## values are ["row no", "column no"] + $r[ $l{$_}[0] ] [$l{$_}[1] ] = $_ for keys %l; ## @r maps position to letter, first + ## index row, 2nd column. + my @seq = grep {/[a-z]/} split //, lc shift =~ s{j}{i}gr; ## Prep sequence, remove non-letters, + ## lower case, convert "j" to "i" + while( my($m,$n) = splice @seq,0,2 ) { ## Loop through letter pairs + unshift(@seq,$n), $n='x' if $n && $n eq $m && $o == 1; ## Deal with case when both letters the same + ## (Only do when encrypting..) + $n ||= 'x'; ## Pad if required... + + $out.= $m eq 'x' && $n eq 'x' ? 'xx' ## Can still have a pair if first value is + ## "x" because this is then padded by "x" + : $l{$m}[0] eq $l{$n}[0] ? $r[ $l{$m}[0] ][($l{$m}[1]+$o)%5]. ## Same row - shift down (or up) $r[ $l{$n}[0] ][($l{$n}[1]+$o)%5] - : $l{$m}[1] eq $l{$n}[1] ? $r[($l{$m}[0]+$o)%5][ $l{$m}[1] ]. + : $l{$m}[1] eq $l{$n}[1] ? $r[($l{$m}[0]+$o)%5][ $l{$m}[1] ]. ## Same column - shift right (or left) $r[($l{$n}[0]+$o)%5][ $l{$n}[1] ] - : $r[ $l{$m}[0] ][ $l{$n}[1] ]. + : $r[ $l{$m}[0] ][ $l{$n}[1] ]. ## o/w - other corners of square $r[ $l{$n}[0] ][ $l{$m}[1] ] ; } $out; } +sub encrypt { return _crypt 1, @_; } +sub decrypt { return _crypt -1, @_; } + |
