TaskConv: конвертор групповых тестов
Version 1.0
Применение
Применение. Программа TaskConv (Task Convertor) запускается из командной строки и принимает следующие параметры:
- -h (--help) - программа выводит краткую справку по параметрам ввода и завершает работу (также выполняется при неправильно заданных параметрах);
- -v (--verbose) - программа выводит в консоль информацию о выполняемых действиях (используется для контроля работы программы в случае ошибки);
- -q (--quiet) - по эффекту противоположно -v (если используются обе опции, эффективна лишь последняя из введённых), отменяет вывод в консоль (по умолчанию выводятся название обрабатываемой папки и сообщение в случае ошибки);
- -m (--move) - файлы перемещаются без сохранения оригиналов (по умолчанию они копируются);
- -t (--type) TaskType - уточняет имя типа формата задачи (при определении типа программа игнорирует те, которые не начинаются с TaskType; подробнее о типах см. Конфигурация);
- -o (--output) OutFile - изменяет имя выходного файла программы (по умолчанию marks.tmp);
- -n (--name) TaskName - фиксирует значение TaskName (см. Конфигурация);
- -d (--directory) TaskDir - задаёт путь к папку с конвертируемой задачей (обязательный параметр).
Параметры могут быть использованы как в короткой, так и в длинной форме, причём их названия можно сокращать вплоть до одной буквы.
Поведение. TaskConv работает следующим образом:
- обрабатывается список параметров (если один параметр с аргументом задан дважды, происходит аварийное завершение программы);
- считывается конфигурация из файла .cfg и директории DB, которые должны находиться в рабочей папке;
- программа пытается определить тип задачи по количеству подходящих к шаблону входных и выходных файлов (чем больше входных файлов, тем лучше; их число должно совпадать с числом выходных);
- в случае успешного определения типа формата задачи входные и выходные файлы переименуются, попутно составляется список тестов по группам;
- список тестов выводится в выходной файл программы (см. -o) в формате, подходящем для занесения в task.cfg (стоимость каждого теста считается за 1 балл).
Настройка
Конфигурация. Типы формата задачи описаны в файлах, помещённых в папку DB. В первой строке описан шаблон пути входного файла, во второй - соответствующего выходного. Шаблон представляет собой путь к файлу из папки задачи, в котором части пути, различающиеся для разных тестов, обозначены метками-<переменными>.
Каждая переменная заключается в фигурные скобки, предваряемые знаком <$> (${переменная}). Исключением могут быть переменные, обозначающие номер теста в группе (если в группе из одного теста этот номер не указывается, переменная заключается в квадратные скобки - $[переменная]).
Распознаются следующие переменные:
- TaskName - имя задачи;
- S - номер группы тестов;
- SS - номер теста в группе;
- SL - буква теста в группе (нумерация латиницей).
TaskName определять сложнее всего и, в случае неправильно составленного шаблона, оно может быть определено неправильно. Во избежание подобных ситуаций добавлена возможность жёсткого фиксирования его значения (см. -n); также, программа считает, что в TaskName могут входить только
символы, указанные в первой строке файла .cfg (именно для этого он и предназначен) - по умолчанию это все буквы латиницы.
Дополнительно
Примеры. Пример файла шаблона для задачи с олимпиады IOI:
${TaskName}-test/subtask${S}/grader.in.${SS}
${TaskName}-test/subtask${S}/grader.expect.${SS}
То есть, если задача называется race, то её тесты размещены в подпапке race-test; если у задачи 4 группы тестов, то внутри race-test лежат папки subtask1, subtask2, subtask3 и subtask4; если в первой группе 3 теста, то в папке race-test/subtask1 лежат файлы grader.in.1, grader.in.2, grader.in.3, grader.expect.1, grader.expect.2 и grader.expect.3; эти файлы будут скопированы (перемещены) в корень папки задачи с именами 1.in, 2.in, 3.in, 1.out, 2.out и 3.out соответственно, а в строки с 1 по 3 выходного файла программа выведет числа -1, -1 и 1 соответственно.
Пример файла шаблона для задачи с олимпиады CEOI:
${TaskName}${S}$[SL].in
${TaskName}${S}$[SL].out
То есть, если задача называется bal, имеет 5 групп тестов с номерами 0-4, в группах с номерами 0-2 один тест, а в остальных по два, то файлы тестов будут находиться в корне папки задачи и иметь названия bal0.in, bal0.out, bal1.in, bal1.out, bal2.in, bal2.out, bal3a.in, bal3a.out, bal3b.in, bal3b.out, bal4a.in, bal4a.out, bal4b.in и bal4b.out; эти файлы будут переименованы в 1.in, 1.out, 2.in, 2.out, 3.in, 3.out, 4.in, 4.out, 5.in, 5.out, 6.in, 6.out, 7.in и 7.out соответственно, а в выходной файл программа выведет числа 1, 1, 1, -1, 1, -1 и 1 соответственно.
Исходный код программы содержится здесь.