Bifid cipher: Difference between revisions

Added Perl
(Added Perl)
Line 165:
 
</pre>
 
=={{header|Perl}}==
<lang perl>use v5.36;
use builtin <indexed floor>;
use experimental qw(builtin for_list);
use List::Util 'max';
 
sub table ($c, @V) { my $t = $c * (my $w = 2 + length max map { length } @V); ( sprintf( ('%'.$w.'s')x@V, @V) ) =~ s/.{1,$t}\K/\n/gr }
 
sub polybius ($text) {
my %p;
my $n = floor sqrt length $text;
for my($k,$v) (indexed split '', $text) {
$p{$v} = join ' ', $k%$n, int $k/$n
}
%p;
}
 
sub encrypt ($text, %P) {
my(%I, @c1, @c2, $encrypted);
for my($k,$v) (%P) { $I{$v} = $k }
for (split '', $text =~ s/\s//gr) {
for my($i,$j) (split ' ', $P{$_}) { push @c1, $i; push @c2, $j }
}
for my($j,$i) (@c2, @c1) { $encrypted .= $I{"$i $j"} }
$encrypted
}
 
sub decrypt ($text, %P) {
my($decrypted, $l, %I, @c) = ('', length($text));
for my($k,$v) (%P) { $I{$v} = $k }
for (split '', $text) {
for my($i,$j) (split ' ', $P{$_}) { unshift @c, $i, $j }
}
substr $decrypted, 0, 0, $I{ "$c[$_] $c[$_+$l]" } for 0 .. $l-1;
$decrypted;
}
 
for my($polybius,$message) (
join('','A'..'Z') =~ s/J//r, 'ATTACK AT DAWN',
'BGWKZQPNDSIOAXEFCLUMTHYVR', 'FLEE AT ONCE',
join('','_.', 'A'..'Z', 'a'..'z', '0'..'9'), 'The_invasion_will_start_on_the_first_of_January_2023.',
) {
my %Ptable = polybius $polybius;
say "\nUsing polybius:\n" . table sqrt length $polybius, split '', $polybius;
say 'Message : ' . $message;
say 'Encrypted : ' . (my $encrypted = encrypt $message, %Ptable);
say 'Decrypted : ' . decrypt $encrypted, %Ptable;
}</lang>
{{out}}
<pre>Using polybius:
A B C D E
F G H I K
L M N O P
Q R S T U
V W X Y Z
 
Message : ATTACK AT DAWN
Encrypted : DQBDAXDQPDQH
Decrypted : ATTACKATDAWN
 
Using polybius:
B G W K Z
Q P N D S
I O A X E
F C L U M
T H Y V R
 
Message : FLEE AT ONCE
Encrypted : UAEOLWRINS
Decrypted : FLEEATONCE
 
Using polybius:
_ . A B C D E F
G H I J K L M N
O P Q R S T U V
W X Y Z a b c d
e f g h i j k l
m n o p q r s t
u v w x y z 0 1
2 3 4 5 6 7 8 9
 
Message : The_invasion_will_start_on_the_first_of_January_2023.
Encrypted : SejxqrEierbmrDiCjrDeJsbu89DWCHkgGS9E6tAG5_Ks2PBfCq_uH
Decrypted : The_invasion_will_start_on_the_first_of_January_2023.</pre>
 
=={{header|Raku}}==
2,392

edits