# Банк вопросов к условию задачи

Список для тех, кто разбирает задачу впервые. Вопросы задают не все подряд:
из каждой группы выбирают те, что подходят к условию. Рядом с вопросом
написано, что меняется от ответа.

Порядок: сначала вход и ответ, потом особые случаи, потом ограничения.
Если времени мало, первым задают вопрос, без ответа на который нельзя
написать ни строчки кода.

## Вход

| Вопрос | Что меняется от ответа |
|---|---|
| Какие данные приходят: список, строка, словарь? | Алгоритм и способ обхода |
| Бывает ли вход пустым? | Отдельная ветка в коде и отдельный тест |
| Бывает ли вход из одного элемента? | Проверяет циклы, сравнивающие соседей |
| Какие значения допустимы: только положительные, ноль, отрицательные? | Начальное значение переменных и набор тестов |
| Могут ли значения повторяться? | Убирать ли дубликаты; что считать ответом при повторе |
| Данные уже отсортированы? | Двоичный поиск и два указателя вместо перебора |
| Все элементы одного типа? | Сравнение числа со строкой даёт TypeError |

## Ответ

| Вопрос | Что меняется от ответа |
|---|---|
| Что возвращать: значение, индекс, True/False, новый список? | Сигнатура и структура данных внутри |
| Если подходящих ответов несколько, какой нужен? | Первое вхождение, последнее или любое — три разные задачи |
| Что вернуть, если ответа нет? | None, исключение или особое значение; без этого тест не написать |
| В каком порядке идут элементы ответа? | Нужна ли сортировка результата |
| Нужны ли повторы в ответе? | Множество или список с дубликатами |
| Функция возвращает результат или печатает его? | Кто отвечает за вывод |
| Нужен ли сам ответ или достаточно узнать, что он есть? | «Есть ли пара» дешевле, чем «какая именно пара» |

## Особые случаи

| Вопрос | Что меняется от ответа |
|---|---|
| Считается ли ноль положительным? | Знак сравнения: > 0 или >= 0 |
| Одинаковые значения — одно значение или разные? | Для [5, 5, 3] второй максимум равен 5 или 3 |
| Можно ли использовать один элемент дважды? | С какого индекса начинается внутренний цикл |
| Что считать совпадением: точное равенство или без учёта регистра и пробелов? | Нужна ли нормализация до сравнения |
| Могут ли внутри быть пустые строки, пропуски, None? | Отдельная ветка или отсев до основного прохода |
| Есть ли значения, которые нужно пропускать? | Условие внутри цикла и тесты на такие элементы |
| Что делать с некорректными данными? | Запрещены контрактом или функция сообщает об ошибке |

## Ограничения

| Вопрос | Что меняется от ответа |
|---|---|
| Насколько большим бывает вход? | Допустим ли перебор пар за O(n²) |
| В каком диапазоне значения? | Узкий диапазон разрешает счётчик вместо сортировки |
| Сколько раз вызовут функцию? | Окупается ли подготовка: множество, словарь, сортировка |
| Есть ли ограничение по памяти? | Копия входа или работа на месте |
| Данные помещаются в память целиком или приходят потоком? | Весь список или две переменные |
| В каком типе хранится результат у принимающей стороны? | Переполнение int32 при верном алгоритме |
| Есть ли ограничение по времени ответа? | Имеет смысл только вместе с размером входа |

## Данные

| Вопрос | Что меняется от ответа |
|---|---|
| Можно ли менять исходные данные? | Сортировка на месте или копия и O(n) памяти |
| Нужен ли исходный порядок после вызова? | Разрешена ли перестановка элементов |
| Данные можно считать корректными или их нужно проверять? | Появляются проверки входа и тесты на них |
| Кто ещё работает с этим списком одновременно? | Безопасно ли менять его на месте |
| Данные приходят один раз или обновляются? | Разовый проход или поддерживаемая структура |

## Как проверить, что вопрос полезен

Полезен вопрос, ответ на который меняет код, контракт или набор тестов.
Если при любом ответе решение останется прежним, вопрос можно не задавать.

Примеры бесполезных вопросов: как назвать функцию; писать цикл или включение;
какая версия Python; сколько строк кода допустимо. Ни один из них не меняет
ни алгоритм, ни проверки.
