Решение модуля 15.5 из курса «Поколение Python: для начинающих»

Ответы и решения урока 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)  # Выводим расшифрованную строку.

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

4 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
N1kki
N1kki
5 месяцев назад

почему вечно нет последних двух заданий ?
именно они мне и нужны

maiz
maiz
Ответить на  N1kki
2 месяцев назад

я с телефона зашла=) конкретно за этой последней задачей, оно того стоило!

юрий
юрий
9 месяцев назад

не работает этот код алгоритм цезаря не верный

4
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x