Привет, Codeforces!
Пару месяцев назад я написал небольшую утилиту, которой бы хотел поделиться. Как отмечено в заголовке, она предназначена для быстрого прогона решений на наборе тестов. Возможно (и я в этом даже уверен), что аналоги, умеющие ровно то же или даже больше, уже существуют, но в первую очередь я ставил перед собой цель написать что-нибудь легковесное, кроссплатформенное и, по возможности, легко куда-нибудь интегрируемое.
Некое подобие предыстории:
В один прекрасный день, разбирая накопившийся на жестком диске хлам, я наткнулся на архив одного достаточно старого контеста, который, как оказалось, я проглядел и так и не имел шанса написать. Задачи из этого контеста показались мне довольно интересными, поэтому возникла идея найти этот его в разделе тренировок на Codeforces. К сожалению, он там не обнаружился.
Так как желание написать контест почему-то было неожиданно сильным, а перспектива писать задачи без возможности оперативно их проверить меня не привлекала, было решено написать маленькую утилиту, которая помогла бы мне прогнать задачи по системным тестам из архива. Через несколько часов была готова рабочая версия утилиты.
В другой прекрасный день, через пару недель спустя, появилась другая идея: расширить утилиту до полноценной (но в то же время небольшой) тестирующей системы, которую бы было можно легко поднять в локальной сети для написания контестов с друзьями. В качестве proof of concept даже было написано простенькое веб-приложение, но, к сожалению, до большего руки так и не дошли. Зато скрипт оказался вполне себе полезной штукой в повседневной, так сказать, жизни.
Замечания:
Исходный код пока еще находится в состоянии work in progress, но сама утилита вполне себе работоспособна. Скрипт кушает преимущественно чекеры на основе testlib, но, думаю, любой чекер со сходными параметрами запуска и возвращающий один из стандартных кодов, также подойдет.
Для запуска утилиты следует воспользоваться Python 3 (более подробно об этом, а также о необходимых зависимостях, сказано в readme).
Работоспособность была проверена на OS X и Linux, так что прошу сообщать об ошибках, если таковые возникнут. Прошу также обратить внимание на файл compilers.json
с описанием компиляторов и интерпретаторов: вполне возможно, что команды, приведенные в нем, не будут работать «из коробки» на других платформах.
UPD: Демо работы утилиты.
Скриншоты? )
Не вижу смысла делать скриншоты консольной утилиты, поэтому добавил полноценную демку с демонстрацией работы :)
why not break the judge.py in several other files? one file with 400+ lines may become un-maintainable.
As I have already mentioned in the post, the script was created with the intention of being lightweight (and easily integrable into other scripts and projects) so you don't have to carry around a whole bunch of files (consider testlib.h, which was designed with the same purpose in mind and is considerably longer).
In its current state (448 lines), it's still smaller than the invokers used in full-featured testing systems. I'd surely have considered breaking it into small parts if writing such a system was my primary goal from the beginning, but that wasn't the case.