Difference between revisions of "Задача:interactive"

From EjudgeWiki
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Виды задач]]/[[Задача:interactive]]
 
Навигация: [[Main Page|Главная страница]]/[[Система ejudge]]/[[Использование]]/[[Виды задач]]/[[Задача:interactive]]
  
В интерактивных задачах программа участника не читает входной файл и пишет в выходной файл, а взаимодействует со специальной программой, называемой [[программы-интеракторы|программой-интерактором]].
+
В интерактивных задачах программа участника не читает входной файл и пишет в выходной файл, а взаимодействует со специальной программой, называемой [[программы-интеракторы|программой-интерактором]]. Программа-интерактор может реализовывать различные стратегии поведения в зависимости от поведения тестируемой программы.
 +
 
 +
Для организации взаимодействия тестирующая система создает два неименованных канала ([http://linux.die.net/man/7/pipe pipe]), один в направлении от тестируемой программы к программе-интерактору, другой в направлении от программы-интерактора к тестируемой программе. Стандартный ввод тестируемой программы перенаправлен на чтение из второго канала, а стандартный вывод тестируемой программы перенаправлен на запись в первый канал. Для программы-интерактора стандартный поток ввода и стандартный поток вывода перенаправляются в обратном направлении.
 +
 
 +
Тестирующая система запускает параллельно тестируемую программу и программу-интерактор и ждет завершения <b>обеих</b> программ.
 +
 
 +
Дальнейшее поведение тестирующей системы определяется по совокупности статусов завершения тестирующей программы и программы-интерактора. Проверки перечислены в порядке их выполнения.
 +
 
 +
* Программа-интерактор превысила ограничение на максимальное время выполнения и была снята с выполнения из-за этого. Фиксируется вердикт [[CF]].
 +
* Программа-интерактор была снята с выполнения из-за получения фатального сигнала. Фиксируется вердикт [[CF]].
 +
* Программа-интерактор завершилась с кодом завершения, отличным от 0, 1 ([[WA]]), 2 ([[PE]]), 4 ([[PE]]), 5 ([[WA]]). Фиксируется вердикт [[CF]].
 +
* Тестируемая программа была снята с выполнения из-за превышения ограничения на максимальное астрономическое время работы. Фиксируется вердикт [[WT]].
 +
* Тестируемая программа была снята с выполнения из-за превышения ограничения на процессорное время работы. Фиксируется вердикт [[TL]].
 +
* Тестируемая программа была снята с выполнения из-за превышения ограничения на размер виртуального адресного пространства или на размер стека. Фиксируется вердикт [[ML]].
 +
* Тестируемая программа была снята с выполнения из-за попытки выполнить запрещенную системную операцию. Фиксируется вердикт [[SV]].
 +
* Тестируемая программа была снята с выполнения из-за получения фатального сигнала. Фиксируется вердикт [[RT]].
 +
* Тестируемая программа завершилась с ненулевым кодом завершения. Фиксируется вердикт [[RT]].
 +
* Программа-интерактор завершилась с кодом завершения 0, 1, 2, 4, 5. Фиксируется вердикт, соответствующий коду завершения.
 +
 
 +
Если ни одно из вышеперечисленных условий не выполнилось, тестируемая программа и программа-интерактор уложились в ограничения на время и память и завершились с кодом завершения 0. В этом случае выходной файл программы-интерактора передается на дальнейшую проверку проверяющей программы.
 +
 
 +
Описанный алгоритм проверки обладает следующими свойствами:
 +
* он не зависит от порядка, в котором завершались тестируемая программа и программа-интерактор;
 +
* он максимально приближен к порядку проверок, выполняемых для стандартных (не интерактивных) задач.
 +
 
 +
Корректная реализация интерактивных задач <b>невозможна</b> без корректного поведения программы-интерактора. Корректная программа-интерактор должна завершать свою работу следующим образом:
 +
* Закрыть файловый дескриптор стандартного потока вывода (файловый дескриптор канала от программы-интерактора к тестируемой программе). После закрытия все попытки чтения со стандартного потока ввода в тестируемой программе будут возвращать признак конца файла. Закрыть файловый дескриптор можно с помощью функции 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.

Latest revision as of 13:56, 18 February 2013

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