13. Код Цезаря. Дешифровка. (в коде есть строки из следующих тем: "словари").
Условие:
Основываясь на предыдущей задаче, и зная смещение, нужно дешифровать зашифрованное сообщение.
Код:
alphabet = { "а": 1, "б": 2, "в": 3, "г": 4, "д": 5, "е": 6, "ё": 7, "ж": 8, "з": 9, "и": 10, "й": 11, "к": 12, "л": 13, "м": 14, "н": 15, "о": 16, "п": 17, "р": 18, "с": 19, "т": 20, "у": 21, "ф": 22, "х": 23, "ц": 24, "ч": 25, "ш": 26, "щ": 27, "ъ": 28, "ы": 29, "ь": 30, "э": 31, "ю": 32, "я": 33 }
diapazon_letters = range(1, 34)
while True:
try:
move = int(input("%40s" % "Ведите смещение от 1 до 32: "))
if move in range(1, 33):
break
else:
print("%39s" % "Смещение может быть только от 1 до 32.")
except:
print("%39s" % "Смещение может быть только от 1 до 32.")
continue
message = input("%40s" % "Введите сообщение от Цезаря: ")
message_new = str()
for i in message: # обойдём все символы послания в цикле
i = i.lower() # все символы в послании приведём в нижний регистр
if i in alphabet: # если это русская буква и она есть в алфавите
digit = alphabet[i] # узнаем номер этой буквы
if (digit - move + 33) <= 33:
new_digit = (digit - move + 33) # согласно смещению, назначит новый номер букве (до шифрования)
else:
new_digit = (digit - move + 33) % 33 # согласно смещению, назначит новый номер букве (до шифрования)
for a, b in alphabet.items(): # обойдём алфавит и найдём новую букву для реальной цифры
if b == new_digit:
message_new += a # добавим букву в новое сообщение
else:
message_new += i # этот блок добавляет символ в новое сообщение без изменений (это не буква в нашем алфавите)
print("%39s" % message_new)