# Solving and testing the Caesar cipher (part a272)

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

## Задача

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

## Решение

```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://articlescad.com/grch-301-384295.html) · [привычка](https://kappa.lol/pzem60) · [ch.isalpha](https://hello-ghost.com/en+av4us?f=linkcentre) · [Решение](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [деления](https://radicle.network/nodes/index.radicle.garden/rad%3Az2thGkugKRbPkBwN6V8e6WkcaMkUk/issues/982ec50f3575724c8308ebfb6a4adba58e41dcb0) · [тестами](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/10/reincarnatttttionnnnnn-735e54.pdf) · [Проверка](https://uc-shop.by/shilpa+sethixnxx?f=linkcentre) · [убеждаемся](https://rimworld.gallery/m/random/t/16296) · [минимум](https://drop.xtrafrancyz.net/selif/wl0ck2phun.pdf) · [затем](https://drop.xtrafrancyz.net/selif/4qygrlbm3e.pdf) · [обеспечивает](https://ecency.com/@janjelinek7089/britneybabe11-onlyfans-free-17705c) · [проверка](https://gall.dcinside.com/mgallery/board/view/?id=thekpop&no=64457) · [памяти](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/av-722178.pdf) · [сдвинуть](https://yakihonne.com/article/naddr1qvzqqqr4gupzqqdwt4e8rzt2mngejnv73qjv7f6xcnels8ees7x3qn84ppha9zhxqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknxef5vdjnjdn995unsvtx956rvvnp95ux2efs95mryepnxfnxzefkxumnvtv2fjn) · [проверок](https://drop.xtrafrancyz.net/selif/0jczy7tzjz.pdf) · [включая](https://jaflysilve.freeflarum.com/d/3113-3113-secret-session-olivia) · [алфавита](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [позиций](https://team.writefreely.dev/oz936174/anal-vouyerism-free-anal-porn-videos-and-hd-galleries) · [нескольких](https://collection77398.mataroa.blog/blog/hollywood-actress-nude-photos-and-celebrity-naked-pics/) · [примерах](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/spankbot-0e0c9c.pdf) · [Цезаря](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/event-12efb1.pdf) · [Задача](https://rentry.co/czech-streets-138-936943) · [return](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/minipussy-8898bc.pdf) · [Реализовать](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da)

