- 论坛徽章:
- 7
|
my 代码:- #!/usr/bin/perl
- use 5.018;
- sub playfair {
- my ( $k, $s, $ed ) = @_;
- my ( @I, %T, @R ) = 0 .. 4;
- map tr/j/i/, $k, $s;
- my $J = ( $ed //= 'e' ) eq 'd' ? -1 : 1;
- my @K = map uc, map /([A-Za-z])/g, $k;
- my @S = map uc, map /([A-Za-z])/g, $s;
- @K = grep !$T{$_}++, @K, 'A' .. 'I', 'K' .. 'Z';
- %T = map { my $i = $_; map { shift @K, [ $i, $_ ] } @I } @I;
- my %E = map { join( '', @{ $T{$_} } ), $_ } keys %T;
- while ( my ( $A, $B ) = splice @S, 0, 2 ) {
- ( $B, @S ) = ( 'X', $A, @S ) if $A eq ( $B //= 'X' );
- push @R, $T{$A}[0] == $T{$B}[0]
- ? [ map $E{ $T{$_}[0] . ( $T{$_}[1] + $J ) % 5 }, $A, $B ]
- : $T{$A}[1] == $T{$B}[1]
- ? [ map $E{ ( $T{$_}[0] + $J ) % 5 . $T{$_}[1] }, $A, $B ]
- : [ $E{"$T{$A}[0]$T{$B}[1]"}, $E{"$T{$B}[0]$T{$A}[1]"} ];
- }
- join $", map join( '', @$_ ), @R;
- }
- my $key = 'Playfair example';
- my $test = 'Hide the gold in...the TREESTUMP!!!';
- say my $t = playfair $key, $test;
- say playfair $key, $t, 'd';
复制代码 |
|