ADFGVX cipher: Difference between revisions

m (→‎{{header|Raku}}: add some explanatory commentary)
Line 356:
 
Decrypted : ATTACKAT1200AM</pre>
 
=={{header|Perl}}==
<lang perl>#!/usr/bin/perl
 
use strict; # https://rosettacode.org/wiki/ADFGVX_cipher
use warnings;
use List::Util qw( shuffle );
 
my @code = qw( A D F G V X ); # generate polybius square
my @pairs = map { my $left = $_; map "$left$_", @code } @code;
my @letters = shuffle "A" .. 'Z' , 0 .. 9; # randomize polybius
my %char2pair;
@char2pair{ @letters } = @pairs; # map chars to pairs
my %pair2char = reverse %char2pair; # map pairs to chars
my $template = <<END;
| A D F G V X
--+------------
A | x x x x x x
D | x x x x x x
F | x x x x x x
G | x x x x x x
V | x x x x x x
X | x x x x x x
END
$template =~ s/x/$_/ for @letters;
print "Polybius square =\n\n$template\n";
 
my $file = do { local (@ARGV, $/) = 'unixdict.txt'; uc <> };
my $keysize = 9;
my ($keyword) = shuffle grep !/(.).*\1/, $file =~ /^\w{$keysize}$/gm;
my $plaintext = 'ATTACKAT1200AM';
print "keyword = $keyword\n\nplaintext = $plaintext\n\n";
 
my $encoded = encode( $plaintext, $keyword, \%char2pair );
print "encoded = $encoded\n\n";
 
my $decoded = decode( $encoded, $keyword, \%pair2char );
print "decoded = $decoded\n\n";
 
sub encode
{
my ($plain, $keyword, $c2p, %hash) = @_;
my $len = length $keyword;
my $cols = transpose($plain =~ s/./$c2p->{$&}/gr =~ s/.{$len}\K(?=.)/\n/gr);
@hash{split //, $keyword} = split ' ', $cols;
return join ' ', @hash{sort keys %hash};
}
 
sub decode
{
my ($encoded, $keyword, $p2c, %hash) = @_;
@hash{ sort split //, $keyword } = split ' ', $encoded;
return transpose( join "\n", @hash{ split //, $keyword }) =~
s/\s+//gr =~ s/../$p2c->{$&}/gr;
}
 
sub transpose
{
local $_ = shift() =~ s/\s+/\n/gr;
my $answer = '';
$answer .= ' ' while s/^./ $answer .= $& ; '' /gem;
$answer;
}</lang>
{{out}}
<pre>
Polybius square =
 
| A D F G V X
--+------------
A | 5 T X U G N
D | 2 7 1 D 8 E
F | 9 0 J R Z W
G | Q L 3 I F 6
V | C O M P 4 H
X | Y K B V A S
 
keyword = SINGAPORE
 
plaintext = ATTACKAT1200AM
 
encoded = AVF VFV DXD VXA ADF XDX DAD VDV XADF
 
decoded = ATTACKAT1200AM
 
</pre>
 
 
=={{header|Phix}}==
Anonymous user