Difference between revisions of "Задача:interactive"
(2 intermediate revisions by the same user not shown) | |||
Line 10: | Line 10: | ||
* Программа-интерактор превысила ограничение на максимальное время выполнения и была снята с выполнения из-за этого. Фиксируется вердикт [[CF]]. | * Программа-интерактор превысила ограничение на максимальное время выполнения и была снята с выполнения из-за этого. Фиксируется вердикт [[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.