21
Июл
2021

Проблема со смещением в шифре цезаря

Стандартный шифр Цезаря. Проблема в расчетной формуле, если задано смещение больше длины алфавита. Ожидаю, что при смещении 1, буква А станет Б, а при смещении 34 буква Я станет А. Не пойму что напутал в цифрах.

eng_lower_alphabet = 'abcdefghijklmnopqrstuvwxyz'
eng_upper_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
rus_lower_alphabet = "абвгдежзийклмнопрстуфхцчшщъыьэюя"
rus_upper_alphabet = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
symbol = [" ", ",", ".", "!", "?"]

def shift(i, offset):
    if i.isalpha():
        if i in eng_lower_alphabet:
            print(eng_lower_alphabet[(ord(i) + (offset % 26)) - 97])
        if i in rus_lower_alphabet:
            print(rus_lower_alphabet[(ord(i) + (offset % 33)) - 1072])
        if i in eng_upper_alphabet:
            print(eng_upper_alphabet[(ord(i) + (offset % 26)) - 65])
        if i in rus_upper_alphabet:
            print(rus_upper_alphabet[(ord(i) + (offset % 33)) - 1040])
        
print("Введите букву")
phrase = input()
shift(phrase, 1088)

Ошибка:

IndexError                                Traceback (most recent call last)
<ipython-input-99-1f3e9ddd2432> in <module>
     18 print("Введите букву")
     19 phrase = input()
---> 20 shift(phrase, 1088)
     21 
     22 

<ipython-input-99-1f3e9ddd2432> in shift(i, offset)
     10             print(eng_lower_alphabet[(ord(i) + (offset % 26)) - 97])
     11         if i in rus_lower_alphabet:
---> 12             print(rus_lower_alphabet[(ord(i) + (offset % 33)) - 1072])
     13         if i in eng_upper_alphabet:
     14             print(eng_upper_alphabet[(ord(i) + (offset % 26)) - 65])

IndexError: string index out of range

Источник: https://ru.stackoverflow.com/questions/1307450/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81%D0%BE-%D1%81%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC-%D0%B2-%D1%88%D0%B8%D1%84%D1%80%D0%B5-%D1%86%D0%B5%D0%B7%D0%B0%D1%80%D1%8F

Тебе может это понравится...

Добавить комментарий