Задачи на неполные программы

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Задачи на неполные программы

В задачах на неполные программы требуется написать не программу целиком, которая будет запускаться при тестировании как полная программа в отдельном процессе, но отдельную структурную единицу программы, например, функцию, класс или модуль. Написанный участником фрагмент программы будет объединен с другими частями программы, написанными заранее. В результате получится полная программа, которая будет тестироваться обычным способом.

В версии 3.13.0 добавлен глобальный конфигурационный параметр enable_run_props, который упрощает реализацию задач на неполные программы для скриптовых языков, таких как python3. Кроме того, в версии 3.13.0 в скрипты компиляции добавлена поддержка сборки программы из нескольких файлов.

Несколько вариантов поддержки задач на неполные программы рассматриваются далее.

Единственный язык, стандартные скрипты компиляции

В случае единственного разрешенного языка программирования конфигурация задачи может выглядить следующим образом.

Глобальный параметр enable_run_props должен быть установлен.

enable_run_props

У задачи должен быть задан параметр extra_src_dir например следующим образом:

extra_src_dir = "build"

В подкаталоге build каталога задачи должны размещаться файлы, необходимые для сборки полной программы при компиляции. Все файлы и подкаталоги в каталоге build рекурсивно копируются в каталог сборки. Например, в случае сборки программы на C++ каталог build может содержать файл main.cpp, в котором находится функция main программы.

Дополнительно у задачи нужно установить три переменных окружения для компиляции:

  • EJUDGE_SOLUTION_FILE — имя файла, в котором при компиляции будет находиться сданный на проверку код.
  • EJUDGE_START_FILE — имя файла, в котором находится точка входа в программу (главная функция).
  • EJUDGE_ARCHIVE — если установлен в 1, в качестве результата компиляции будет сформирован .tar.gz архив со всеми файлами в текущем каталоге.

Имена файлов должны указываться без суффикса, правильный суффикс в зависимости от языка будет добавлен автоматически. Скрипты компиляции разных языков программирования могут использовать эти переменные окружения по-разному. Например, для языка C++ важно только чтобы была задана переменная окружения EJUDGE_SOLUTION_FILE, для python должны быть заданы все три переменные окружения, а для Java — первые две переменных окружения.

Кроме того, для многих языков поддерживается переменная окружения EJUDGE_FLAGS, которая позволяет задавать опции компиляции.

Таким образом, для настройки сборки программы на языке C++ переменные окружения в секции конфигурации задачи могут быть такими:

lang_compiler_env = "*=EJUDGE_SOLUTION_FILE=solution"
lang_compiler_env = "*=EJUDGE_FLAGS=-O2 -g -std=gnu++23 -fsanitize=undefined,address,leak -fno-sanitize-recover"

Для сборки программы на python переменные окружения могут быть такими:

lang_compiler_env = "*=EJUDGE_SOLUTION_FILE=solution"
lang_compiler_env = "*=EJUDGE_START_FILE=main"
lang_compiler_env = "*=EJUDGE_ARCHIVE=1"

Единственный язык, нестандартный скрипт компиляции

Глобальный параметр enable_run_props должен быть установлен.

enable_run_props

У задачи должен быть задан параметр extra_src_dir например следующим образом:

extra_src_dir = "build"

В подкаталоге build каталога задачи должны размещаться файлы, необходимые для сборки полной программы при компиляции. Все файлы и подкаталоги в каталоге build рекурсивно копируются в каталог сборки. Например, в случае сборки программы на C++ каталог build может содержать файл main.cpp, в котором находится функция main программы.

У задачи должна быть установлена переменная окружения компиляции EJUDGE_BUILD_SCRIPT, например, следующим образом:

lang_compiler_env = "*=EJUDGE_BUILD_SCRIPT=./build.sh"

Кроме того, в каталоге build должен размещаться исполняемый файл build.sh, который будет запущен для сборки программы. Этот файл принимает три аргумента командной строки:

  • имя файла с программой, отправленной на проверку;
  • имя файла с собранной программой;
  • имя файла с свойствами собранной программы (run properties) — необязательно.

Скрипту сборки build.sh передаются все переменные окружения, заданные для компиляции, и дополнительно две переменных окружения:

  • EJUDGE_LANGUAGE — короткое имя языка программирования;
  • EJUDGE_COMPILER — компилятор, который используется при сборке программ на данном языке программирования стандартными скриптами.

В переменной окружения EJUDGE_BUILD_SCRIPT можно указать другое имя скрипта, если это необходимо.

Единственный язык, необязательный нестандартный скрипт компиляции

Если установить переменную окружения компиляции EJUDGE_OPT_BUILD_SCRIPT, активируется гибридный режим. Если указанный в переменной окружения файл существует и может быть выполнен, для компиляции программы будет вызываться он, как для случая установки EJUDGE_BUILD_SCRIPT. Иначе будут использоваться стандартные скрипты компиляции.

Несколько поддерживаемых языков

В этом случае конфигурация задачи может выглядить следующим образом.

Глобальный параметр enable_run_props должен быть установлен.

enable_run_props

У задачи должен быть задан параметр extra_src_dir например следующим образом:

extra_src_dir = "build/${language.short_name}"

Для каждого поддерживаемого языка программирования должен существовать соответствующий каталог, в котором должны размещаться файлы, необходимые для сборки. Например, для компиляторв g++ каталог должен называться build/g++, а для языка python3 — build/python3.

Дальнейшая настройка языков для случая стандартных и нестандартных скриптов компиляции описана выше.