# Solving and testing the Caesar cipher (part ada8)

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

## Задача

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

## Решение

```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://dev.to/valentina_silvaferreira_/rieshaiem-i-tiestiruiem-shifr-tsiezaria-59g) · [прибавляется](https://dariakrause.wixsite.com/my-site-1/post/velthuna---telugu-sex-stories--college-fantasy-photo-gallery) · [минимум](https://exhibit51767.mataroa.blog/blog/que-es-la-produccion-de-contenidos-digitales/) · [работы](https://paste2.org/ULO2xDzN) · [Реализовать](https://vit.ac.in/wp-content/uploads/event-manager-uploads/event_banner/2026/10/av-e80eef.pdf) · [число](https://kappa.lol/HLMko0) · [ломается](https://artofhosting.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/phantom-wallet-beta-a9c942.pdf) · [проверки](https://writefreely.ethibox.fr/oz82c64c/rhaenyra-targaryen-rule-34) · [алфавита](https://dev.to/valentina_silvaferreira_/rassmatrivaiem-klassichieskuiu-zadachu-provierka-anaghramm-geg) · [меняются](https://raindrop.io/undefined/collection-75601786) · [result.append(ch](https://dev.to/valentina_silvaferreira_/nieskolko-rieshienii-rieshieniia-prostoi-zadachi-chisla-fibonachchi-48da) · [World](https://rentry.co/gallery-915005) · [каждую](https://avdc.org/wp-content/uploads/event-manager-uploads/event_banner/2026/10/camila-pati-o-desnuda-95cef4.pdf) · [случаи](https://jaflysilve.freeflarum.com/d/3096-3096-starsessions-maise-exclusive-erotic-photos-and-videos) · [Такой](https://discuss.tchncs.de/post/65439832) · [результат](https://ecency.com/@jannovotny8793/justluula-nude-4b85c3) · [Zruog](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/10/cheyenne-swenson-nude-07f47c.pdf) · [join(result](https://www.imagefap.com/pictures/14229865/toddlercon-3d-65) · [случайной](https://paste2.org/aPp87dNY) · [сразу](https://loc.edu/wp-content/uploads/event-manager-uploads/event_banner/2026/10/event-904dc2.pdf)

