Билеты рядом: почему свободных мест недостаточно

Покупатель просит три места рядом. На схеме свободны четыре кресла, но подходящей тройки нет: два находятся в одном ряду, ещё два — через проход. Общий счётчик показывает достаточный остаток, однако не отвечает на вопрос покупателя. Для выбора группы нужна структура зала и правило соседства, а не только число непроданных билетов.
Ниже разобрана учебная модель для разработки собственного сервиса. Это не схема конкретной площадки и не инструкция по нормативному устройству зрительного зала. Расположение, доступность и допустимость продажи реальных мест подтверждает владелец площадки. Пример помогает проверить логику поиска: какие кресла можно предложить одной группе и что именно обещает интерфейс.
У слова «рядом» должно быть точное значение
В первой версии модели договоримся: группа сидит в одном ряду на непосредственно соседних креслах, без прохода между ними. Это выбранное условие задачи, а не единственный возможный вариант обслуживания. Два кресла по разные стороны узкого прохода в таком поиске не подходят. Если площадка предлагает их как отдельный компромисс, интерфейс должен объяснить отличие и получить предусмотренное подтверждение.
Определите также, что означает свободное место. Проданное, временно удержанное, закрытое для выбора и доступное кресло могут выглядеть похожими в общей статистике, но давать разные результаты поиска. В учебном подборе участвуют только места, разрешённые для выбранного сеанса и не занятые чужим действующим резервом. Изменение статуса кресла должно менять доступность соответствующего варианта группы.
Не считайте соседством простую близость изображений на экране. При уменьшении схемы кресла из разных рядов могут оказаться рядом визуально. Для человека полезен рисунок, для расчёта нужна явная модель связей. Именно её нужно проверять после переноса схемы или изменения расположения, а не только ровность нарисованных кружков.
Пример: четыре свободных кресла и ни одной тройки
В вымышленном ряду есть позиции А1, А2, А3, затем проход, затем А4, А5 и А6. Свободны А1, А2, А4 и А5. А3 и А6 недоступны. Получаются две отдельные цепочки длиной по два кресла. Всего свободно четыре, максимальная подходящая группа по нашему правилу — два человека.
Если сделать А3 доступным, появится цепочка А1–А2–А3. Для трёх человек она подходит. При этом А3 и А4 по-прежнему разделены проходом: появление свободного кресла не уничтожает границу. Наивный алгоритм, который сортирует номера и ищет три последовательных значения, может ошибочно предложить А2–А3–А4. Такая ошибка заложена в данных о соседстве, а не в подсчёте остатка.
| Состояние учебного ряда | Свободных всего | Самая длинная непрерывная группа | Подходит для троих |
|---|---|---|---|
| А1, А2, А4, А5 свободны | 4 | 2 | Нет |
| Дополнительно свободно А3 | 5 | 3 | Да: А1–А2–А3 |
| Свободны только А2, А3, А4 | 3 | 2 | Нет: между А3 и А4 проход |
| Свободны только А4, А5, А6 | 3 | 3 | Да: А4–А5–А6 |
Проверка должна возвращать не только ответ «да», но и конкретный набор идентификаторов. Тогда менеджер и тестировщик видят, какие кресла предложены. Формулировка «доступно три билета рядом» без состава затрудняет проверку и не позволяет понять, не было ли между ними прохода или закрытой позиции.
Номер на билете не заменяет идентификатор места
В базе полезно разделить устойчивый идентификатор кресла и отображаемую подпись. Два сектора могут иметь собственный первый ряд и место с номером 1. Если программа хранит только пару коротких чисел без сектора, записи способны столкнуться. Сеанс также входит в контекст доступности: продажа кресла на вечернее мероприятие не должна занимать его на другом показе автоматически.
Порядок кресел не всегда следует арифметике подписей. В согласованной схеме могут использоваться собственные способы нумерации. Поэтому проверка «номер следующего равен текущему плюс один» годится только после подтверждения именно такой модели. Надёжнее хранить упорядоченные группы кресел или допустимые связи соседства, соответствующие реальной схеме площадки.
На этапе проектирования попросите несколько небольших примеров от ответственного за зал: обычный ряд, ряд с проходом, укороченный ряд и участок с временно закрытым местом. Не нужно начинать со сложного редактора схем. Сначала докажите, что данные позволяют однозначно описать эти случаи и что поиск использует описанные границы.
Найденная группа ещё не закреплена за покупателем
Пока пользователь рассматривает вариант, другой человек может выбрать одно из тех же кресел. Поэтому результат поиска относится к состоянию на момент проверки. Если сервис обещает удержание группы, нужно отдельное подтверждение резерва всех выбранных мест. Нельзя закрепить два кресла из трёх и продолжить показывать покупателю исходное предложение как полностью доступное.
Для учебного сценария резерв группы действует целиком: либо подтверждены все три места, либо интерфейс сообщает, что состав больше недоступен, и предлагает повторный подбор. Это выбранное поведение нужно проверить при одновременных действиях. Проверка одного места за другим без защиты целостности группы может создать частичное состояние, которого пользователь не заказывал.
Отдельно опишите отмену и истечение удержания. Освобождение должно относиться к конкретному резерву, а не к любому креслу с совпадающим номером. Повторное сообщение об отмене старого удержания не должно освобождать уже подтверждённое новое. Если используется внешняя билетная система, её правила и идентификаторы согласуют до обещания такого сценария на собственном сайте.

