# Solving and testing the Caesar cipher

Решение без тестов быстро ломается, поэтому добавим к задаче простые проверки.

## Задача

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

## Решение

```python
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 обеспечивает «зацикливание» алфавита. Прочие символы не меняются.

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

```text
Khoor, Zruog!
```

## Сложность

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


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

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

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

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

С добавлением проверок решение становится самодокументируемым — сразу видно, что код делает.

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

[Khoor](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [позиций](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [shift](https://vargasofia45.wixsite.com/my-site-1/post/brandygontherocks-nudes-brandy-g-exclusive-onlyfans-content) · [ord('A](https://privatebin.devol.it/?a012c527d9e87889#DMaBqwCBoZRXv7g1c7vE6fDr3hK23iB7KKGtbqMpdExd) · [добавлением](https://posts.workshop-hub.workers.dev/power-tests) · [Проверка](https://sway.cloud.microsoft/QGD4UKkK5KDj8niY) · [проверка](https://hey.xyz/posts/1mkvksq95m3c1jqawn5) · [символы](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [переводится](https://www.sfahba.com/wp-content/uploads/event-manager-uploads/event_banner/2026/11/event-49d93d.pdf) · [Сложность](https://discuss.tchncs.de/post/65439065) · [решение](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/11/nayavee-f38bac.pdf) · [строки](https://stills33561.mataroa.blog/blog/fkk-boys-baikal-82-photos-of-young-naturists-by-the-lake/) · [World](https://tdubois2.wixsite.com/my-site-1/post/obr%C3%A1zky-miesta-metodicko-pedagogick%C3%A9-centrum-pre%C5%A1ov) · [каждую](https://hey.xyz/posts/227y8yjhdn6jakmsbf5) · [правках](https://yakihonne.com/article/naddr1qvzqqqr4gupzpytpwj2dd6z0ngxrdw5yhva6jxfjl8csvrw6x8udv5h72x36420qqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0ykkvdfhxeskzenr956rsctx956xydtx94sk2c3e94snwcej89jnjwf5vvcrzqvyvs8) · [памяти](https://news-ctl-posts.hashnode.dev/common-mistakes-in-quicksort-mvyj7pfo) · [result.append(ch](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/11/julio-jose-ipcam-4736a6.pdf) · [второй](https://collection50394.mataroa.blog/blog/xvideos-melissa-montagnole/) · [сдвинуть](https://yakihonne.com/article/naddr1qvzqqqr4gupzqhu30rcjzqs32qtrnxhf7x50snzx2pc456qkqwec6cduhgz2ycjdqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0ykkyd35x9nrsdph943nyvt9956rvve394snxcf4943xyvrrxqunzvec89jrs487qaa) · [вызова](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/11/coaklandx-658357.pdf)

