Задачка на Python: расшифруйте строку
Для разминки мозга и улучшения знания языка полезно порешать какие-нибудь задачки. В этой задаче будем разгадывать шифр на Python несколькими способами.
20К открытий20К показов
Ссылка на оригинал задачи: http://www.pythonchallenge.com/pc/def/map.html. Обратите на неё внимание, она нам ещё пригодится.
Условие
Есть три пары:
- K → M;
- O → Q;
- E → G.
С их помощью нужно расшифровать следующий текст:
g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr’q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.
Подсказки
Подсказка из ссылки: map. Также вы могли заметить, что между символами в парах находится ровно одна буква: K→L→M, O→P→Q, E→F→G. Кроме того, первой буквой в тексте является g
, и если допустить, что оригинальное сообщение на английском, то можно предположить, что g
— на самом деле i
. Что у нас находится между g
и i
? Правильно, G→H→I. Поэтому давайте сдвинем каждый символ вправо на две позиции, y
сдвинем к a
и z
сдвинем к b
.
Прим.перев. В этой задаче применён шифр Цезаря.
Текст не очень длинный, поэтому просто скопируем его в REPL:
Решение 1
Пара функций, которые помогут в преобразовании символов:
ord()
: сопоставляет символу целое число — его номер в таблице Unicode;chr()
: сопоставляет целому числу символ по таблице Unicode.
Например:
Сдвигаем символы:
Но с z
так сделать не получится:
Чтобы всё заработало, посчитаем расстояние от a
до z
:
Если оно больше 26 — найдём остаток от деления на 26:
Добавим его к a
:
И вынесем всё в отдельную функцию:
Расшифруем весь текст:
Так мы обычно записываем циклы в Java или C, но в Python есть способ получше — генераторы:
Раз уж нам предлагают использовать maketrans()
, давайте именно так и сделаем.
Решение 2
В Python 3 maketrans()
не является функцией модуля string
; для вызова надо использовать str.maketrans()
или bytes.maketrans()
:
Примечание В Python 2 maketrans()
является функцией модуля string
, поэтому сначала придётся её импортировать:
Решение 3
Теперь давайте напишем свой вариант maketrans
. На вход подаются две строки, затем символы из первой соотносятся с символами из второй.
Определяем строки:
Применяем zip
:
Создаём словарь:
Переводим всю строку:
Следующий уровень
Вспомним ссылку из начала статьи. Применим нашу функцию на слове map и получим ocr:
Теперь у вас есть ссылка на следующую задачку: http://www.pythonchallenge.com/pc/def/ocr.html.
20К открытий20К показов