Задачи на неполные программы
Навигация: Главная страница/Система ejudge/Использование/Задачи на неполные программы
В задачах на неполные программы требуется написать не программу целиком, которая будет запускаться при тестировании как полная программа в отдельном процессе, но отдельную структурную единицу программы, например, функцию, класс или модуль. Написанный участником фрагмент программы будет объединен с другими частями программы, написанными заранее. В результате получится полная программа, которая будет тестироваться обычным способом.
В версии 3.13.0 добавлен глобальный конфигурационный параметр
enable_run_props
, который упрощает реализацию
задач на неполные программы для скриптовых языков, таких как python3.
Кроме того, в версии 3.13.0 в скрипты компиляции добавлена поддержка сборки программы из
нескольких файлов.
Несколько вариантов поддержки задач на неполные программы рассматриваются далее.
Contents
Единственный язык, стандартные скрипты компиляции
В случае единственного разрешенного языка программирования конфигурация задачи может выглядить следующим образом.
Глобальный параметр 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
.
Дальнейшая настройка языков для случая стандартных и нестандартных скриптов компиляции описана выше.