Задача:interactive

From EjudgeWiki

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

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

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

Тестирующая система запускает параллельно тестируемую программу и программу-интерактор и ждет завершения обеих программ.

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

  • Программа-интерактор превысила ограничение на максимальное время выполнения и была снята с выполнения из-за этого. Фиксируется вердикт CF.
  • Программа-интерактор была снята с выполнения из-за получения фатального сигнала. Фиксируется вердикт CF.
  • Программа-интерактор завершилась с кодом завершения, отличным от 0, 1 (WA), 2 (PE), 4 (PE), 5 (WA). Фиксируется вердикт CF.
  • Тестируемая программа была снята с выполнения из-за превышения ограничения на максимальное астрономическое время работы. Фиксируется вердикт WT.
  • Тестируемая программа была снята с выполнения из-за превышения ограничения на процессорное время работы. Фиксируется вердикт TL.
  • Тестируемая программа была снята с выполнения из-за превышения ограничения на размер виртуального адресного пространства или на размер стека. Фиксируется вердикт ML.
  • Тестируемая программа была снята с выполнения из-за попытки выполнить запрещенную системную операцию. Фиксируется вердикт SV.
  • Тестируемая программа была снята с выполнения из-за получения фатального сигнала. Фиксируется вердикт RT.
  • Тестируемая программа завершилась с ненулевым кодом завершения. Фиксируется вердикт RT.
  • Программа-интерактор завершилась с кодом завершения 0, 1, 2, 4, 5. Фиксируется вердикт, соответствующий коду завершения.

Если ни одно из вышеперечисленных условий не выполнилось, тестируемая программа и программа-интерактор уложились в ограничения на время и память и завершились с кодом завершения 0. В этом случае выходной файл программы-интерактора передается на дальнейшую проверку проверяющей программы.

Описанный алгоритм проверки обладает следующими свойствами:

  • он не зависит от порядка, в котором завершались тестируемая программа и программа-интерактор;
  • он максимально приближен к порядку проверок, выполняемых для стандартных (не интерактивных) задач.

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

  • Закрыть файловый дескриптор стандартного потока вывода (файловый дескриптор канала от программы-интерактора к тестируемой программе). После закрытия все попытки чтения со стандартного потока ввода в тестируемой программе будут возвращать признак конца файла. Закрыть файловый дескриптор можно с помощью функции fclose:
fclose(stdout);
  • Дождаться признака конца файла на стандартном потоке ввода. При этом все считываемые символы можно игнорировать.
int c;
while ((c = getchar()) != EOF) {}
  • Завершить работу с необходимым кодом завершения.

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

If your program receives EOF (end-of-file) condition on the standard input, it MUST exit immediately
with exit code 0. Failure to comply with this requirement may result in Time-limit exceeded error.