Напишите программу, которая принимает две строки ввода и использует первую в качестве ключевой фразы для шифрования второй в соответствии с техникой шифрования Playfair.
Википедия описывает шифрование Playfair в некоторых деталях , но чтобы избежать двусмысленности, вот краткое резюме:
1. Сгенерируйте таблицу ключей:
Замените все вхождения J
ключевой фразы на I
, затем удалите все не алфавитные и повторные символы. Вставьте в таблицу шифрования 5 × 5, заполнив оставшиеся ячейки оставшейся частью алфавита (за исключением того J
, что нам не нравится J
).
Пример:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Подготовьте сообщение для шифрования
Замените каждый символом « J
на» I
, удалите все неалфавитные символы и X
разбейте их на пары, используя, чтобы разбить все пары, содержащие одну и ту же букву, дважды. Если вы получите нечетное количество букв, добавьте X
в конце. (Примечание: Цифры должны быть изложены в полном объеме - ONE
, TWO
, THREE
и т.д. , - но вы можете предположить , что это уже сделано для вас.)
Пример:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Шифрование
Зашифруйте каждую пару букв по очереди. Если они находятся в разных строках и столбцах таблицы ключей, замените каждую букву из той же строки в столбце, где находится другая буква (например, VM
⇒ EI
, LZ
⇒ GQ
). Если они находятся в одной строке (или столбце), выберите два символа сразу справа (или ниже), при необходимости оборачивая их (например, OE
⇒ VR
, ZG
⇒ KP
).
Пример:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
Строка, создаваемая этим процессом, является зашифрованным сообщением, которое ваша программа должна вывести.
Правила:
- Входной текст и ключ могут быть получены из
stdin
аргументов командной строки или других подобных источников. Жестко запрограммированный ввод не допускается. - Ваша программа должна принимать как прописные, так и строчные буквы для парольной фразы и сообщения.
- Зашифрованный вывод может быть в верхнем или нижнем регистре.
- Ваша программа должна принимать ключевые фразы длиной не менее 64 символов и тексты сообщений размером не менее 16 КБ.
- Вы не обязаны обрабатывать ввод не-ASCII.
- Вы можете игнорировать возможность появления пары букв
XX
во время шифрования. - Нет необходимости добавлять пробелы в вывод программы.
- Ваш ответ должен включать пример сообщения, ключевой фразы и зашифрованного вывода, созданного вашей программой.
- Это вызов кода для гольфа, поэтому победит ответ с самым коротким кодом (в байтах).
ПРИМЕЧАНИЕ. Помните, что вам нужно разбивать последовательные буквы, только если они появляются в одной паре . Так, например,
MASSACHUSETTS
должно быть зашифровано какMA SX SA CH US ET TS
- двойнойS
должен быть разделен, но двойнойT
не делает.
источник
J
». Вы питаете подобные чувства по поводу APL?Ответы:
JI *,536431417380263218203197186167(с обширными предложениями от @algorithmshark)
пример использования:
правильно разделяет ввод:
* заменить каждый
J
сI
, верно?источник
Рубин,
461411366359352346330 знаковСпасибо @daniero за сохранение ... эээ, много байтов. \ о /
Вот незагрязненный код:
Вот несколько примеров выходных данных:
источник
chars
приводить » в массив, предполагая, что вы используете Ruby 2. Также вы можете использовать&
в качестве оператора set вместоtr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(7 байтов сохранено). Две следующие строки могут быть объединены чем-то вродеk,m=[1,2].map{t[gets.chop]}
(примечание,chop
а неchomp
).&
также устраняет необходимость вuniq
дальнейшем. Иchars
вещь для массива также относится к 6-й строке.tr
в&
строке 1 не работает, потому чтоm
не может бытьuniq
ified. Тем не менее,k.uniq
может быть сокращен до(k&k)
(1 байт).C:
495401355341 символовЭто просто грубый набросок на данный момент. Я должен быть в состоянии сбрить по крайней мере сто символов.Цель достигнута: более ста символов (на данный момент 154) загадочным образом исчезли из кода.
С некоторыми приятными пробелами:
Я написал первую итерацию программы на грани засыпания, поэтому в ней было много лишних бессмысленных утверждений и тому подобное. Большая часть этого исправлена, но есть довольно много областей, где улучшение возможно наиболее определенно.
источник
Matlab - 458 символов
Несколько примеров:
источник
Haskell - 711
Демо-версия:
Код:
Большая версия:
источник
Пиф - 111
Слишком поздно для участия в соревнованиях, я просто хотел поделиться. Вот кодер и декодер
Объяснение:
Образец ключа / сообщения / вывода:
источник
С 516
Добавлены переводы строки для улучшения
четкостипредставления. (Разборчивость вышла из окна, я боюсь.)Пример:
источник
Python 3,
709705685664Принимает ввод от стандартного ввода.
Пример:
источник
Python: 591 байт
Используется
stdin
для получения ключа и сообщения в таком порядке. Я надеюсь, что не обманывать использование плоского списка для хранения матрицы шифрования, потому что это сделало работу с матрицей довольно простой. Вот несколько примеров выполнения:источник
z
доlambda x:0if b not in x else b.remove(x)or 1
. Есть также довольно много пробелов, от которых вы можете избавиться. Это также позволит вам переместить его непосредственно вfilter
вызов вместо определения его снаружи.Ява - 791
Мой первый гольф, поэтому любая критика приветствуется. Использование Java, потому что я не должен. Это не так уж плохо; менее чем в два раза больше текущего лидера. Я ожидал, что это будет больше, так как это, ну, в общем , Java :)
С автоформатом:
Образец вывода:
источник
JS (узел) -
528466Образец вывода:
источник
UU
. Похоже, было повторение,E
что вы должны были разделиться.PHP 582
Ungolfed
декодер
выходы
источник
Perl, 265
Очень просто.
Отступ:
источник
CoffeeScript - 610
Демо-версия:
Код:
Безголовая версия:
источник