Портативный пульт и экран зала, который распределяет участников по командам. Задаёте размер команды и список людей — программа раскладывает их по командам и показывает результат на зале.
В репозитории нет личных данных: ни названий команд, ни счетов, ни фонов, ни
сохранённых турниров. Приложение стартует с пустого состояния, а всё, что вы
вводите, живёт только в вашем браузере (localStorage) и в памяти локального
сервера. В репозиторий эти данные не попадают.
- Список участников и размер команды; кнопка «Распределить» — раскладка.
- «Всегда вместе» / «Связать» — связки участников, которые обязаны попасть в одну команду (например, капитан и его «ядро»). Связки учитываются при раскладке.
- Корректная работа с остатком: если людей не хватает на полные команды, остаток либо образует отдельную неполную команду, либо (когда он не больше половины) раскидывается по уже собранным — баланс команд сохраняется.
- «Распределить остаток», «Сбросить ряды», «+ 10» — быстрый добор участников.
- «Команды — правка»: «Добавить команду», «Сбросить команды» — ручная доводка распределения.
- Экран зала показывает раскладку без интерфейса оператора.
Алгоритм раскладки покрыт тестом:
python scripts/smoke.pyТест проверяет правила распределения остатка и упаковку участников вместе со связками (union-find).
Зал открывается отдельным окном браузера на другом мониторе в режиме приложения
(--app) со своим профилем. Esc закрывает окно зала.
Портативно (без установки Python). Скопировать папку целиком, включая
runtime\python\, и запустить IntelfestSortingHat.bat. Откроется пульт оператора; консольное
окно нужно держать открытым — его закрытие останавливает сервер.
Из исходников. Нужен Python 3.10+ (проверено на 3.12):
python serve.pyПорт по умолчанию — 3885, переопределяется переменной окружения PORT.
Браузер: Edge или Chrome (для зала используется режим приложения --app).
Система: Windows 10/11 64-bit.
Приложение работает на embeddable CPython 3.12, который лежит в runtime\python\.
Раньше папка копировалась вместе с проектом — в репозитории её нет: это 22 МБ
бинарников, которые бессмысленно держать в git.
Восстановить runtime одной командой из корня проекта:
powershell -ExecutionPolicy Bypass -File scripts\get-runtime.ps1Скрипт скачивает официальный python-3.12.10-embed-amd64.zip с python.org и
распаковывает его в runtime\python. Ничего не ставится в систему, права
администратора не нужны. Если runtime\python\python.exe уже есть — скрипт
ничего не делает.
Никаких внешних зависимостей: serve.py использует только стандартную
библиотеку Python.
IntelfestSortingHat/
IntelfestSortingHat.bat запуск (портативно)
serve.py локальный HTTP-сервер, только stdlib
index.html пульт оператора
display.html экран зала
css/app.css оформление
js/sort.js алгоритм раскладки (зеркало scripts/smoke.py)
js/operator.js логика пульта
js/display.js отрисовка зала
js/bus.js шина между окнами
scripts/smoke.py тест правил раскладки и связок
logo.svg, app.ico
scripts/get-runtime.ps1 восстановление runtime\python
Локальный сервер слушает 127.0.0.1:3885 и отдаёт состояние залу через
обычные JSON-эндпоинты (интеграции и автоматизация):
| Метод | Путь | Назначение |
|---|---|---|
GET |
/api/state |
текущее состояние |
POST |
/api/state |
записать состояние |
GET |
/api/status |
статус сервера, мониторы, браузер |
GET |
/api/open-display |
открыть экран зала |
GET |
/api/cycle-display |
переключить монитор зала |
GET |
/api/reload-display |
перезагрузить окно зала |
MIT — см. LICENSE.