# Solving and testing the Caesar cipher (part 9e29)

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

## Задача

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

## Решение

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

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

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

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

[правках](https://discuss.tchncs.de/post/65440871) · [становится](https://gitlab.com/chuongnhuhoa/trusrewre/-/blob/main/articles/binary-search-tests-mvguk89s.md) · [Хорошая](https://vit.ac.in/wp-content/uploads/event-manager-uploads/event_banner/2026/10/av4-us-039ad0.pdf) · [Такой](https://news-ctl-posts.hashnode.dev/a-step-by-step-look-at-anagram-checking-part-8b0c) · [assert](https://jaflysilve.freeflarum.com/d/4634-4634-jameliz-benitez-smith-leaked-onlyfans-nude-photos-and-videos) · [позиций](https://mariefournier156.overblog.fr/2026/10/marty-mcfly-quotes-from-back-to-the-future-trilogy.html) · [result.append(ch](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [тестами](https://statics.pancake.vn/web-media-264/74/3d/ea/79/a0172ea8aa12f8190a8320c2c3cbbaea616fee93b1bd56942e05a6d9.pdf) · [python](https://radicle.network/nodes/seed.cielago.xyz/rad%3Az47QGwrKKqtM3TfkQgEN8FRrL4PDP/issues/8165d1d90561939abb420f26ce5dc8a40ca51c42) · [результат](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/thor-hd-photos-a672fb.pdf) · [меняются](https://noobtheloser.com/%E6%91%A9%E6%89%98%E6%91%87%E8%A3%B8%E8%88%9E?f=linkcentre) · [Прочие](https://poruno.tube/g%C3%B6zde+akg%C3%BCn+pornosu?f=linkcentre) · [вызова](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [базовая](https://kappa.lol/VVVntV) · [алфавита](https://1a.pics/ai%EC%95%BC%EB%8F%99?f=linkcentre) · [обеспечивает](https://exhibit61642.mataroa.blog/blog/6b6-97-166/) · [крайние](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [return](https://paste.rs/GxmdU) · [алфавите](https://kmoreau92.wixsite.com/my-site-1/post/wnru621526-%E6%B8%A9%E6%9F%94%E6%8E%A8%E7%89%B9%E4%B9%B3%E7%A5%9E%E5%B7%A8%E4%B9%B3%E5%8D%9A%E4%B8%BB%E4%BB%98%E8%B4%B9%E8%A7%86%E9%A2%91%E5%90%88%E9%9B%86) · [Khoor](https://yakihonne.com/article/naddr1qvzqqqr4gupzq096nacf7d83dm4mdjpf7pvskmxhgca0jc5velvpkgjg6mwun295qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknzdf4xv6x2vec94skzve5956xzcmy943xyvpn95enqdmyv5cnjvp3v56xzv46d0k) · [Zruog](https://kappa.lol/EmNgjX) · [случаи](https://sway.cloud.microsoft/MEoXL7FH59kBZKwL) · [букву](https://blog.spikyhair.club/oz4c1a14/climax-family-full-of-mistresses) · [деления](https://news-ctl-posts.hashnode.dev/common-mistakes-in-word-frequency-counting-part-b2e3) · [ch.isupper](https://statics.pancake.vn/web-media-264/72/ca/eb/b3/f852c42a7c1494bf22c35ccc18394e0d3d15ce69bf02dcc7bdcbd2de.pdf) · [ошибки](https://hey.xyz/posts/373xs1sm7wqa8tnn6w1) · [сразу](https://ecency.com/@jirikral2369/spip-sarka-spip-collectif-sarka-spip-gpl-texte-de-votre-mess-2a9fc7) · [Цезаря](https://yakihonne.com/article/naddr1qvzqqqr4gupzq3n02z2f40gy6736f3a0j9zzn056uckylajfl2zp26qmz56yf0ulqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0ykkgefnv5mnydec95urvdes956xgdp494skgvee943rxctyvvenqwfcvdnryplyk5c)

