# Занятие 7. Массив: индексы, проходы, границы

Три задачи на один проход по списку. Во всех трёх нужно назвать инвариант
прохода — утверждение, которое остаётся верным после каждого шага цикла, —
и проверить решение на граничных входах.

Обязательная часть — задачи 1 и 3. Задача 2 и полный PR — расширение.

Общие ограничения:

- Python 3.12, только встроенные типы; импорт модулей в `solution.py` не нужен;
- сортировка входа запрещена во всех задачах;
- сигнатуры функций в `solution.py` не меняются, по ним работают тесты;
- до кода в `initial_attempt.txt` записываются уточняющие вопросы к условию
  и три своих примера «вход → ожидаемый ответ» на задачу.

## Задача 1. Максимальная серия

Фитнес-трекер хранит число шагов по дням: `steps[0]` — первый день, `steps[-1]` — последний.
Цель дня — `goal` шагов, по умолчанию 10 000. Нужно вернуть длину самой длинной
серии дней подряд, в каждый из которых цель достигнута.

| Вход | Ответ |
|---|---|
| `[12000, 3000, 11000, 10500, 10000]` | `3` |
| `[9999]` | `0` |
| `[]` | `0` |

- Цель считается достигнутой, если шагов **не меньше** `goal`.
- Время O(n), дополнительная память O(1). Входной список не изменяется.

## Задача 2. Разворот участка

В плейлисте нужно развернуть порядок треков с позиции `l` по позицию `r` **включительно**.
Остальные треки остаются на своих местах. Функция меняет переданный список и ничего не возвращает.

| До | `l, r` | После |
|---|---|---|
| `A B C D E F` | `1, 4` | `A E D C B F` |
| `A B C` | `1, 1` | `A B C` |

- Если не выполнено `0 <= l <= r < len(tracks)`, функция поднимает `ValueError`
  и не трогает список.
- Время O(r − l), дополнительная память O(1). Срезы, `reversed()` и `list.reverse()` не используются.

## Задача 3. Удаление на месте

Модерация получает список комментариев и удаляет спам — комментарии со ссылкой
(`is_spam` уже написана). Нужно удалить спам **из того же списка**, сохранить
порядок остальных комментариев и вернуть их число.

| До | Ответ | Список после |
|---|---|---|
| `["Отличный урок", "http://win.ru", "http://prize.ru", "Спасибо"]` | `2` | `["Отличный урок", "Спасибо"]` |
| `["http://a.ru"]` | `0` | `[]` |

- Новый список не создаётся: генераторы списков, `filter`, `copy()` не используются.
- `remove()` и `del comments[i]` внутри цикла не используются: каждое такое удаление
  сдвигает хвост списка, и решение становится O(n²).
- Один `del comments[k:]` после цикла разрешён: он обрезает хвост за одну операцию.
- Время O(n), дополнительная память O(1).

## Что сдаётся

Папка `portfolio/lesson_07/` личного репозитория:

- `solution.py` — решения;
- `tests.py` — публичные тесты и ваши тесты в блоке «Мои тесты»;
- `complexity_note.md` — заметка по шаблону;
- `initial_attempt.txt` — вопросы и примеры до кода, первая версия решения;
- `ai_usage_note.md` — только если пользовались ИИ: запрос, ответ, что проверили и что изменили.
