Skip to main content

Solving and testing the Caesar cipher (part b3c0)

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) по памяти под результат.

Проверка тестами

Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.

assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай

Такой минимум уже защищает от случайной ошибки при правках кода.

Тесты вида assert удобны для учебных задач: они короткие, наглядные и не требуют фреймворков.

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

случай · правках · python · result · вызова · Khoor · требуют · Цезаря · каждую · символы · алфавита · тестами · номер · номеру · shift · ломается · добавим · ord('A · число · деления · работы · второй · случаи · Сложность · Задача · наглядные · ord('a · сдвиг · памяти

No comments yet. Be the first to comment.

More from this blog