Прототип модуля оценки решений участников
В правилах проведения некоторых школьных (и не только) олимпиад часто встречаются задачи с нетривиальной оценкой решений, например, на открытой олимпиаде по программированию или Всероссийской олимпиаде.
На основе правил некоторых олимпиад, проводящихся в -окрестности Новосибирска предложен следующий синтаксис описания правил оценки.
- Оценка за тест — неотрицательное целое число.
- Набор тестов можно разбить на отдельные не пересекающиеся между собой группы (параметр set)
- В одной группе за каждый тест начисляется одинаковое количество баллов. В разных группах допустимы разные баллы за тест (параметр score)
- Баллы за группу начисляются при прохождении всех тестов в группе либо некоторого количества (параметр eval, 0 – некоторого количества, 1 – всех тестов)
- Можно указывать зависимости между группами тестов, влияющие на оценку решения. Задаются логическими связками AND и OR (параметр dependents)
Пример: набор тестов состоит из двух групп: group0 и group1, group1 зависит от group0. Тогда балл за group1 учитывается только при ненулевом балле за group0.
Пример.
Количество тестов = 53.
Сумма баллов = 100.
Группа 0. Тесты из условия (3 теста), оцениваются нулем баллов.
Группа 1. Тесты для n10 (10 тестов), оцениваются из 20 баллов, ненулевой балл выставляется при прохождении всех тестов группы. Зависит от группы 0.
Группа 2. Тесты для 10<n<103 (20 тестов), оцениваются из 40 баллов, ненулевой балл выставляется при прохождении всех тестов группы. Зависит от группы 0.
Группа 3. Тесты для 103<n<104(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? — содержит функции для проверки синтаксического дерева на корректность (наличие в архиве нужного количества тестов) и отсутствие рекурсивных зависимостей.