# Solving and testing the Caesar cipher (part 0397)

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

## Задача

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

## Решение

```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://paper.wf/annaklein89log/archivohot-ipcam-european-couple-and-italian-milf-intimate-home-videos) · [затем](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [caesar(text](https://yakihonne.com/article/naddr1qvzqqqr4gupzq89gdv2a4re5ta2la6vft9gmp89jzhuqmefz42gr5n04cl4n0u2sqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0ykn2er9xc6k2cen94sk2vrr956rvde395uxywfj956rwen9x4nr2efhxsex2gmhtu8) · [сдвиг](https://ecency.com/@martinnemec5998/where-to-find-hot-gay-furry-porn-comics-f0b5d9) · [Цезаря](https://www.sfahba.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/iimsaarah-leaked-d473f4.pdf) · [глазами](https://markweber99.wixsite.com/my-site-1/post/onion-porn-links) · [работает](https://statics.pancake.vn/web-media-264/99/f7/0c/24/957bf663fb8467ed9bac613b0ab97382e5ea821d8b3e285b64e08727.pdf) · [памяти](https://belissimo.org/cornaiano?f=linkcentre) · [result](https://circlek.ae/luckin-coffee-loyalty-program?f=linkcentre) · [решение](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [Реализовать](https://marieroux757.overblog.fr/2026/10/american-cake-xxx-leaked-onlyfans-photos-and-video.html) · [алфавите](https://radicle.network/nodes/seed.pipapo.org/rad%3Az34pMriTkXPQqyhcnrfJKANGX5reL/issues/f442109dffb71b5cc014cf85b8759325d660b2c2) · [прибавляется](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/wendy-gravity-falls-porn-comics-379bce.pdf) · [меняются](https://gitlab.com/chuongnhuhoa/trusrewre/-/blob/main/articles/is-prime-dva-sposoba-mvfqxxjj.md) · [минимум](https://blogfreely.net/nataliarussell2/boys-on-vacation-gay-videos-free-hd-gay-porn) · [python](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [разработчика](https://discuss.tchncs.de/post/65439961) · [остаток](https://pen.absturztau.be/oz830f0e/modern-day-sins-sexy-nicole-doshi-gets-fucked-hard-by-angry-roommate) · [ch.isalpha](https://blog.spikyhair.club/oz4c1a14/sanadong-man) · [нескольких](https://paper.wf/sofia2001log/madxfrance) · [работы](https://ecency.com/@karelnovotn6538/naturistin-holiday-saint-germain-co-nz-4cdb3e) · [Проверка](https://paper.wf/nina1988log/maxin-afc-leaked-onlyfans) · [базовая](https://www.imagefap.com/pictures/14229816/sarvente-r34-fnf-porn-gallery-friday-night-funkin-rule-34)

