Playfair cipher: Difference between revisions

Content added Content deleted
(Add haskell version)
m (→‎{{header|Perl 6}}: fix synxtax issues)
Line 1,101: Line 1,101:


=={{header|Perl 6}}==
=={{header|Perl 6}}==
{{Works with|rakudo|2016.07}}
<lang perl6># Instantiate a specific encoder/decoder.
<lang perl6># Instantiate a specific encoder/decoder.


Line 1,111: Line 1,112:


# Build 5x5 matrix.
# Build 5x5 matrix.
my @m = canon($key ~ ('A'..'Z').join).comb.uniq.map:
my @m = canon($key ~ ('A'..'Z').join).comb.unique.map:
-> $a,$b,$c,$d,$e { [$a,$b,$c,$d,$e] }
-> $a,$b,$c,$d,$e { [$a,$b,$c,$d,$e] }


# Pregenerate all forward translations.
# Pregenerate all forward translations.
Line 1,118: Line 1,119:
# Map pairs in same row.
# Map pairs in same row.
for @m -> @r {
for @m -> @r {
for ^@r X ^@r -> \i,\j {
for ^@r X ^@r -> (\i,\j) {
next if i == j;
next if i == j;
take @r[i] ~ @r[j] => @r[(i+1)%5] ~ @r[(j+1)%5];
take @r[i] ~ @r[j] => @r[(i+1)%5] ~ @r[(j+1)%5];
Line 1,127: Line 1,128:
for ^5 -> $c {
for ^5 -> $c {
my @c = @m.map: *.[$c];
my @c = @m.map: *.[$c];
for ^@c X ^@c -> \i,\j {
for ^@c X ^@c -> (\i,\j) {
next if i == j;
next if i == j;
take @c[i] ~ @c[j] => @c[(i+1)%5] ~ @c[(j+1)%5];
take @c[i] ~ @c[j] => @c[(i+1)%5] ~ @c[(j+1)%5];
Line 1,134: Line 1,135:


# Map pairs with cross-connections.
# Map pairs with cross-connections.
for ^5 X ^5 X ^5 X ^5 -> \i1,\j1,\i2,\j2 {
for ^5 X ^5 X ^5 X ^5 -> (\i1,\j1,\i2,\j2) {
next if i1 == i2 or j1 == j2;
next if i1 == i2 or j1 == j2;
take @m[i1][j1] ~ @m[i2][j2] => @m[i1][j2] ~ @m[i2][j1];
take @m[i1][j1] ~ @m[i2][j2] => @m[i1][j2] ~ @m[i2][j1];