Отказ от ответственности
Этот код работает как бы с Python 3 и не работает как бы с Python 2.
Код
In [1]: def shift(c,n=13,alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
u = c.upper()
if u not in alphabet: return c
s = alphabet[(alphabet.index(u)+n)%26]
if u!=c: s=s.lower()
return s
...:
In [2]: def caesar(s,n=13): return "".join(shift(c,n) for c in s)
In [3]: def decaesar(s,n=13): return "".join(shift(c,-n) for c in s)
In [4]: caesar('Puffo Burlone, dove vai?')
Out[4]: 'Chssb Oheybar, qbir inv?'
In [5]: decaesar(_)
Out[5]: 'Puffo Burlone, dove vai?'
In [6]: caesar('Puffo Burlone, dove vai?',22)
Out[6]: 'Lqbbk Xqnhkja, zkra rwe?'
In [7]: decaesar(_,22)
Out[7]: 'Puffo Burlone, dove vai?'
In [8]: caesar('Puffo Burlonè, dovè vai?') # note the accented letters
Out[8]: 'Chssb Oheybaè, qbiè inv?'
In [9]: decaesar(_)
Out[9]: 'Puffo Burlonè, dovè vai?'
Обсуждение
Ядром этого материала является функция shift
, которая проверяет, находится ли символ верхнего регистра в alphabet
, и если нет, возвращает его как есть, в противном случае сдвигает его на n
символа (n может быть отрицательным) вокруг буквенного пончика, как вы get, используя оператор по модулю %
, тогда, если c
в нижнем регистре, он возвращает сдвинутый символ в нижнем регистре, в противном случае он возвращает сдвинутый символ, который, исходя из алфавита верхнего регистра, имеет верхний регистр.
Затем у нас есть функции caesar
и decaesar
, которые объединяют сдвинутые символы, взятые из первого обязательного аргумента, необязательный аргумент - это величина сдвига, по умолчанию 13
; разница в том, что в decaesar
shift
вызывается с отрицательным n
, так что мы отменяем сдвиг.
В конце концов, мы тестируем наши функции, которые работают также с символами, отличными от ascii, которые остаются одни в зашифрованной строке ... вышесказанное относится к Python 3, кстати, с Python 2 символы, отличные от ascii, искажены.
person
gboffi
schedule
01.05.2015