Ответы и решения урока 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) # Выводим расшифрованную строку.
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы
почему вечно нет последних двух заданий ?
именно они мне и нужны
Блокировшик рекламы их вырезает, отключите адблок или другой используемый вами блокировшик
я с телефона зашла=) конкретно за этой последней задачей, оно того стоило!
не работает этот код алгоритм цезаря не верный