Solving and testing the Caesar cipher (part 6b9c)
Посмотрим на задачу глазами разработчика: сначала решение, затем убеждаемся в его корректности.
Задача
Реализовать шифр Цезаря: сдвинуть каждую букву строки на фиксированное число позиций в алфавите.
Решение
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 # и второй случай
Такой минимум уже защищает от случайной ошибки при правках кода.
С добавлением проверок решение становится самодокументируемым — сразу видно, что код делает.
Читайте также:
глазами · result · число · Такой · корректности · работает · проверок · случаи · Цезаря · ch.isalpha · сначала · зацикливание · ch.isupper · Посмотрим · ord('a · фиксированное · примерах · включая · ord('A · assert · второй · убеждаемся · меняются · result.append(ch · Проверка · памяти · проверять · номеру · символы · Буква
