# Solving and testing the Caesar cipher (part acac)

Разберём решение и сразу накроем его тестами — это хороший стиль работы с кодом.

## Задача

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

## Решение

```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  # и второй случай
```

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

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

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

[Прочие](https://statics.pancake.vn/web-media-264/40/27/6e/7a/321e1549d50e00176f6ab2c2787f121cec041f3b1b55fe06145f6de2.pdf) · [накроем](https://adora.barcelona/soikahere?f=linkcentre) · [фиксированное](https://contracosta.news/wp-content/uploads/event-manager-uploads/event_banner/2026/10/valeria-negurenko-a8e169.pdf) · [хороший](https://drop.xtrafrancyz.net/selif/u03tog6jvo.pdf) · [проверять](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/10/ip-cam-7f1fd6.pdf) · [result](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [меняются](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [нескольких](https://radicle.network/nodes/seed.pipapo.org/rad%3Az21hA6JXMeEH3fMoqVM7vTfSbnAmU/issues/81ed66f6c2a95816d6583d165e7f87ecc9f816ef) · [caesar(text](https://news-ctl-posts.hashnode.dev/exploring-string-reversal-part-470d) · [ch.isalpha](https://radicle.network/nodes/index.radicle.garden/rad%3Azf4hAtGdgqHuyrJyQRjjMFkLknv8/issues/cd3c8df871219b39826df2eb50d89b4281442960) · [Проверка](https://articlescad.com/mallu-lovers-sex-387399.html) · [сдвиг](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [работы](https://sway.cloud.microsoft/6KAXXF6FWAgg8g8R) · [удобны](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/10/hunnypaint-afa488.pdf) · [проверка](https://kegsandcorksfest.com/machika+yt+desnuda?f=instapaper) · [защищает](https://ecency.com/@filippospis5169/post-063001) · [Разберём](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/snapchat-boobs-show-96a7c4.pdf) · [Тесты](https://mariemoreau575.overblog.fr/2026/10/3d-3d.html) · [привычка](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/bokep-viral-ibu-dan-anak-baju-biru-057ef5.pdf) · [return](https://drop.xtrafrancyz.net/selif/45di96gam3.pdf) · [короткие](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/colajiang-fdc4e6.pdf) · [букву](https://blogfreely.net/igorcollins26/ms-sethi-free-porn-videos-explicit-adult-xxx-content) · [случай](https://artofhosting.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/aliceholic-59884d.pdf) · [деления](https://blog.spikyhair.club/oz4c1a14/climax-family-full-of-mistresses) · [случайной](https://writefreely.ethibox.fr/oz8c420a/wallpaper-liberty-london) · [Буква](https://rentry.co/gallery-936310) · [Решение](https://pen.absturztau.be/oz42cdf3/begum-polat-nude)

