Ответы и решения урока 15.5(Шифр Цезаря) на курс «Поколение Python: курс для начинающих».
Все задачи можно решить написав одну функцию, но я для каждого случая предоставил разные решения
Как вы думаете, улучшает ли многократное шифрование стойкость алгоритма Цезаря?
нет Какой из алгоритмов
ROT Nможно отменить, применив тот же алгоритм? (Одни и те же действия могут быть использованы для кодирования и декодирования).Примечание. Используется английский алфавит в котором 2626 букв.
ROT 13 Зашифруйте текст «Блажен, кто верует, тепло ему на свете!» алгоритмом Цезаря с сдвигом вправо на 1010 символов.
Примечание. Считайте, что русский алфавит состоит из 3232 букв (буква ё отсутствует).
# ОТВЕТ Лхкрпч, фьш мпъэпь, ьпщхш пцэ чк ымпьп!
# Код для решения
# Запускаем цикл for, который будет перебирать каждый символ в введенной строке (input() возвращает строку).
for i in input():
# Проверяем, является ли символ буквой.
if i.isalpha():
# С помощью ord(i) получаем числовое значение символа i в кодировке Unicode.
# Затем к этому числу добавляем 10 (смещение на 10 позиций).
# Важно: ord('я') - последний символ в русской алфавитной таблице, и это значение используется
# для определения "грани" алфавита, чтобы учесть круговое смещение (после 'я' идет опять 'а').
# Затем мы берем остаток от деления на ord('я'), чтобы убедиться, что остаемся в пределах алфавита.
# Далее мы используем chr() для преобразования числового значения обратно в символ и выводим его.
print(chr((ord(i) + 10) % ord('я')), end='')
else:
# Если символ не является буквой, мы просто выводим его без изменений.
print(i, end='')
Зашифруйте текст «To be, or not to be, that is the question!» алгоритмом Цезаря с сдвигом вправо на 1717 символов.
# ОТВЕТ Kf sv, fi efk kf sv, kyrk zj kyv hlvjkzfe!
# Код для решения
def caesar_cipher(text, shift):
result = ""
for char in text:
if char.isalpha():
# Определяем базу для сдвига в зависимости от регистра буквы (A для больших, a для маленьких)
base = ord('A') if char.isupper() else ord('a')
# Применяем сдвиг и учитываем, что алфавит круглый (после 'Z' идет 'A', после 'z' идет 'a')
shifted_char = chr(((ord(char) - base + shift) % 26) + base)
result += shifted_char
else:
# Если символ не является буквой, оставляем его неизменным
result += char
return result
text_to_encrypt = "To be, or not to be, that is the question!"
shift_amount = 17
encrypted_text = caesar_cipher(text_to_encrypt, shift_amount)
print("Зашифрованный текст:", encrypted_text) Текст «Шсъцхр щмчжмщ йшм, нмтзж йшм лхшщзщг.» был получен в результате шифрования алгоритмом Цезаря с сдвигом вправо на 77 символов. Расшифруйте данный текст.
Примечание. Считайте, что русский алфавит состоит из 3232 букв (буква ё отсутствует).
# ОТВЕТ Скупой теряет все, желая все достать.
# Код для решения
# Исходный зашифрованный текст
s = 'Шсъцхр щмчжмщ йшм, нмтзж йшм лхшщзщг.'
# Пустая строка для расшифрованного текста
m = ''
# Проходим по каждому символу в зашифрованном тексте
for i in s:
if i.isalpha(): # Проверяем, является ли символ буквой
m += chr(ord(i) - 7) # Расшифровываем символ с учетом сдвига влево на 7 позиций
else:
m += i # Если символ не буква, оставляем его неизменным
# Приводим результат к нижнему регистру
m = m.lower()
# Первую букву текста делаем заглавной
print(m.capitalize()) Текст «Sgd fqzrr hr zkvzxr fqddmdq nm sgd nsgdq rhcd ne sgd edmbd.» был получен в результате шифрования алгоритмом Цезаря со сдвигом вправо на 2525 символов. Расшифруйте данный текст.
# ОТВЕТ The grass is always greener on the other side of the fence.
# Код для решения
n, s = -25, 'Sgd fqzrr hr zkvzxr fqddmdq nm sgd nsgdq rhcd ne sgd edmbd.'
# Проходим по каждому символу в зашифрованной строке s
for i in s:
if i.isalpha(): # Проверяем, является ли символ буквой
c = ('a', 'A')[i.isupper()] # Определяем регистр символа (нижний или верхний)
# Расшифровываем символ, учитывая сдвиг n и круговой алфавит (26 букв)
print(chr(ord(c) + (ord(i) + n - ord(c)) % 26), end='')
else:
# Если символ не буква, оставляем его неизменным
print(i, end='') Текст «Hawnj pk swhg xabkna ukq nqj.» был получен в результате шифрования алгоритмом Цезаря с сдвигом вправо на nn символов. Расшифруйте данный текст.
Примечание. Считайте, что n \in [0; \, 25]n∈[0;25].
# ОТВЕТ Learn to walk before you run.
# Код для решения
s = "Hawnj pk swhg xabkna ukq nqj."
# Перебираем все возможные сдвиги от 0 до 25
for n in range(26):
# Начинаем формировать расшифрованную строку для текущего сдвига
decrypted_text = ""
# Перебираем каждый символ в зашифрованной строке s
for c in s:
if c in ',.?! ': # Если символ - знак пунктуации или пробел, выводим его без изменений
decrypted_text += c
elif 65 <= ord(c) <= 90: # Если символ - заглавная буква (A-Z)
decrypted_text += chr((ord(c) - n - 65) % 26 + 65)
elif 97 <= ord(c) <= 122: # Если символ - строчная буква (a-z)
decrypted_text += chr((ord(c) - n - 97) % 26 + 97)
# Выводим расшифрованную строку для текущего сдвига
print(decrypted_text) На вход программе подается строка текста на английском языке, в которой нужно зашифровать все слова. Каждое слово строки следует зашифровать с помощью шифра Цезаря (циклического сдвига на длину этого слова). Строчные буквы при этом остаются строчными, а прописные – прописными.
n = input() # Получаем строку от пользователя.
# Удаляем из строки знаки пунктуации и символы, которые не будут учитываться при шифровании.
s = n
for j in n:
if j in '*,.!@"-':
s = s.replace(j, '')
# Создаем список `g`, который содержит длины слов из строки в виде чисел.
g = [len(i) for i in s.split()]
# Инициализируем переменные для шифрования.
count = 0
word_new = ''
# Проходим по каждому символу в исходной строке `n`.
for d in n:
number = ord(d) # Получаем числовое значение символа в кодировке Unicode.
if d == ' ': # Если символ - пробел, увеличиваем счетчик и добавляем его в результат.
count += 1
word_new += chr(number)
elif 65 <= number <= 90: # Если символ - заглавная буква (A-Z), выполняем шифрование.
number += g[count]
if number > 90: # Если результат выходит за пределы A-Z, выполняем циклический сдвиг.
number = number - 26
word_new += chr(number)
else:
word_new += chr(number)
elif 97 <= number <= 122: # Если символ - строчная буква (a-z), выполняем шифрование.
number += g[count]
if number > 122: # Если результат выходит за пределы a-z, выполняем циклический сдвиг.
number = number - 26
word_new += chr(number)
else:
word_new += chr(number)
else:
word_new += chr(number) # Если символ не буква, добавляем его без изменений.
print(word_new) # Выводим расшифрованную строку.
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы
Чтобы заработал цезарь добавьте в строчку со спецсимволами вопросительный знак
Failed test #4 of 5. Wrong answer
Ave, Cesar
почему вечно нет последних двух заданий ?
именно они мне и нужны
Блокировшик рекламы их вырезает, отключите адблок или другой используемый вами блокировшик
я с телефона зашла=) конкретно за этой последней задачей, оно того стоило!
не работает этот код алгоритм цезаря не верный