aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2022-04-26 12:19:51 +0100
committerdrbaggy <js5@sanger.ac.uk>2022-04-26 12:19:51 +0100
commitd420d32bc6b70e2e3326eedd73a16208ffc6bb4a (patch)
tree4f32a50334fd7fa161f81381d5ee7481db9d2d95
parent7686306ed62b205e651dcff9a4ed6eb115033192 (diff)
downloadperlweeklychallenge-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.pl42
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, @_; }
+