#python #caesar-cipher
Вопрос:
Я новичок в кодировании на python и попробовал решить задачу, с которой мне трудно справиться, и мне не помешала бы помощь. Я получил почти весь правильный код, за исключением одного небольшого фрагмента, который я, похоже, не могу понять. Моя задача состояла в том, чтобы взять строку текста, введенную пользователем, и зашифровать ее с помощью шифра Цезаря. Мой код делает что-то вроде «Привет, мир» и меняет его на «Lipps$asvph», но в нем должно быть написано «Lipps${svph%». На данный момент я не могу понять, почему «{» превратилось в «а», но я хотел спросить и посмотреть, может ли кто-нибудь еще понять, в чем может быть проблема.
distance = int(input("Enter the distance value: "))
code = ""
for ch in message:
ordvalue = ord(ch)
cipherValue = ordvalue distance
if cipherValue > ord('z'):
cipherValue = ord('a') distance -
(ord('z') - ordvalue 1)
code = chr(cipherValue)
print(code)
Комментарии:
1. потому что вы добавляете 1?
2. Каково значение «d», которое вы даете в этом случае?
3. в качестве дополнительного примечания я предлагаю использовать согласованные имена переменных (см. «Значение порядка» против «значение шифра»). Кроме того, PEP8 утверждает, что Python должен использовать «snake_case», а не «camelCase».
Ответ №1:
Логика здесь такова:
- смещение символов на
distance
- если результат выше
z
, оберните его вокруг (таким образом, z, сдвинутый на 1, превращается в a)
Проблема: специальные символы, такие как {
, находятся вне a..z
диапазона, но они тоже смещены. Поскольку проверка проводится только для значений выше z, значения ниже » a » не затрагиваются (например,»%»).
Исправление: проверьте, не выходит ли значение за пределы диапазона читаемых символов (32..255), а не a..z
:
max_value = 255 # used to be ord('z')
min_value = 32 # used to be ord('a')
for ch in message:
ordvalue = ord(ch)
cipherValue = ordvalue distance
if cipherValue > max_value:
cipherValue = min_value distance -
(max_value - ordvalue 1)
code = chr(cipherValue)