# Solving and testing the Caesar cipher (part 5ad1)

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

## Задача

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

## Решение

```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://news-ctl-posts.hashnode.dev/walking-through-the-sieve-of-eratosthenes-part-7461) · [включая](https://hey.xyz/posts/2dtmf0nm1yykxnkw6e9) · [Такой](https://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [вызова](https://rentry.co/forsaken-r34-213362) · [Zruog](https://jaflysilve.freeflarum.com/d/2761-2761-sex-fillm) · [строки](https://kappa.lol/gustvf) · [задач](https://articlescad.com/eat-my-pussy-at-work-boss-licked-under-her-desk-383669.html) · [позиций](https://blogfreely.net/catherine-vasilyev70/seabunnie) · [требуют](https://radicle.network/nodes/seed.pipapo.org/rad%3AzjhPszoShHh9PPum9iEQwoQR8CGo/issues/25bf32bb719a878e8b59b35ec2e7b902a03d809f) · [быстро](https://artofhosting.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/yu-yuhwa-onlyfans-58c4ef.pdf) · [правках](https://blogfreely.net/nathannazarov26/nicole-dobrikov-und-elisa-aline-nackte-bilder-viral-onlyfans-videos) · [привычка](https://articlescad.com/couple-caught-outdoor-sex-383260.html) · [зацикливание](https://paper.wf/annabraun76log/obuv-iz-sekond-khend-kak-obrabotat) · [проверять](https://avdc.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/awek-malay-hijab-solehot-doyan-peju-seka-052751.pdf) · [shift](https://curated50299.mataroa.blog/blog/tslunafuego/) · [ошибки](https://discuss.tchncs.de/post/65439689) · [Решение](https://team.writefreely.dev/oz711d48/valentina-midget-porn-videos) · [сдвиг](https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/noemi-monroe-cam-e96040.pdf) · [проверка](https://montage20416.mataroa.blog/blog/starsessions-youngtube-videos-with-lisa-maisie-aleksandra-isabella/) · [assert](https://paste.rs/6bJ8e) · [сразу](https://ecency.com/@marekkral2859/mila-malenkov-onlyfans-d46215) · [result.append(ch](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [Буква](https://hey.xyz/posts/1cecwyrefcqqxky1cyk) · [работы](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [меняются](https://avdc.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/event-9fe49d.pdf) · [join(result](https://blogfreely.net/catherine-vasilyev70/aihuan-lian-zhao-jin-mai) · [примерах](https://laurafournier471.overblog.fr/2026/10/57.html) · [нескольких](https://rentry.co/giantess-foot-crush-animation-108594)

