Как сделать, чтоб участник отправлял один из файлов, и он компилировался вместе с другими файлами проекта?

Обсуждение вопросов, связанных с системой проведения турниров ejudge.
Post Reply
IlyaCk
Posts:21
Joined:04 January 2013, 19:02
Как сделать, чтоб участник отправлял один из файлов, и он компилировался вместе с другими файлами проекта?

Post by IlyaCk » 01 February 2019, 22:37

Сразу скажу -- о source_header и source_footer знаю, но не_хотел бы делать именно так.

Это не для олимпиады, а для других учебных целей, там (по крайней мере, в этом году) только C#.
Хотелось бы добиться такого поведения: есть проект из нескольких файлов (хотя проект -- громко сказано, компилируется просто путём задания нескольких .cs-файлов в одном вызове gmsc). Из всех этих .cs-файлов один сдаётся студентом (участником), остальные подставляются стандартные для этой задачи (но, тем не менее, я хочу их держать секретными от студентов, а также гарантированно избегать ситуации, когда они меняют те другие файлы), и всё это собирается, а дальше запускается и проверяется более-менее обычным способом.

Насколько понял, чисто настройками опций компилятора задать такую компиляцию нельзя (уточню, что Main должен быть в том файле, который подставляется стандартный и секретный от студента, и тот Main вызывает в т.ч. и код, написанный студентом, так что помодульная компиляция вроде ж не поможет). Пытался добавить как бы язык программирования и указать это всё в соответствующем файле из /home/judges/compile/scripts , но и что-то не получается, и вообще -- может есть способ получше? Если в такой ситуации создание как бы языка программирования и есть нормальным подходом, но можно ли как-то вменяемо дебажить содержимое того файла из /home/judges/compile/scripts ? А то пишу, например, "${problem_dir}/Program.cs", и понятия не имею, как проверить, что именно туда подставляется, и подставляется ли вообще.

Повторю: о source_header и source_footer знаю, но не_хотел бы делать именно так (запутывать неокрепшие умы слабых студентов не элементарной штукой, которая вовсе не соответствует тем практикам, которые приняты в промышленном программировании). Хочу, чтоб отправлять надо было именно файл, каким его можно взять без танцев с бубнами из проекта Visual Studio в файловой системе Windows.

dk
Posts:129
Joined:25 March 2006, 19:37
Location:Москва, школа 179
Contact:

Re: Как сделать, чтоб участник отправлял один из файлов, и он компилировался вместе с другими файлами проекта?

Post by dk » 15 February 2019, 08:30

Может быть всё-таки source_footer и source_header использовать?

Не знаю, какие у вас там задания, но у меня есть задания типа "Разработать класс". И на проверку нужно сдать самодостаточное объявление и реализацию класса. Вот пример задания: https://server.179.ru/tasks/cpp/2019b3/25-complex.html

Разумеется, это не совсем то, что делается в промышленном программировании, но всё-таки вполне осмысленная вещь, класс - самодостаточная сущность и сдавать на проверку только то, что относится к классу - осмысленно.

Для упрощения маниупляций с файлами со стороны участника (например, если нужно из файла выкинуть какие-то части, которые будут мешать проверке) можно включить параметр enable text form в настройках задачи, чтобы участник мог скопировать из редактора нужный фрагмент кода и вставить его в форму ввода ответа, не сохраняя в промежуточном файле.

В общем, если технически это можно сделать при помощи source_footer и source_header, я бы делал так.

По-другому, кажется, только новый язык создать в конфигах.

IlyaCk
Posts:21
Joined:04 January 2013, 19:02

Re: Как сделать, чтоб участник отправлял один из файлов, и он компилировался вместе с другими файлами проекта?

Post by IlyaCk » 19 February 2019, 11:24

Спасибо за ответ, но пока что предпочитаю делать умный вид, будто всё по частям потому, что в промышленном программировании так принято, и что эти части являются обычными файлами из проекта.

В принципе, как-то через-пень-колоду, оно ужЕ работает (ejudge.ckipo.edu.ua, соревнования 82 и 83). Но пока что сумел только привязать "язык программирования" к тому, что в конкретном judges/compile/scripts/mcs-unit-2 прописан прямо конкретный путь к конкретному файлу, в виде

Code: Select all

rm StudSort.cs
cp "$1" StudSort.cs
exec "${MCSRUN}" ${EJUDGE_FLAGS} -define:VALUE_IS_DOUBLE /home/judges/000083/Program.cs /home/judges/000083/Generators.cs StudSort.cs -out:"$2"
Хотелось бы возможность указывать файл (пусть хотя бы один, пусть хотя бы он по жизни называется Program.cs) из каталога текущей задачи (или хотя бы текущего соревнования), чтоб при одном "языке программирования" такие файлы могли быть в разных задачах (или хотя бы соревнованиях) разными, а то все попытки привязаться к "${problem_dir}/Program.cs" и прочим подобным подстановкам оказались безуспешными. Где почитать насчёт того, какие вообще есть подстановки? (Но так, чтоб стало понятно, какие из подстановок где работают, а где и не должны...)

Post Reply