Исправляем бардак в тестирующих системах

Revision ru9, by purplesyringa, 2022-07-24 18:13:10

...или «как тестирующие системы борются с мельницами».

Привет, Codeforces!

Я уверен, что те из вас, кто пытался провести соревнования по программированию или написать свои утилиты для работы с контестами, знакомы с положением дел. Есть множество несовместимых форматов, никто не знает, как именно все должно работать, Polygon полон не описанных и на первый взгляд несовместимых опций, ej-polygon как будто никогда не работает полностью корректно, в архивы жюри приходится вносить изменения под каждую платформу, нестандартные виды задач требуют постоянной поддержки и хаков, и так далее.

Я столкнулся со всеми этими недочетами, когда пошел писать свою тестирующую систему и внезапно обнаружил, что самая нетривиальная часть — не тестирование сложных нестандартных задач, а обработка искусственной сложности, введенной устаревшим софтом и стандартами. Так что вот он я, решаю эти проблемы.


Я представляю новый формат, официально формат problem.xml, который, как несложно догадаться, основан на формате Polygon. Я добавил по одному-два специальных случая там и тут, чтобы добиться 99%-ой совместимости с архивами, генерируемыми Polygon сейчас. Однако, в отличие от формата Polygon, он полностью документирован и допускает как можно меньше свободы трактования без ущерба эффективности.

Этот формат допускает практически произвольные типы задач, в дополнение к обычным типам: стандартному вводу-выводу, интерактивному и двойному запуску и задачам с грейдерами. Например, поддерживаются:

  • Задачи с пользовательскими скорерами (пользователям Ejudge известные как программы оценки). Это значит, что баллы за решение не обязательно равны сумме баллов за каждый тест; возможны любые соотношения, в том числе отрицательные оценки, оценка программ по эффективности, вплоть до даже «напишите программу, которая выводит ваш юзерейм».

  • То, что я называю формульными задачами, когда решение пользователя выводит формулу или универсальный алгоритм, который потом исполняется программой жюри.

  • Опциональная компиляция на каждом тесте, которая пригодится на некоторых контестах по практической разработке.

  • Задачи только с выводом, когда от пользователя просят отправить ZIP архив, который содержит ответы на каждый тест.

  • (Опциональная поддержка) произвольные стратегии, что позволяет проблемсеттерам обобщать все вышеперечисленное так, как им кажется нужным: задачи с тройным запуском, тестирование во время компиляции, и даже CTF-подобные соревнования, с помощью всего нескольких строк кода.

  • Арбитраж, позволяющий создавать задачи марафонского типа (про ранние идеи на эту тему можно прочесть тут), то есть задачи, в которых баллы за решение могут зависеть от результатов других решений.

Cуществующим платформам, поддерживающим формат Полигона или что-то на него похожее, в целом потребуется немного модификаций для поддержки всего, кроме стратегий и арбитража: я надеюсь, что основные вендоры с этим справятся. Полноценную поддержку стратегий реализовать может быть несколько затруднительно, так что эта часть пока опциональна (впрочем, это не умаляет значимости всего остального). Технически, реализовать арбитраж должно быть просто, но для этого могут потребоваться некоторые изменения в архитектуре софта.

Черновик спецификации доступен здесь: https://github.com/imachug/problem-xml-specs. Хотя я думаю, что спецификация практически окончена и публикую ее здесь для большей обозримости, я буду рад услышать ваши мысли по этому поводу и изменить что-то в случае необходимости.


Тегаю некоторых людей для лучшей видимости — ваш вклад будет очень полезен: geranazavr555, MikeMirzayanov, grphil, andrewzta, dkirienko.

Tags polygon, ejudge, pcms2, codeforces

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
ru9 Russian purplesyringa 2022-07-24 18:13:10 8
en9 English purplesyringa 2022-07-24 18:12:55 3 Tiny change: 'visibility--your input' -> 'visibility—your input'
en8 English purplesyringa 2022-07-24 18:11:10 0 (published)
ru8 Russian purplesyringa 2022-07-24 18:10:53 0 (опубликовано)
en7 English purplesyringa 2022-07-24 18:08:42 4 Tiny change: 'ssary!\n\n\n\n---\n\' -> 'ssary!\n\n---\n\'
ru7 Russian purplesyringa 2022-07-24 18:04:59 7 Мелкая правка: ' программы). Это зна' -> ' программы оценки). Это зна'
ru6 Russian purplesyringa 2022-07-24 18:04:17 275
en6 English purplesyringa 2022-07-24 18:02:23 253
ru5 Russian purplesyringa 2022-07-24 17:59:30 525
ru4 Russian purplesyringa 2022-07-24 17:52:21 921
ru3 Russian Death_on_2_Legs 2022-07-24 17:42:50 2 Мелкая правка: 'ьницами»\nПривет, ' -> 'ьницами»\n\nПривет, '
ru2 Russian Death_on_2_Legs 2022-07-24 17:42:00 2889
en5 English purplesyringa 2022-07-24 17:24:10 34 Tiny change: 'visibility: [user:ge' -> 'visibility--your input is highly appreciated: [user:ge'
ru1 Russian Death_on_2_Legs 2022-07-24 17:23:54 3084 Первая редакция перевода на Русский (сохранено в черновиках)
en4 English purplesyringa 2022-07-24 17:21:03 502
en3 English purplesyringa 2022-07-24 17:14:37 212
en2 English purplesyringa 2022-07-24 16:55:02 9 Tiny change: 'ems fight issues no sane' -> 'ems fight obstacles no sane'
en1 English purplesyringa 2022-07-24 16:43:35 2736 Initial revision (saved to drafts)