Регламент вычитки задач
Задача передается на вычитку
после того, как
автор проделал следующие действия:
- были созданы ручные тесты (входные данные, эталонные выходные);
- примеры в условии должны идти первыми тестами, порядок примеров должен сохраняться
- были созданы вручную входные данные для рассчитываемых тестов (если они есть);
- были сгенерированы данные для генерационных тестов (если они есть);
- было запущено эталонное решение и оно прошло ручные тесты;
- после этого только генерируем эталонные решения для прочих тестов (и не портим ручные!);
- эталонное решение проходит проверку оформления кода (если оно должно полностью посылаться студентом);
- (желательно) тесты проверяются валидатором на соблюдение описанных в задаче условий (линейные размеры прямоугольников положительные, левая верхняя точка левее и выше правой нижней, если дано сколько чисел мы собираемся читать, то именно столько чисел будет идти дальше и тп.).
- для дальнейшего портирования задач на питон, четко описывайте и соблюдайте в тестах идут входные данные в одну строку или построчно.
После этого задаче назначается вычитыватель и он проверяет корректность и полноту условия и пишет свое решение, проверяя тесты.
Товарищи авторы, берегите чужое время, проверяйте задачу самостоятельно до того, как отдаете ее на вычитку.
Если ваше решение может быть выражено формулой, не ленитесь, распишите тестовые данные без использования формулы, чисто по условиям. И проверьте на полученной таблице ваши тесты.
Название файлов
- Структура задачи
- задача.xml - условие задачи
- задача_solution.c - эталонное решение задачи (расширение - по языку решения)
- задача_solution_wrong.c - (не обязательный файл) решение, которое не должно пройти ограничение на время/память и тп.
- checker.ini - файл с названием стандартного чекера или свой чекер
- tests - директория с тестами. Содержит пары файлов 001.dat, 001.ans, 002.dat, 002.ans etc. В dat-файле записано содержимое входного потока задачи, в ans-файле - ожидаемое содержимое выходного потока.
- файл
test.txt
- (не обязательно) - наборы входных и ожидаемых выходных данных, записанных в одном файле по формату (см. блок ниже), по которому скрипт make_test.py
(приложен к странице) делает файлы dat и ans. Скрипт запускать из директории tests
, на вход подавать содержимое файла test.txt
Разделителем между тестами служит линия с 3 знаками равно, разделителем между входными данными и ожидаемыми выходными данными - линия с 3 минусами:
test1 data
----------
test1 ans
==========
- Имя задачи должно состоять из темы_название
- Принятые темы задач:
- float - задачи 1 семинара на арифметику с плавающей точкой;
- int - задачи 1 семинара на целочисленную арифметику;
- func - функции
- struct - структуры. Могут содержать задачи на последующие темы (массивы, указатели и тп.)
- for - циклы (можно loop)
- arr - массивы
- bit - побитовые операции
- elong - задачи на большие числа. Очень большие числа (выделены отдельной темой, идут на массивы, на строки и на структуры).
- ram - указатели
- mem - динамическая память
- str - строки языка С
- struct - начинаем изучать структуры языка С
- qsort - задачи на сортировки
- задачи на реализацию и использование типов данных
- class - задачи на определение классов (С++)
- python - задачи, специфические для питона (словари и тп)
Задачи на "подумать" располагаются по темам в директориях if/if_ovsyannikova, for/for_ovsyannikova и тп.;
задачи на "подумать на все темы сразу" располагаются в ovsyannikova.
Так исторически сложилось.
Условие задачи
- Условие пишем в файле
тема_названиезадачи.xml
- Пример условия:
<?xml version="1.0" encoding="utf-8" ?>
<problem package = "ru.ejudge.2012_advanced_11"
id = "1" type = "standard">
<statement language="ru_RU">
<description>
<p>В строке через пробел дано неизвестное количество чисел с плавающей точкой (float), среди которых есть как положительные, так и отрицательные, а также нули. Требуется отсортировать по возрастанию положительные числа так, чтобы все отрицательные числа и нули остались на своих исходных позициях.</p>
</description>
<input_format>
<p>N чисел в одной строке через пробел. 0 < N ≤ 1000.</p>
</input_format>
<output_format>
<p>N чисел в одной строке через пробел. Печатать числа с тремя знаками после точки.</p>
</output_format>
<notes>Автор: ... (редактор, "задача классическая")
</notes>
</statement>
<examples>
<example>
<input>1 -4.54 0 8.1 5 -1 0 3.141 -5</input>
<output>1.000 -4.540 0.000 3.141 5.000 -1.000 0.000 8.100 -5.000</output>
</example>
</examples>
</problem>
Как написать свой checker
checker - это программа, которая проверяет правилен ли output работы посылаемого решения. Лучше всего сформулировать задачу так, чтобы выходные данные были однозначны. Но иногда такая формулировка содержит подсказку алгоритма решения (или не хочется делать входные данные такими, которые будут давать всегда однозначный правильный ответ). В этом случае стоит написать свой чекер.
Предположим, что задача - "Дано натуральное число N, напечатать числа от 0 до N." Порядок при этом не оговаривается.
В чекер будут переданы 3 аргумента командной строки (может больше, см. документацию ниже)
- argv[1] - путь к файлу с входными данными, например, 001.dat;
- argv[2] - путь к файлу с вЫходными данными посланного решения (что именно мы будем проверять на правильность)
- argv[3] - путь к файлу с эталонными входными данными, например, 001.ans, если выставлена в задаче переменная use_corr в файле serve.cfg (а у нас она всегда настроена в абстрактном родителе);
Напишем код на питоне, который сортирует оцениваемые выходные данные и сравнивает с эталоном. Поместим код в файл checker_sorted_int.py :
#!/bin/python3
import sys
input_data_filename = sys.argv[1] # путь к xxx.dat (входным данным)
result_data_filename = sys.argv[2] # путь к выводу тестируемого решения
output_data_filename = sys.argv[3] # путь к xxx.ans (эталонным выходным данным), если настроена переменная use_corr
res = []
out = []
try:
with open(result_data_filename, 'r') as fres:
res = sorted(list(map(int, fres.read().split())))
with open(output_data_filename, 'r') as fout:
out = sorted(list(map(int, fout.read().split())))
except:
sys.exit(4) # Presentation Error - вместо чисел что-то другое
print(res) # можно включить отладочную печать
print(out)
if res == out:
sys.exit(0) # OK
else:
sys.exit(1) # WA - wrong answer
Как привязать чекер к задаче
- если тесты вашей задачи в директории tests контеста, то чекер нужно положить в директорию checkers/checker_sorted_int.py и настроить следующие переменные в конфиге:
- в секции [problem] установить check_cmd="checker_sorted_int.py"
Если чекеру нужны какие-то дополнительные параметры, то их можно передать в переменной checker_env, например, для стандартного чекера cmp_double устанавливается параметр EPS.
checker_env = "EPS=0.0001"
Тут должен быть пример с указанием дополнительных аргументов.
Ссылки на официальную документацию
--
TatyanaDerbysheva - 13 Sep 2015