Зашифрованные фразы на английском
Обновлено: 04.11.2024
Ылчу Щзкгув
Или в переводе с «Шифра Цезаря» на русский — Шифр Цезаря.
— А как же буквы в конце алфавита? Что с пробелами?
С ними всё в порядке. Если смещая букву шифр выходит за рамки алфавита — он начинает отсчёт сначала. То есть, буквы «эюя» обратяться в «абв». А пробелы остаются пробелами.
— Разве N обязательно должно равняться трём?
Совсем нет. N может отличаться от тройки. Допускаются любые N в промежутке [1: M-1], где M — количество букв в алфавите.
Такой шифр легко расшифровать, если знать о его существовании. Но меня привлекла не его «надёжность», а кое-что другое.
Одним летним днём мне захотелось узнать:
- А что если я зашифрую слово с помощью «Цезаря», а на выходе получу существующее слово?
- Сколько таких слов «перевёртышей» есть?
- И будет ли закономерность, если менять N?
Ответы на эти вопросы я начал искать в те же минуты.
Отступление. Из концертов Михаила Задорнова и личного опыта я понял две вещи:
- Американцы не обижаются на речи русских комиков.
- Русский язык силён и могуч. И слов в нём немеряно много.
Поэтому я решил взять за основу английскую мову. К тому же, когда-то давно была инфа, что англоязычные ребята смогли собрать полный словарь английских слов. Что побудило меня найти такой Датасет.
Первая строка вялого гугления навела меня на этот репозиторий. Автор обещал 479K английских слов в удобных форматах. Мне приглянулся файл json, в котором все слова были уложены в удобном виде для загрузки в словарь Python.
После первого вскрытия оказалось, что слов там поменьше — 370 101 штука. «Но это не беда, ведь для показательного примера вполне хватит», подумал я.
Для начала нужно создать алфавит. Решил сделать его в виде списка самым удобным для меня методом. Также нужно было запомнить количество букв в алфавите:
Сначала было интересно сделать функцию перевода слова в зашифрованное. Вот что получилось:
Решил сделать большой цикл по всем словам и начать их переводить одно за другим. Но наткнулся на проблему. Оказалось, что некоторые слова содержали знак «-», что было удивительно и естественно одновременно.
Недолго думая, я подсчитал количество таких слов и оказалось, что их — всего два. После чего удалил оба, ведь на результате это почти не скажется. На помощь мне родилась эта функция:
Словарь имел вид:
Поэтому я принял решение не мудрить и заменить единички на закодированные слова. Для этого написал функцию:
И, конечно, нужен был большой цикл, который пройдёт по всем словам, найдёт слова-перевёртыши и сохранит результат. Вот он:
Вы могли заметить, что в параметрах функции стоит «min_len=0». Он будет нужен в будущем. Ибо особенностью этого Датасета был «странный» набор слов. Таких как: «аа», «aah» и подобные сочетания. Именно они дали первый результат — 660 слов-перевёртышей.
Поэтому пришлось поставить ограничение в пять минимум пять символов, чтобы слова были приятны глазу и похожи на существующие.
Да, десять слов-перевёртышей нашлись благодаря алгоритму. Моё любимое сочетание:
primero [Первый] → sulphur [Сера]. Большинство других пар Google-переводчик не распознаёт.
На этом этапе я частично погасил жажду познания. Но впереди остались вопросы типа: «А что же с другими N?»
И с помощью данной функции я нашёл ответ:
Цикл закончил работу за 10–15 секунд. Осталось только посмотреть результаты. Но, как я считаю — всё интереснее, когда есть график. А вот финальная функция, которая покажет нам итог:
— А что если я зашифрую слово с помощью «Цезаря», а на выходе получу существующее слово?
— Такое возможно, даже очень. Некоторые N дают намного бОльше слов, чем другие.
— Сколько таких слов «перевёртышей» есть?
— Зависит от N, минимальной длины и, конечно, от Датасета. В моём случае при N=3, минимальной длиной слова в 0 и в 5 — количество слов: 660 и 10 соответственно.
— И будет ли закономерность, если менять N?
— Как видно, да! Из графика (или тепловой карты) можно заметить, что цвета симметричны. И значения в матрице результатов говорят об этом. А ответ на вопрос «Почему так?» оставлю читателю.
- Не совсем корректный Датасет. Многие слова неочевидны. Хотя, так может быть. Это же «все» слова английского языка.
- Код всегда можно улучшить.
- «Шифр Цезаря» — частный случай «Афинного шифра», где формула:
Для «Шифра Цезаря» А = 1. Кстати, у него больше нюансов, а значит — больше интересного.
Мой рабочий файл с результатом и списком слов-перевёртышей лежит в этом репозитории
Читайте также: