Для разминки мозга и улучшения знания языка полезно порешать какие-нибудь задачки. В этой задаче будем разгадывать шифр на Python несколькими способами.
Подсказка из ссылки: map. Также вы могли заметить, что между символами в парах находится ровно одна буква: K→L→M, O→P→Q, E→F→G. Кроме того, первой буквой в тексте является g, и если допустить, что оригинальное сообщение на английском, то можно предположить, что g — на самом деле i. Что у нас находится между g и i? Правильно, G→H→I. Поэтому давайте сдвинем каждый символ вправо на две позиции, y сдвинем к a и z сдвинем к b.
def decode_char(char):
if 'a' <= char <= 'z':
t = ord(char) + 2
t = (t - ord('a')) % 26
c = chr(t + ord('a'))
return c
else:
return char
Расшифруем весь текст:
>>> result = ""
>>> for c in raw:
... result += decode_char(c)
...
...
>>> result
"i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url."
Так мы обычно записываем циклы в Java или C, но в Python есть способ получше — генераторы:
>>> ''.join(decode_char(c) for c in raw)
"i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url."
Раз уж нам предлагают использовать maketrans(), давайте именно так и сделаем.
Решение 2
В Python 3 maketrans() не является функцией модуля string; для вызова надо использовать str.maketrans() или bytes.maketrans():
>>> table = str.maketrans("abcdefghijklmnopqrstuvwxyz", "cdefghijklmnopqrstuvwxyzab")
>>> raw.translate(table)
"i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url."
Примечание В Python 2 maketrans() является функцией модуля string, поэтому сначала придётся её импортировать:
>>> "".join(d[x] for x in raw)
"i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url."
Следующий уровень
Вспомним ссылку из начала статьи. Применим нашу функцию на слове map и получим ocr: