Напишите две программы:
- Одна, которая читает строку и ключ и кодирует строку в шифр ограждения с использованием этого ключа. - Аналогично, напишите программу для функции реверса: расшифровка ограды с помощью ключа.
Для тех, кто не знает, что такое шифровальный забор, это в основном метод написания простого текста таким образом, чтобы он создавал линейный рисунок по спирали. Пример - когда «FOOBARBAZQUX» огражден с помощью ключа 3.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
Читая вышеупомянутую спираль построчно, зашифрованный текст становится "FAZOBRAQXOBU".
Подробнее читайте в разделе - Железнодорожный забор шифра - Википедия .
Код на любом языке приветствуется.
Кратчайший ответ в байтах побеждает.
code-golf
cryptography
cipher
ShuklaSannidhya
источник
источник
Ответы:
Python 133 байта
Пример использования:
Примечание: результаты даже по количеству рельсов отличаются от того, который вы указали, но, похоже, они верны. Например, 6 рельсов:
соответствует
AKUBJLTVCIMSWDHNRXEGOQYFPZ
, а неAKUTBLVJICMSWXRDNHQYEOGZFP
как ваш код выдает.Основная идея состоит в том, что каждый рельс может быть найден напрямую, взяв кусочки строки
[i::m]
, гдеi
номер рельса (0
-индексированный) иm
есть(num_rails - 1)*2
. Внутренние рельсы, кроме того, должны быть переплетены[m-i::m]
, что достигается путем застегивания и объединения двух наборов символов. Поскольку второй из них может быть на один символ короче,он дополняется символом, который, как предполагается, нигде не появляется (он преобразуется в список и дополняется пустой строкой._
), а затем этот символ удаляется, если необходимо,Немного более читабельная форма:
источник
APL
5241Если входная текстовая строка i и номер ключа n предварительно инициализированы, решение может быть сокращено на 9 символов. Запуск решения на примерах, приведенных в primo, дает идентичные ответы:
При дальнейшем рассмотрении представляется более короткое решение на основе индексов:
источник
Python 2 , 124 + 179 = 303 байта
Encode:
Попробуйте онлайн!
Decode:
Попробуйте онлайн!
источник
MATL, 70 байт (всего)
Попробуй на MATL Online
Попробуй несколько тестов
Принимает флаг как третий вход,
F
чтобы зашифровать строку,T
чтобы расшифровать ее (спасибо Кевину Круйссену за эту идею).Это началось с ответа Джулии, пока я не понял, что строгая типизация слишком мешает, особенно для расшифровки. Вот код Джулии, который у меня был для шифрования (перенесен в v0.6 для TIO):
Юлия 0,6 , 191 байт
Попробуйте онлайн!
Объяснение:
Железнодорожный забор
можно увидеть как чтение r = 3 символов ввода, затем чтение r-2 символов, добавление префикса и суффикса к пустым значениям (нулям), затем повторное чтение r символов и т. д., каждый раз создавая новый столбец:
затем реверсирует каждый второй столбец (поскольку зигзагообразная часть загона идет вверх, а не вниз, что имеет значение при r> 3), затем читает эту матрицу вдоль строк и удаляет фиктивные символы.
Дешифровка, похоже, не имела явных закономерностей, подобных этой, но при поиске по этому поводу я наткнулся на этот пост , в котором говорилось, что (а) это был хорошо известный и (возможно?) Опубликованный алгоритм для железнодорожных шифров, и ( б) дешифрование было простым повторным использованием того же метода, давая ему индексы строки и получая индексы этих индексов после шифрования, и читая зашифрованный текст в этих местах.
Поскольку дешифрование должно действовать, работая с индексами, этот код выполняет шифрование также путем сортировки индексов строки, а затем в этом случае просто индексации по этим переупорядоченным индексам.
источник
Я хочу пояснить в этом коде.
источник
Java 10,
459451445439327 байт-12 байт благодаря @ceilingcat .
-112 байт, объединяющих две функции с дополнительным флагом режима в качестве входных данных.
Функция принимает третий вход
M
. Если это так,true
он будет шифровать, и если это так,false
он будет расшифровываться.Попробуйте онлайн.
Объяснение:
источник