Почему мой шифр Цезаря в python отключен на 1 символ?

#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)