Цезаря Шифр является очень простой шифр подстановки , где каждая буква сдвигается на фиксированное смещение (зацикливание вокруг Z до А). Точно так же мы можем также использовать шифр Цезаря для набора печатных символов ASCII. Это 95 символов из кодовых точек от 0x20 до 0x7E. Для данного смещения d
мы отображаем кодовую точкуC
в
(C - 32 + d) % 95 + 32
который сдвигает все символы на d
и зацикливается ~
на пространстве. Символы вне этого диапазона (управляющие символы, такие как переводы строки, символы табуляции и символы вне диапазона ASCII) не затрагиваются.
Вы должны написать две программы или функции (возможно, на разных языках), которые принимают смещение d
и строку. Первая программа должна вернуть или напечатать Цезарь-шифр ввода. Вторая программа должна вернуть или распечатать обратный шифр Цезаря (то есть, используя смещение -d
). Вы можете получить ввод через STDIN, аргумент командной строки или аргумент функции.
Чтобы сделать вещи более интересными, вторая программа должна быть шифром Цезаря первой программы. То есть, если вы передадите исходный код первой программы самому себе, для некоторого ненулевого смещения d
, на выходе должна быть вторая программа.
Обе программы, а также строки ввода должны содержать только печатные символы ASCII, символы новой строки и вкладки. Ни одна из программ не может содержать комментарии или читать свой собственный исходный код, имя файла или идентификатор процесса прямо или косвенно.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает. Поскольку обе программы должны иметь одинаковый размер, вам нужно только посчитать его один раз.
источник
Python 2, 147
Очевидно, я не слишком задумывался об этом, так как это было бы бесполезно в Python. Есть просто две отдельные программы, неиспользованная из которых заключена в строку.
Смещение между двумя программами составляет 39.
Вперед
Определяет функцию Z, принимающую строку Unicode и смещение.
обратный
Определяет функцию я принимаю строку Юникод и смещение.
источник
Python 3 - 248 байт
Моей целью было сделать это как однострочник Python. Гол успеха, но теперь я не могу быть обеспокоен игрой в гольф.
Шифрование:
Расшифровать:
Редактировать: Исправлено, чтобы не влиять на символы вне диапазона ASCII для печати
Смещение от шифрования к дешифрованию равно 20. Используйте, сначала введя смещение, затем строку, например
объяснение
Следующие преобразования являются ключевыми:
Первый позволяет использовать
or
, а второй игнорирует строку через точку с запятой.Обратите внимание, что
"".__doc__[2]
возвращает строкуr
(взято изstr
). Это необходимо для того, чтобы строка с одинарными кавычками в программе расшифровки не имела случайных кавычек в середине.источник
Рубин,
131125 байтВот мое собственное представление (которое я написал ранее в качестве доказательства концепции, но мне удалось как-то нарушить мои собственные правила). Я не использую какой-либо код между двумя представлениями (в конце концов, я хочу, чтобы вы, ребята, побили это), но вместо этого он состоит из двух строк, одна из которых превращается в строку с бредом.
Вперед шифр:
Обратный шифр:
Оба фрагмента определяют функцию (вызываемую
Y
в первом иJ
во втором), которая принимает целое число и строку и печатает преобразованную строку в STDOUT. Смещение между двумя частями кода составляет40
.источник
ооо код ,
750744 байта, весь код используется в обеих программахСлишком долго, но это, вероятно, правильный инструмент для этого ...
Шифрование:
Расшифровать:
Brainfuck переводы:
oOo CODE - это вариант Brainfuck, где важен только регистр букв.
Он берет первый байт и использует свой символьный код как
d
(поэтому новая строка означает d = 10). Остальная часть ввода - строка. EOF равен 0.источник
GolfScript,
9564 байта, весь код, используемый в обеих программахШифрование:
Расшифровать:
Формат ввода:
объяснение
Расшифровать:
Шифрование:
источник
Javascript (ES7 Draft) -
167165 байтЗаимствование из @feersum использования строк и @MartinButtner использования точки с запятой;)
Шифрование:
Расшифровать:
Смещение для использования: 55
источник
or <empty string> and <function>
а не толькоor <function>
.> <> (Рыба) , 467 байт
Шифрование:
Расшифровать:
Две программы смещены на 3, и они принимают ввод в форме:
Смещение должно быть 2 цифры, поэтому смещение 5 должно быть введено как
05
.Это длинная отправка, но почти все символы без заполнения используются обеими программами . Есть много пробелов, которые, безусловно, можно вывести из игры, но я подумал, что программа будет более интересной в этом смысле.
Это изображение выделяет символы, используемые обеими программами.
объяснение
Основная конструкция, которая делает это возможным,
_{} -> b~!
, позволяет произвольно пропускать символы в программе дешифрования. Как?В общем, программа шифрования ничего не делает, но программа дешифрования пропускает следующую инструкцию. Это может быть расширено до
_{}! -> b~!$
, что позволяет вместо этого произвольно пропускать символы в программе шифрования .Помимо этого, большая часть остальной части программы нажимает на числа, выполняет операции с этими числами, а затем находит способы их вытолкнуть. Например, одна полезная конструкция
~~ -> ""
, которая выдает два значения для программы шифрования, но ничего не выдвигает в программе дешифрования.> <>, 149 байт
Вот менее интересная версия, в которой используется тот факт, что не пройденные инструкции фактически являются комментариями на двухмерных языках.
Шифрование:
Расшифровать:
Две программы смещены на 84 и принимают данные так же, как указано выше. Первая инструкция решает, какую половину программы выполнять, с
i
(вводом) поддержанием потока программы вправо в программе шифрования и^
перенаправлением потока программы вверх (цикл вокруг и возвращение снизу) в программе дешифрования.объяснение
Для соответствующей половины программы шифрования (программа дешифрования аналогична):
Инструмент кодирования
Это не относится к остальной части поста выше, но я думал, что выложу это, потому что мне нужно его использовать: P
источник
Perl - 131
Он принимает входные данные из аргументов командной строки.
Сдвиг на 26 дает другое:
источник