Привет, Codeforces!
Сегодня мной было выпущено важное обновление Polygon – частичная поддержка расширенных свойств ресурсов. Основная задача, которая решается этим обновлением – это поддержка разработки задач с грейдерами.
В большинстве соревнований участникам необходимо предоставить полный код решения, включая чтение и вывод данных. Например, в раундах Codeforces вы решаете именно такие задач. Однако в ряде соревнований принят другой подход, где участнику просто необходимо реализовать нужную функцию или интерфейс.
Например, в условии задачи может быть написано, что в решении на С++ надо реализовать функцию, которая имеет вот такой прототип int sum(int a, int b)
и отослать реализацию. В таком случае, участнику достаточно отправить исходный код, который содержит реализацию этой функции. Затем при тестировании решения по такой задаче система должна скомпилировать и слинковать в единый исполняемый файл присланный участником файл и специальный подготовленный жюри файл, который будет содержать весь остальной необходимый код (в частности, там будет функция main
).
В случае задачи A+B такой файл, который и называется грейдером, может выглядеть так (grader.cpp):
#include <iostream>
int sum(int a, int b);
int main() {
int a, b;
std::cin >> a >> b;
std::cout << sum(a, b) << std::endl;
}
Решение такой задачи может выглядеть так:
int sum(int a, int b) {
return a + b;
}
Таким образом, обычно, грейдер не может быть самостоятельно собран в исполняемый файл, ему нужно еще и решение задачи.
Теперь в Полигоне реализована базовая поддержка таких задач (спасибо PavelKunyavskiy и cannor147 за помощь!), я начал с поддержки только C++.
Для того, чтобы добавить файлы грейдера, вы должны загрузить их как ресурсы, указав дополнительные расширенные свойства: что ресурсы применимы к языкам группы cpp.*, что это ресурсы времени компиляции и что с ними надо компилировать именно решения.
После добавления таких ресурсов, при компиляции решений они будут находиться в одной папке с решением, а те ресурсы, что являются C++-файлами, будут переданы в командную строку компилятору.
Обратите внимание, что вся дополнительная информация для ресурсов доступна в дескрипторе задачи problem.xml, а также реализована поддержка нововведения в API (смотрите документацию по методам problem.files и problem.saveFile).
Позже будет добавлена поддержка некоторых других языков, возможность подобным образом прицеплять ресурсы не только к решениям, но и к валидаторам/интеракторам/чекерам. Конечно, следует ожидать поддержку таких задач на Codeforces. Отмечу, что подобные задачи могут найти своё применение не только в олимпиадном движении, но и просто в образовательном процессе. Например, я легко могу представить учебную задачу на Java, в которой требуется реализовать заданный интерфейс, а вся рутина (unit-тесты и прочие вещи) спрятаны в коде ресурсов.
P.S. Поддержка грейдеров появилась не просто так — сегодня начинаются сборы школьников по подготовке к международной олимпиаде школьников. Полагаю, что возможность подготавливать задачи с грейдерами в Полигоне поможет научному комитету сборов. А всем участникам я желаю удачных туров!