Python

Задача 8. Шифр Цезаря

Что нужно сделать
Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через K позиций по кругу. Если взять русский алфавит и K = 3, то в слове, которое мы хотим зашифровать, буква А станет буквой Г, Б станет Д и так далее.

Пользователь вводит сообщение, а также значение сдвига. Напишите программу, которая зашифрует это сообщение при помощи шифра Цезаря.

Пример:

Введите сообщение: это питон.
Введите сдвиг: 3
Зашифрованное сообщение: ахс тлхср.

ПРИМЕЧАНИЕ ОТ ПРЕПОДАВАТЕЛЯ:


Нужно использовать остаток от деления, чтобы подходил любой код. Плюс в этом модуле желательно использовать List comprehensions для формирования списка новых букв.
>>>
Для русского алфавита в ord (номера символов в таблице Юникода) поменять с "a","z", на русские "а", "я"
Сергей Шаманаев
Сергей Шаманаев
5 840
Лучший ответ
Анчугов Константин И получить геморрой с буквой Ё, которая находится вне диапазона А-Я.
Виталий Калиничев Не рабочий кол
 t = ['АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя']
s, k, res = input('Введите сообщение: '), int(input('Введите сдвиг: ')), ''
for ch in s: # цикл по символам кодируемой строки
for r in t: # цикл по таблицам замены
if (p := r.find(ch)) >= 0: # если нашли букву в таблице замены
ch = r[(p + k) % len(r)] # перекодируем её
break # и заканчиваем поиск
res += ch
print('Зашифрованное сообщение:', res)
Проблема кириллицы в том, что во всех популярных кодировках код буквы Ё находится вне диапазона кодов букв А-Я. Так что простое прибавление k к коду буквы работает неправильно.
Вот решение задачи с использованием остатка от деления и генератора списка (list comprehensions):

```python
message = input("Введите сообщение: ")
shift = int(input("Введите сдвиг: "))

encrypted_message = ""

for char in message:
if char.isalpha(): # проверяем, является ли символ буквой
if char.isupper(): # проверяем, является ли буква заглавной
encrypted_char = chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
else:
encrypted_char = chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
encrypted_message += encrypted_char
else:
encrypted_message += char

print("Зашифрованное сообщение:", encrypted_message)
```

В этом решении мы проходимся по каждому символу в сообщении. Если символ является буквой, мы проверяем, является ли он заглавной (`isupper()`) или строчной. Затем мы применяем шифр Цезаря, используя остаток от деления и сдвиг, и получаем новую букву (`chr()` для преобразования числа в символ). Новая буква добавляется к зашифрованному сообщению. Если символ не является буквой, мы его просто добавляем к зашифрованному сообщению без изменений.

Надеюсь, это поможет! Если у вас есть ещё вопросы, не стесняйтесь задавать.
Олег Качанов Не поможет. О чем и передай своему боту
 def caesar_cipher(message, shift): 
encrypted_message = ""
for char in message:
if char.isalpha():
if char.isupper():
encrypted_message += chr((ord(char) - ord('А') + shift) % 32 + ord('А'))
else:
encrypted_message += chr((ord(char) - ord('а') + shift) % 32 + ord('а'))
else:
encrypted_message += char
return encrypted_message

message = input("Введите сообщение: ")
shift = int(input("Введите сдвиг: "))

encrypted_message = caesar_cipher(message, shift)
print("Зашифрованное сообщение:", encrypted_message)
Вот результат:
Введите сообщение: это питон
Введите сдвиг: 3
Зашифрованное сообщение: ахс тлхср

Process finished with exit code 0
  • Шифр с заменой заглавных букв на маленькие

alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'

text = input('Введите сообщение: ')
step = int(input('Введите сдвиг: '))

encrypted = [alphabet[(alphabet.index(i) + step) % len(alphabet)]
if i in alphabet else i for i in text.lower()]

print('Зашифрованное сообщение:', end=' ')
for j in encrypted:
print(j, end='')