Не выбирайте за посетителя незаявленный компромисс
Если тройки рядом нет, система может предложить два места и одно отдельно. Это другой вариант размещения. Его нельзя молча подставлять в корзину под прежней надписью. Покажите состав, расстояние по принятой схеме и понятное отличие от первоначального запроса. Отказ от предложения не должен превращать его в согласованный заказ.
Аналогично не объединяйте разные ценовые зоны без предусмотренного правила. В этой статье цены не рассчитываются, но граница зоны способна влиять на допустимость предложения. В техническом задании укажите, можно ли подбирать группу из мест с разными условиями и как это объясняется. Решение принадлежит процессу площадки, а не удобству сортировки в программе.
Если выбор требует специальных условий размещения, оставьте предусмотренный путь уточнения и проверяйте сведения с ответственным сотрудником. Учебный поиск соседних кресел не оценивает физическую доступность, обзор, безопасность или пригодность места для конкретного человека. Такие признаки нельзя выводить из одного номера ряда или расстояния между кружками на схеме.
Если подходящих групп несколько
Наличие допустимого варианта и выбор лучшего варианта разделите на два этапа. Например, для двух человек могут подходить А1–А2 и А4–А5. Сначала проверяется соответствие правилу соседства, затем применяется отдельно согласованный порядок предложений. Можно дать посетителю выбор на схеме; можно предложить первый вариант по определённому правилу. Называть его лучшим без описанного критерия не нужно.
В тестовом задании зафиксируйте порядок при равенстве условий. Иначе после обновления программы одинаковый запрос будет прыгать между секторами без понятной причины. Это затруднит повторение проверки и объяснение предложений менеджеру. При этом стабильный порядок не должен маскировать изменение доступности: уже недоступную группу требуется исключить, даже если раньше она стояла первой.
В кратком ответе полезно показывать причину выбора: нужное число кресел, один ряд, отсутствие прохода внутри группы и соответствие выбранной зоне. Это проверяемые свойства. Обещание удобного обзора или идеального расположения из них само по себе не следует. Для дополнительных характеристик нужны отдельные подтверждённые сведения площадки и самостоятельные фильтры.
Как принять реализацию по небольшому набору тестов
Начните с четырёх строк таблицы выше. Попросите разработчика показать найденные идентификаторы, максимальную длину группы и причину отсутствия подходящей тройки. Затем перенесите проход, оставив подписи кресел прежними. Результат должен зависеть от изменённой структуры, а не от привычного ряда чисел. Это помогает обнаружить скрытое предположение в алгоритме.
Следующий тест — одновременный выбор одной группы двумя контролируемыми пользователями. Успешное удержание не должно появиться у обоих. После истечения одного тестового резерва убедитесь, что доступность восстановилась по предусмотренному правилу и что позднее повторное событие не изменяет чужое новое состояние. Используйте только тестовые сеансы, не занимая реальные места ради проверки.
Наконец, сравните рисунок с данными: выбранные кресла, сектор, ряд и подписи должны совпадать в подборе, подтверждении и карточке заказа. Проверьте схему на телефоне: понятны ли границы прохода, можно ли увидеть весь состав и исправить выбор. Уменьшенная картинка, на которой невозможно различить соседние места, не решает задачу даже при правильном серверном расчёте.
Для записи без закреплённых кресел подходит другая модель — лимит мест и лист ожидания. Когда важен совместный просмотр, требуется конкретная группа на схеме. Первая версия сервиса готова к обсуждению после того, как команда может объяснить каждый предложенный набор, подтвердить его целиком и честно показать отсутствие подходящего варианта.
Если нужна реализация
Состав работ зависит от текущего проекта и подтверждённой причины. Можно обсудить диагностику или разработку подходящего решения.
Вопросы и ответы
Четыре свободных места гарантируют три билета рядом?
Нет. В учебном ряду свободные кресла разделены на две пары, поэтому самой длинной подходящей группой остаются два места.
Можно искать соседей по последовательным номерам?
Только если принятая схема действительно задаёт такое соседство. Проходы, сектора и способ нумерации необходимо учитывать явно.
Найденные места уже удерживаются за покупателем?
Не обязательно. Поиск и подтверждённый резерв являются разными состояниями. Если предусмотрено удержание группы, проверяйте его для всех кресел вместе.
Можно автоматически предложить два кресла и одно отдельно?
Это другой вариант размещения. Покажите отличие и состав, а согласование проводите по предусмотренному сценарию, не выдавая его за три соседних места.