Skip to main content

Two ways to solve the Caesar cipher (part 971c)

Updated 2 min readMarkdown

Разберём решение и посмотрим, как та же задача решается другим способом.

Задача

Реализовать шифр Цезаря: сдвинуть каждую букву строки на фиксированное число позиций в алфавите.

Решение

def caesar(text: str, shift: int) -> str:
    result = []
    for ch in text:
        if ch.isalpha():
            base = ord('A') if ch.isupper() else ord('a')
            result.append(chr((ord(ch) - base + shift) % 26 + base))
        else:
            result.append(ch)
    return ''.join(result)


print(caesar("Hello, World!", 3))

Как это работает

Буква переводится в номер внутри алфавита, к номеру прибавляется сдвиг, а остаток от деления на 26 обеспечивает «зацикливание» алфавита. Прочие символы не меняются.

Пример работы

Khoor, Zruog!

Сложность

O(n) по времени, O(n) по памяти под результат.

Альтернативный подход

Ту же задачу часто решают иначе: например, через рекурсию вместо цикла или через стандартную библиотеку вместо ручной реализации. Альтернатива обычно короче, но первое «ручное» решение лучше показывает механику работы алгоритма. Полезно написать оба и сравнить на одинаковых тестах.

Оба подхода рабочие; важно понимать цену каждого, а не копировать первый попавшийся.

Читайте также:

зацикливание · одинаковых · решают · Решение · ручное · внутри · ch.isupper · прибавляется · фиксированное · меняются · позиций · часто · Сложность · попавшийся · каждую · решение · первый · понимать · сдвиг · стандартную · Пример · ручной · остаток · копировать · подход · например

No comments yet. Be the first to comment.

More from this blog