...или «как тестирующие системы борются с мельницами»
Привет, Codeforces!
Я уверен в том, что те из вас, кто пытался провести соревнование по программированию или написать свою утилиту для управления контестами знают о проблемах мешающих этому. Есть множество несовместимых форматов, никто не знает как именно должно все работать, Polygon полон невзрачных и, казалось бы, несовместимых опций, ej-polygon, похоже, никогда не работает корректно, в архивы жюри в каждом конкретном случае для корректной работы приходится вносить изменения, необычные виды задач требуют постоянной поддержки и хаков, и так далее.
Хватит препираться, я здесь чтобы попробовать решить эти проблемы!
Для начала, я представляю новый формат, который назову формат problem.xml, и который, как несложно догадаться, основан на формате Polygon. Я добавил по одному-два специальных случая там и тут, чтобы убедиться, что он на 99% совместим с архивами генерируемыми Polygon сейчас. Однако, в отличие от формата Polygon, он полностью документирован и допускает как можно меньше свободы трактования без ущерба эффективности.
Этот формат позволяет создавать практически произвольные типы задач, в дополнение к обычным типам: стандартному, интерактивному, двойному запуску и задачам с грейдерами. Например:
Задачи с пользовательскими скорерами (лучше известными как вальюеры благодаря Ejudge) поддерживаются. Это значит, что баллы за решение не обязательно равны сумме баллов за каждый тест; наоборот, любые соотношения возможны, в том числе отрицательные оценки, оценка программ по эффективности, и даже «напишите программу, которая выводит ваш юзерейм».
То, что я буду называть формульные задачи, когда решение пользователя выводит формулу или универсальный алгоритм, который потом выполняется жюри.
Опциональная компиляция на каждом тесте, которая пригодится на некоторых контестах по практической разработке.
Задачи только с выводом, то есть от пользователя просят отправить ZIP архив, который содержит ответы на каждый тест
Произвольные стратегии, что позволяет проблемсеттерам обобщать все вышенаписанное, так как им кажется нужным: задачи с тройным запуском, тестирование во время компиляции, а также подобные CTF соревнования, и все это на расстоянии нескольких строк кода.
Арбитраж, позволяющий создавать задачи-марафоны, то есть задачи в которых баллы за решение могут зависеть от результатов других решений.
Черновик спецификации доступен здесь: https://github.com/imachug/problem-xml-specs. Хотя я думаю, что спецификация практически окончена и публикую ее здесь для большей обозримость, я буду рад услышать ваши мысли по этому поводу и изменить что-то, если надо!