Прототип модуля оценки решений участников
В правилах проведения некоторых школьных (и не только) олимпиад часто встречаются задачи с нетривиальной оценкой решений, например, на открытой олимпиаде по программированию или Всероссийской олимпиаде.
На основе правил некоторых олимпиад, проводящихся в eps-окрестности Новосибирска предложен следующий синтаксис описания правил оценки.
- Оценка за тест — неотрицательное целое число.
- Набор тестов можно разбить на отдельные не пересекающиеся между собой группы (параметр set)
- В одной группе за каждый тест начисляется одинаковое количество баллов. В разных группах допустимы разные баллы за тест (параметр score)
- Баллы за группу начисляются при прохождении всех тестов в группе либо некоторого количества (параметр eval, 0 – некоторого количества, 1 – всех тестов)
- Можно указывать зависимости между группами тестов, влияющие на оценку решения. Задаются логическими связками AND и OR (параметр dependents)
Пример: набор тестов состоит из двух групп:
group0 и
group1,
group1 зависит от
group0. Тогда балл за
group1 учитывается только при ненулевом балле за
group0.
Пример.
Количество тестов = 53.
Сумма баллов = 100.
Группа 0. Тесты из условия (3 теста), оцениваются нулем баллов.
Группа 1. Тесты для n<=10 (10 тестов), оцениваются из 20 баллов, ненулевой балл выставляется при прохождении всех тестов группы. Зависит от группы 0.
Группа 2. Тесты для 10<n<10^3 (20 тестов), оцениваются из 40 баллов, ненулевой балл выставляется при прохождении всех тестов группы. Зависит от группы 0.
Группа 3. Тесты для 10^3<n<10^4 (10 тестов), оцениваются из 20 баллов, ненулевой балл выставляется при прохождении всех тестов группы. Зависит от группы 0.
Группа 4. Отдельные “плохие” случаи на переполнение/time limit/memory limit (10 тестов), оцениваются из 20 баллов, ненулевой баллов выставляется при прохождении ненулевого числа тестов группы. Зависит от групп 1,2,3.
Сюда вставить граф зависимостей
evaluation.cfg
pre = group0; //группа тестов для предпроверки
tests = 53;
group0.set = 0..3;
group0.score = 0;
group0.eval = 0;
group0.dependents = none;
group1.set = 4..13;
group1.score = 2;
group1.eval = 1;
group1.dependents = group0;
group2.set = 14..33;
group2.score = 2;
group2.eval = 1;
group2.dependents = group0;
group3.set = 34..43;
group3.score = 2;
group3.eval = 1;
group3.dependents = group0;
group4.set = 44..53;
group4.score = 2;
group4.eval = 1;
group4.dependents = group1 AND group2 AND group3;
Описание модулей
- Parser.pm — содержит функции для парсинга файла evaluation.cfg и построения синтаксического дерева.
- Analyzer.pm — содержит функции для проверки синтаксического дерева на корректность (наличие в архиве нужного количества тестов) и отсутствие рекурсивных зависимостей.
См также
В версии nsuts 1.2.8.1 используется
более простая система оценки