Фон
Сто тринадцать лет назад криптограф-любитель Феликс Деластель опубликовал свою работу о шифре с четырьмя квадратами, шифре с заменой диграфа, который принимает две перестановки 25-буквенного алфавита в качестве ключей и кодирует сообщения, состоящие из этих букв.
Как и большинство шифров с ручкой и бумагой, шифр с четырьмя квадратами сегодня не имеет никакой криптографической ценности, но на момент его изобретения он имел значительное преимущество перед монографическими аналогами.
Спустя сто тринадцать лет Алиса Деластель решает улучшить шифр с четырьмя квадратами, увеличив размер алфавита и количество ключей. [нужна цитата]
Настройка ключа
Алфавит содержит следующие символы (начиная с пробела):
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
Для данной парольной фразы мы строим перестановку этого алфавита следующим образом:
Сохраняйте только первое вхождение каждого персонажа.
Добавляйте неиспользуемые символы из алфавита в их естественном порядке.
После превращения четырехпроходных фраз в четыре клавиши мы разбиваем каждую клавишу на квадрат с длиной стороны 7 и располагаем четыре получающихся квадрата так, чтобы они образовывали один большой квадрат.
Например, если парольные фразы были
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ключи будут построены и расположены следующим образом:
PROGAMI POULARI
N UZLES TY CNES
&CDF!"# &DBWG!"
$%'()*+ #$%'()*
,-./:;< +,-./:;
=>?@BHJ <=>?@FH
KQTVWXY JKMQVXZ
CORET H DON'T E
SBAYPL! LV!"#$%
"#$%&'( &()*+,-
)*+,-./ ./:;<=>
:;<=>?@ ?@ABCFG
DFGIJKM HIJKMPQ
NQUVWXZ RSUWXYZ
шифрование
Учитывая текстовое сообщение, такое как
ALICE LOVES BOB.
мы добавляем 0 или 1 пробел, чтобы сделать его равным, и разбиваем его на пары символов:
["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]
Для каждой пары символов мы находим первый символ в первом квадрате (порядок чтения) и второй в четвертом.
Затем мы выбираем символы в оставшихся квадратах так, чтобы четыре выбранных символа образовывали прямоугольник, стороны которого параллельны сторонам квадратов.
Наконец, мы заменяем пару символов выбранными символами второго и третьего квадрата.
Для нашего примера строки это дает
["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]
в результате получается следующий зашифрованный текст:
PPA@E YTZEEH=T<-
задача
Напишите программу или функцию, которая принимает четыре проходных фразы и открытый текст, использует вышеупомянутый вариант шифра с четырьмя квадратами для его шифрования и возвращает полученный зашифрованный текст.
Детали:
Пять входных строк будут состоять исключительно из символов упомянутого алфавита.
Пять входных строк могут быть прочитаны в любом порядке, как таковые, в виде одной строки, разделенной символом новой строки, или в виде массива из пяти строк.
Вы можете предположить, что ни одна из строк не пуста.
Вывод должен быть одной строкой.
Если вы решите распечатать вывод в STDOUT, вы можете напечатать только символы зашифрованного текста и (необязательно) завершающий перевод строки.
Применяются стандартные правила игры в гольф .
Контрольные примеры
Во всех тестовых случаях первые четыре строки соответствуют квадратам клавиш в порядке чтения, а последняя строка ввода - в виде открытого текста.
вход
PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.
Выход
PPA@E YTZEEH=T<-
вход
!"#$%&'()*+,-./:;<=>
!"#$%&'()*+,-./:;<=>?@ABCDE
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
!"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD!
Выход
LALLR)#TROKE !
вход
,'K AB-Q=?@("W$>XM).C#<I:G!OLP*+;SZJTU%NED/&VFHRY
:,-D$C<SU=IYHFVA;! JG/M&L+WT%#.Q@(N*R")EZOBKX?'>P
L()JX,BND?Z<>P*FU%=O@&KIC+A!Y:;$SWHR.EMG'/T"QV #-
<->CI")AP Q:+U;O/F(KH&ER!MW?X'VJLZ#.$,BSGN@TD%*Y=
SPIN THE PPCG WHEEL OF BLAME!
Выход
#>TE,VK+,ZQ(&<F@RA.NL@DM%NAC&>
вход
& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,
Выход
GOOD LUCK, HAVE FUN.
источник
Pyth -
88868378767572 байта8 байтов сохранено благодаря @orlp .
Ваае слишком долго, я довольно недоволен этим, но просто публикую его, пока ищу лучший способ обработки квадратов.
Попробуйте это онлайн здесь .
источник
c+e.z*%le.z2d2
наC.tce.z2d
. Не спрашивайте :)