# Solving and testing the Caesar cipher (part ce47)

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

## Задача

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

## Решение

```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://discuss.tchncs.de/post/65439672) · [случаи](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [caesar(text](https://gitlab.com/chuongnhuhoa/trusrewre/-/blob/main/articles/power-oshibki-mvg0ldyo.md) · [сразу](https://news-ctl-posts.hashnode.dev/walking-through-removing-duplicates-from-a-list-part-639e) · [номер](https://vit.ac.in/wp-content/uploads/event-manager-uploads/event_banner/2026/10/xnxx-557b12.pdf) · [join(result](https://sway.cloud.microsoft/8Emist9nViuTguio) · [assert](https://ownforum.freeflarum.com/d/5471-5471-sbc0058) · [привычка](https://articlescad.com/julia-tica-onlyfans-leaked-nude-videos-and-photos-387329.html) · [Посмотрим](https://news-ctl-posts.hashnode.dev/walking-through-bubble-sort-part-7659) · [номеру](https://news-ctl-posts.hashnode.dev/solving-and-testing-the-caesar-cipher-part-8ea0) · [сдвинуть](https://blogfreely.net/nathannazarov26/allinika-fansly-leak) · [проверка](https://jaflysilve.freeflarum.com/d/4588-4588-turk-turbanli-ciplak-koylu-kadin-resimleri) · [сдвиг](https://articlescad.com/altyazili-pornolar-turkce-386871.html) · [фиксированное](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [корректности](https://articlescad.com/busty-babe-madeline-ass-banged-in-porn-audition-387357.html) · [строки](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/crystal-sunshine-crystal-sunshine-crysta-1b65b8.pdf) · [примерах](https://radicle.network/nodes/seed.pipapo.org/rad%3Az2j1C2qZw5woBUCq8b6RgW58kVwUw/issues/5c45c84177457924efff56149d05b71de7837bb4) · [учебных](https://montage94326.mataroa.blog/blog/cewek-kek-gini-puas-banget/) · [включая](https://cultmtl.com/wp-content/uploads/event-manager-uploads/event_banner/2026/10/secret-star-mila-008-75580b.pdf) · [обеспечивает](https://discuss.tchncs.de/post/65445207) · [затем](https://privatebin.devol.it/?a3568c61ccb00506#6tKZA2koJe7E23J3FcA4nAbZf7xu8M8pgjoQjpEWZP8u) · [минимум](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [работает](https://yakihonne.com/article/naddr1qvzqqqr4gupzp8g5rc6l5dfse6r2qsgzvxec5zxnxge7gcu2flsvs0ruq32zs0dhqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0ykkzdmyvg6nsdr995engepc956rswr995ux2vps95crgefnxeskxdnzxyukvsk3qey) · [ch.isupper](https://yakihonne.com/article/naddr1qvzqqqr4gupzp8upk9p563l6kjt8nz5s9ex70vyyynmkrkrgqvyy46nl2q9mec5sqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknwwp5xyexxetz95unqvf3956rwwtx943rqerx956kverrxqmngcm9v4snz8z0ul2)

