Difference between revisions of "Задачи на неполные программы"

From EjudgeWiki
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Задачи на неполные програм...")
 
(...)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
 
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Задачи на неполные программы]]
 
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Задачи на неполные программы]]
  
Поддерживается с версии [[Изменения в версии 3.13.0|3.13.0]].
+
В задачах на неполные программы требуется написать не программу целиком, которая будет запускаться при тестировании
 +
как полная программа в отдельном процессе, но отдельную структурную единицу программы, например,
 +
функцию, класс или модуль. Написанный участником фрагмент программы будет объединен с другими частями программы,
 +
написанными заранее. В результате получится полная программа, которая будет тестироваться обычным способом.
 +
 
 +
В версии [[Изменения в версии 3.13.0|3.13.0]] добавлен глобальный конфигурационный параметр
 +
<code>[[serve.cfg:global:enable_run_props|enable_run_props]]</code>, который упрощает реализацию
 +
задач на неполные программы для скриптовых языков, таких как [[Lang:python3|python3]].
 +
Кроме того, в версии [[Изменения в версии 3.13.0|3.13.0]] в скрипты компиляции добавлена поддержка сборки программы из
 +
нескольких файлов.
 +
 
 +
Несколько вариантов поддержки задач на неполные программы рассматриваются далее.
 +
 
 +
=== Единственный язык, стандартные скрипты компиляции ===
 +
 
 +
В случае единственного разрешенного языка программирования конфигурация задачи может выглядить следующим образом.
 +
 
 +
Глобальный параметр enable_run_props должен быть установлен.
 +
 
 +
enable_run_props
 +
 
 +
У задачи должен быть задан параметр <code>[[serve.cfg:problem:extra_src_dir|extra_src_dir]]</code> например
 +
следующим образом:
 +
 
 +
extra_src_dir = "build"
 +
 
 +
В подкаталоге <code>build</code> каталога задачи должны размещаться файлы, необходимые для сборки полной программы
 +
при компиляции. Все файлы и подкаталоги в каталоге <code>build</code> рекурсивно копируются в каталог сборки.
 +
Например, в случае сборки программы на C++ каталог <code>build</code> может содержать файл <code>main.cpp</code>,
 +
в котором находится функция <code>main</code> программы.
 +
 
 +
Дополнительно у задачи нужно установить три переменных окружения для компиляции:
 +
* <code>EJUDGE_SOLUTION_FILE</code> &mdash; имя файла, в котором при компиляции будет находиться сданный на проверку код.
 +
* <code>EJUDGE_START_FILE</code> &mdash; имя файла, в котором находится точка входа в программу (главная функция).
 +
* <code>EJUDGE_ARCHIVE</code> &mdash; если установлен в 1, в качестве результата компиляции будет сформирован .tar.gz архив со всеми файлами в текущем каталоге.
 +
 
 +
Имена файлов должны указываться без суффикса, правильный суффикс в зависимости от языка будет добавлен
 +
автоматически. Скрипты компиляции разных языков программирования могут использовать эти переменные окружения
 +
по-разному. Например, для языка C++ важно только чтобы была задана переменная окружения
 +
<code>EJUDGE_SOLUTION_FILE</code>, для python должны быть заданы все три переменные окружения, а для Java &mdash;
 +
первые две переменных окружения.
 +
 
 +
Кроме того, для многих языков поддерживается переменная окружения <code>EJUDGE_FLAGS</code>, которая позволяет
 +
задавать опции компиляции.
 +
 
 +
Таким образом, для настройки сборки программы на языке 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
 +
 
 +
У задачи должен быть задан параметр <code>[[serve.cfg:problem:extra_src_dir|extra_src_dir]]</code> например
 +
следующим образом:
 +
 
 +
extra_src_dir = "build"
 +
 
 +
В подкаталоге <code>build</code> каталога задачи должны размещаться файлы, необходимые для сборки полной программы
 +
при компиляции. Все файлы и подкаталоги в каталоге <code>build</code> рекурсивно копируются в каталог сборки.
 +
Например, в случае сборки программы на C++ каталог <code>build</code> может содержать файл <code>main.cpp</code>,
 +
в котором находится функция <code>main</code> программы.
 +
 
 +
У задачи должна быть установлена переменная окружения компиляции <code>EJUDGE_BUILD_SCRIPT</code>,
 +
например, следующим образом:
 +
 
 +
lang_compiler_env = "*=EJUDGE_BUILD_SCRIPT=./build.sh"
 +
 
 +
Кроме того, в каталоге <code>build</code> должен размещаться исполняемый файл <code>build.sh</code>,
 +
который будет запущен для сборки программы. Этот файл принимает три аргумента командной строки:
 +
* имя файла с программой, отправленной на проверку;
 +
* имя файла с собранной программой;
 +
* имя файла с свойствами собранной программы (run properties) &mdash; необязательно.
 +
 
 +
Скрипту сборки <code>build.sh</code> передаются все переменные окружения, заданные для компиляции,
 +
и дополнительно две переменных окружения:
 +
* <code>EJUDGE_LANGUAGE</code> &mdash; короткое имя языка программирования;
 +
* <code>EJUDGE_COMPILER</code> &mdash; компилятор, который используется при сборке программ на данном языке программирования стандартными скриптами.
 +
 
 +
В переменной окружения <code>EJUDGE_BUILD_SCRIPT</code> можно указать другое имя скрипта, если это необходимо.
 +
 
 +
=== Единственный язык, необязательный нестандартный скрипт компиляции ===
 +
 
 +
Если установить переменную окружения компиляции <code>EJUDGE_OPT_BUILD_SCRIPT</code>, активируется
 +
гибридный режим. Если указанный в переменной окружения файл существует и может быть выполнен,
 +
для компиляции программы будет вызываться он, как для случая установки <code>EJUDGE_BUILD_SCRIPT</code>.
 +
Иначе будут использоваться стандартные скрипты компиляции.
 +
 
 +
=== Несколько поддерживаемых языков ===
 +
 
 +
В этом случае конфигурация задачи может выглядить следующим образом.
 +
 
 +
Глобальный параметр enable_run_props должен быть установлен.
 +
 
 +
enable_run_props
 +
 
 +
У задачи должен быть задан параметр <code>[[serve.cfg:problem:extra_src_dir|extra_src_dir]]</code> например
 +
следующим образом:
 +
 
 +
extra_src_dir = "build/${language.short_name}"
 +
 
 +
Для каждого поддерживаемого языка программирования должен существовать соответствующий каталог,
 +
в котором должны размещаться файлы, необходимые для сборки. Например, для компиляторв g++ каталог
 +
должен называться <code>build/g++</code>, а для языка python3 &mdash; <code>build/python3</code>.
 +
 
 +
Дальнейшая настройка языков для случая стандартных и нестандартных скриптов компиляции описана выше.

Latest revision as of 21:03, 9 December 2024

Навигация: Главная страница/Система 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.

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