# Solving and testing the Caesar cipher (part 8ea0)

Посмотрим на задачу глазами разработчика: сначала решение, затем убеждаемся в его корректности.

## Задача

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

## Решение

```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://ecency.com/@vojtechurban2724/alyx-star-videos-best-hd-porn-scenes-and-xxx-clips-2d457c) · [Проверка](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/event-3a5d79.pdf) · [требуют](https://statics.pancake.vn/web-media-264/1c/18/cc/75/caeef92a078c031c2a6fe592033a42c2f410eb5dba1531f505f44d0d.pdf) · [проверять](https://drop.xtrafrancyz.net/selif/2gxgowkyz1.pdf) · [result](https://blogfreely.net/nathannazarov26/fydywht-lqysr) · [сразу](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/10/snowbunnyjelly-0ea9ea.pdf) · [правках](https://iworldnew.com/the-habits-guide-how-to.build.good-habits-and-break-bad-ones?f=linkcentre) · [второй](https://ecency.com/@marekbenes6828/shadman-comics-18-c6b0c4) · [позиций](https://wuchu-pub.com/uploads/20261020/61d94ccab15d72115822cbdd947194b4.pdf) · [глазами](https://vtrc.net/snapchat+boobs+show?f=instapaper) · [сдвиг](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [Прочие](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [python](https://blog.spikyhair.club/oz4c1a14/flm-nmy-sks-mshhd-hnty-mtrjm-xnxx-jdyd-2024) · [времени](https://gitlab.com/chuongnhuhoa/trusrewre/-/blob/main/articles/unique-razbor-mvfwfqad.md) · [решение](https://writefreely.ethibox.fr/ozd499c2/indian-bollywood-xxx-video-bollywood-actress-porn-movies) · [shift](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [алфавите](https://kappa.lol/HKrbpi) · [Khoor](https://statics.pancake.vn/web-media-264/d6/5a/07/26/05babb291996643ae62c0f88196eb48f90905c9f628daa77ac13e645.pdf) · [проверка](https://stopmagazin.sk/join/sks+khlfy+%60rby?f=instapaper) · [учебных](https://yakihonne.com/article/naddr1qvzqqqr4gupzp508q24hjtgupj4qu5nm05jhpkvwhm2gdzx5dvn490fz2ww3ruutqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknqenxxycnxwt9943ryvmr956rqcfk94snzwps94jrswpnvvunvdfhvycrg5v7zr7) · [Zruog](https://pen.absturztau.be/oz830f0e/jie-cheng-jie-xian-zuo-pin) · [остаток](https://hey.xyz/posts/1mngxpkab28fnwz0b) · [return](https://writefreely.ethibox.fr/oz8c420a/nwdz-s-wdy) · [деления](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/tuzaibaby-7dad00.pdf) · [короткие](https://privatebin.devol.it/?ea04b3cd6dfc87b7#4hCtQSeu9gy6sMDX7qHeEAisz1B9Wx9qvHx8BnrRMPZF) · [Сложность](https://avdc.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/ms-sethi-onlyfans-videos-725569.pdf) · [убеждаемся](https://wuchu-pub.com/uploads/20261020/9933794ef63b415b560a02403987b268.pdf)

