Установка интерактивных задач NEERC
В этом году на NEERC начали cтавить интерактивные задачи с тестированием на Java. Эти задачи удалось поставить на DL; здесь задокументирован процесс установки.
Jan 2014. Автоматически обнаруживаются и устанавливаются задачи данного типа при загрузке DL Master'ом.
Содержание
Описание системы
Слой совместимости для DL
Процесс установки
TODO
Описание системы
В папке с задачей есть следующие файлы:
- problem.xml (файл конфигурации)
- Interact.jar (программа-собеседник) + исходники
- coact.exe (программа-тестер)
- Check.jar (программа-чекер) + исходники
В problem.xml (файл конфигурации) есть тег <interactor type="%simple">. В нём указан файл программы-собеседника (Interact.jar) и способ запуска (Java7).
Interact.jar - программа-собеседник (читает <taskname>.in, даёт вывод для решения, получает ввод для него же и выводит информацию о процессе тестирования в <taskname>.out).
coact.exe запускается со следующими параметрами:
coact.exe <timelimit(seconds)> <memlimit(bytes)> <interactor> <solution>
Например:
coact.exe 2s 268435456 interact.exe sol.exe
При этом он умеет обрабатывать кавычки в параметрах:
coact.exe 2s 268435456 "java -jar Interact.jar" sol.exe
Check.jar - реализация класса чекера для библиотеки testlib4j.jar. Он запускается следующей командой:
java -cp "<путь>testlib4j.jar;Check.jar" ru.ifmo.testlib.CheckerFramework Check <infile> <chkfile> <outfile>
Он читает <taskname>.out, генерирует комментарий и завершает работу; результат он возвращает кодом выполнения:
- 0: OK
- 1: Wrong Answer
- 2: Presentation Error
Слой совместимости для DL
Задача ставится как интерактивная, с чекером, все файлы забираются с собой:
CHECKER = 1
CHECKSUBJECT = FILE
CHECKFILES = {*.*}
TYPE = INTERACTIVE
Для запуска coact.exe был написан скрипт coact.bat с одним параметром (скомпилированный файл решения). В StdSwp был добавлен код, передающий управление этому скрипту при его наличии; также добавлен код, обнаруживающий файл solution.bat и передающий его первую непустую строку как команду запуска решения (файл генерируется при компиляции Java-решений). Поскольку ограничение по времени проверяет coact.exe, оно же для StdSwp повышено:
На данный момент TIME_LIMIT вычисляется как ограничение задачи + 3 секунды.
Для обработки чекера был написан вспомогательный чекер InteractChecker.jar (исходники), запускаемый с помощью скрипта checker.bat (из-за особенностей Delta пришлось дописать checker.exe, просто вызывающий этот скрипт).
Процесс установки
- Убираем все посторонние файлы из корня задачи, в первую очередь авторские решения и скомпилированные из них экзешники.
- Для переноса в подпапку old/ можно запускать команду вроде
move *.exe *.cpp *.pas *.py *.java old/
- В корне нужно оставить (или вернуть после переноса) следующие файлы:
- Устанавливаем слой совместимости с DL
- Копируем файлы из release.rar в папку с задачей
- Добавляем в начало task.cfg следующие строки:
CHECKER = 1
CHECKSUBJECT = FILE
CHECKFILES = {*.*}
TYPE = INTERACTIVE
- Меняем TIME_LIMIT в task.cfg; ставим ограничения в coact.bat
- Тестируем
- Пробуем отсылать авторские решения на Pascal/C++/Java
- При наличии непонятных проблем проверить папку установленной задачи на наличие посторонних файлов (в частности, *.exe)
TODO
- Интерфейс:
- Изменить отображаемое ограничение по времени (значение в task.cfg больше фактического)
- Тестирование:
- прикрутить тестирование решений на Java (прежде всего авторских):
- добавил в скрипты компиляции Java генерацию solution.bat, в stdswp – передачу его содержимого как команды запуска решения
- разнести изменения файлов compile_java?.cmd и stdswp.exe по машинам (нету на Nit5)
- установить Java 7 на сервер тестирования (нету на Nit и Nit3)
- или можно портировать Interact и Check под Java 6:
- копируем файлы из prepare.rar в папку с задачей
- запускаем prepare.bat
- при наличии ошибок компиляции правим код в указанных местах и снова запускаем prepare.bat
- удаляем содержимое prepare.rar из папки с задачей