Другие языки программирования и технологии

Прошу помочь. Нужно составить шифр плейфера к следующей фразе "то не останется ничего". Заранее огромное спасибо.

Необходимо для сдачи зачета по информатике. Помогите инвалиду
Это лучше сделать самому, так как не сможете объяснить как получили результат шифрования.

Сам шифр очень прост. Всего 4 правила + ключевая фраза (матрица)

Алгоритм и примеры разжеваны в вики Ссылка

Чуть внимательности и всё получится.
AS
Akbar Saydulloev
84 764
Лучший ответ
#!/usr/bin/perl6

sub playfair( $key,
$from = 'J',
$to = $from eq 'J' ?? 'I' !! ''
) {

sub canon($str) { $str.subst(/<-alpha>/,'', :g).uc.subst(/$from/,$to,:g) }

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

# Pregenerate all forward translations.
my %ENC = gather {
# Map pairs in same row.
for @m -> @r {
for ^@r X ^@r -> \i,\j {
next if i == j;
take @r ~ @r[j] => @r[(i+1)%5] ~ @r[(j+1)%5];
}
}

# Map pairs in same column.
for ^5 -> $c {
my @c = @m.map: *.[$c];
for ^@c X ^@c -> \i,\j {
next if i == j;
take @c ~ @c[j] => @c[(i+1)%5] ~ @c[(j+1)%5];
}
}

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

# Generate reverse translations.
my ЮC = %ENC.invert;

return
anon sub enc($red) {
my @list = canon($red).comb(/(.) (.?) /);
~@list.map: { .chars == 1 ?? %ENC{$_~'X'} !! %ENC{$_} }
},
anon sub dec($black) {
my @list = canon($black).comb(/../);
~@list.map: { ЮC{$_} }
}
}

my (&encode,&decode) = playfair 'Playfair example';

my $orig = "To ne ostanetsya nichego";
say " orig:\t$orig";

my $black = encode $orig;
say "black:\t$black";

my $red = decode $black;
say " red:\t$red";

Похожие вопросы