Захотел написать код для Python, чтобы шифровать слова, введённые после запуска.
Вот начальная версия кода:
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
shift_base = ord('a') if char.islower() else ord('A')
result += chr((ord(char) - shift_base + shift) % 26 + shift_base)
else:
result += char
return result
text = input("Введите текст для шифрования: ")
shift = int(input("Введите сдвиг: "))
encrypted_text = caesar_cipher(text, shift)
print("Зашифрованный текст:", encrypted_text)
Но проблема в том, что английские и русские буквы (все 33, включая ё) не могут шифроваться одновременно, а также, что буква "ё" не шифруется должным образом вместе с буквой "я". Могут появляться буквы по типу эпсилон (?), а "я" меняться на б.
Вот вторая версия кода с костылём бля букв "ё и я", но хотелось бы (требуют), сделать без костылей:
def caesar_cipher(text,
shift): # Объявляет функцию Цезарь которая принимает текст для шифрования и число на которое будет сдвинуто число
result = "" # строчка для добавления зашифрованного текста (куда будет добавляться)
for char in text: # цикл по каждому символу в исходном тексте
if char.isalpha(): # Заглавная или строчная каждый символ (проверка)
if char == 'ё': # Проверка для символа ё
result += chr(ord('ж')) # Шифруем ё как ж
continue
elif char == 'Ё': # Проверка для заглавной Ё
result += chr(ord('Ж')) # Шифруем Ё как Ж
continue
shift_base = ord('а') if char.islower() else ord('А')
# Если буква строчная, shift_base устанавливается в ASCII-код символа а,
# Иначе — в код А. Это нужно для правильного сдвига в зависимости от регистра буквы.
result += chr((ord(char) - shift_base + shift) % 32 + shift_base)
# В этой строке: ord(char) получает ASCII-код текущего символа.
# ord(char) - shift_base приводит код к диапазону от 0 до 31.
# + shift добавляет значение сдвига.
# % 32 берет остаток от деления, чтобы обеспечить циклический сдвиг (т.е. после 'я' снова начинается 'а').
# + shift_base возвращает код обратно в исходный диапазон, и chr() преобразует его обратно в символ.
# Результирующий символ добавляется к строке result.
else:
result += char # присваив с добавлением
# Если текущий символ не буква (например, пробел или пунктуация), он просто добавляется к result без изменений.
return result # Возвращает зашифрованный текст.
text = input("Введите текст для шифрования: ") # Запрашивает у пользователя ввод текста для шифрования.
shift = int(
input("Введите сдвиг: ")) # Запрашивает у пользователя ввод значения сдвига и преобразует его в целое число.
encrypted_text = caesar_cipher(text, shift)
# Вызывает функцию caesar_cipher с введенными текстом и сдвигом, сохраняя результат в переменной encrypted_text.
print("Зашифрованный текст:", encrypted_text) # Выводит зашифрованный текст на экран.
Прошу помочь написать код для шифра Цезара правильно и без костылей для исправления определённых букв, если кто-то разбирается в данной теме, чтобы можно было также выбирать степень переноса вперёд, а также все буквы английского и русского алфавита работали вместе.