Рабочий стол > DL Руководство пользователя > Установка интерактивных задач для запуска tester'ом > Просмотр
Установка интерактивных задач для запуска tester'ом Войти | Зарегистрироваться   Просмотр версии для печати текущей страницы.

Добавлен Гуленко Алексей, отредактирован Гуленко Алексей Jul 28, 2026
Метки: 
(нет)

Вы просматриваете старую версию (v. 1) этой страницы.
Последняя версия - v. 2 , последнее редактирование Aug 29, 2026 (просмотр отличий | )
просмотр истории страницы | просмотр следующей версии >>

Альтернативная установка задач с интерактивным вводом-выводом

Данная инструкция описывает усложнённый процесс установки

Здесь описан минимальный процесс конверсии задачи, установленной под StdSwp, для запуска tester'ом.
Это следует делать в случае если требуется использовать групповое тестирование, или для обхода проблем запуска глобально установленного StdSwp на новых DelTA'х.

Tester (программа, изначально предназначенная для тестирования задач IOI) с некоторых пор поддерживает тестирование задач с интерактивным вводом-выводом, запускаемых через StdSwp.
По умолчанию под Windows используется путь D:\DelTA\stdswp (под Linux/Mac - локальный файл ./stdswp); однако в конфигурации можно указать путь к альтернативному исполнимому файлу.
Также (в отличие от DelTA) у tester'а нет проблем с использованием группового тестирования для интерактивных задач.

Более подробная инструкция по использованию tester'а находится тут;
с общей инструкцией по установке задач с интерактивным вводом-выводом (StdSwp) можно ознакомиться здесь.

Конверсия интерактивной задачи под Tester

  • файл чекера (checker.exe) следует переименовать в check.exe (из-за особенностей реализации tester'а)
  • программа взаимодействующая с решением всё так же зовётся player'ом
  • файл stdswp.cfg работает так же как описано в инструкции по StdSwp
  • также нужны файлы конфигурации и исходники для tester'а (помимо src/CheckLib.pp и src/TesterLib.pp) нижеследующего содержания
src/checker.pas (выполняет запуск отдельного теста)
Uses
  CheckLib;

BEGIN
  Run(ProgName, OutFile);
  Prepend(OutFile, 'OK');
END.
src/tester.pas (выполняет процесс тестирования)
Uses
  TesterLib;

BEGIN
  Body();
  POut();
END.
task.cfg (передаёт контроль над тестированием задач Tester'у)
TYPE = USERS
CHECKSUBJECT = FILE
CHECKFILES = {*.*}
CHECKER = 'tester.exe $SOLUTION$'
tester.cfg (управляет поведением Tester'а)
PreRun      = prepare.bat    # скрипт компиляции решения!
Program     = yes            # решение - не библиотека а программа
Interactive = yes            # тестировать с интерактивным вводом-выводом
InFile      = input.txt      # название input-файла
OutFile     = output.txt     # название output-файла
ExtChecker  = check          # название оригинального чекера (без расширения)
<
# сюда внести описание групп тестов, по одной на строку
# (для раздельного тестирования достаточно указать число баллов за соответствующий тест)
>
prepare.bat (отвечает за компиляцию файла решения на Pascal, C/C++, Java или Python3)
@echo off
for %%f in ("%~n1") do (
  if /i %%~xf==.java goto rename
)
set sol=%1
set solext=%~x1
set runnerfile=solution.bat
set runner=%~n1.exe
if not exist 2.in cmd /C unrar -o- x tests
if /i %solext%==.pas   goto pascal
if /i %solext%==.ppw24 goto pascal
if /i %solext%==.c     goto c
if /i %solext%==.cpp   goto cpp
if /i %solext%==.g54   goto cpp
if /i %solext%==.g73   goto cpp
if /i %solext%==.java  goto java
if /i %solext%==.py    goto py3

echo not found
@exit /B 1

:pascal
  echo %runner%> %runnerfile%
  cmd /C D:\DelTA\Lngs\compile_ppw302 %sol% .
  @exit /B %errorlevel%

:c
  echo %runner%> %runnerfile%
  cmd /C D:\DelTA\Lngs\compile_c73 %sol% .
  @exit /B %errorlevel%

:cpp
  echo %runner%> %runnerfile%
  cmd /C D:\DelTA\Lngs\compile_g73_old %sol% .
  @exit /B %errorlevel%

:java
  echo %runner%> %runnerfile%
  cmd /C D:\DelTA\Lngs\compile_java8 %sol% .
  @exit /B %errorlevel%

:py3
  echo %runner%> %runnerfile%
  cmd /C D:\DelTA\Lngs\compile_py %sol% .
  @exit /B %errorlevel%

:rename
  copy %1 %~n1
  prepare %~n1
limiter.bat (обёртка вокруг системного Limiter'а)
@echo off
if "%~4" == "" goto 5
if "%~5" == "" goto 4
D:\DelTA\DelTA3DL\limiter %1 %2 "%3 < %4 > %5" %6 > lim.log 2> lim.err
goto :eof
:4
D:\DelTA\DelTA3DL\limiter %1 %2 "%3 < %4" %6 > lim.log 2> lim.err
goto :eof
:5
@if "%~5" == "" goto 0
D:\DelTA\DelTA3DL\limiter %1 %2 "%3 > %5" %6 > lim.log 2> lim.err
goto :eof
:0
D:\DelTA\DelTA3DL\limiter %1 %2 "%~3" %6 > lim.log 2> lim.err

Альтернативный StdSwp

При наличии проблем с версией StdSwp используемой по умолчанию, можно использовать какую-нибудь альтернативную версию (лично я предлагаю использовать скрипт на Python).
Пример такой конфигурации:

tester.cfg (добавить перед описанием тестов)
StdSwp      = stdswp-py.cmd
stdswp-py.cmd (обёртка для запуска Python)
D:\DelTA\Lngs\Python-3.11.3\python stdswp.py %*
stdswp.py (простая реализация, игнорирует stdswp.cfg и подразумевает KillSolution=yes)
#!/usr/bin/env python
from concurrent.futures import wait, ThreadPoolExecutor, FIRST_COMPLETED
from subprocess import Popen, PIPE
from sys import argv

def interact (player, solution, kill_player=False, kill_solution=True):
    player   = Popen(player,   stdin=PIPE,          stdout=PIPE)
    solution = Popen(solution, stdin=player.stdout, stdout=player.stdin)
    try:
        executor = ThreadPoolExecutor(max_workers=2)
        futures = [executor.submit(x.wait) for x in (player, solution)]
        wait(futures, return_when=FIRST_COMPLETED)
        if kill_player and solution.returncode is not None:
            player.terminate()
            assert {solution.returncode} <= {0, None}
        elif kill_solution and player.returncode is not None:
            solution.terminate()
            assert {player.returncode} <= {0, None}
        else:
            assert {player.returncode, solution.returncode} <= {0, None}
            wait(futures)
            assert {player.returncode, solution.returncode} <= {0, None}
    finally:
        player.kill()
        solution.kill()

if __name__ == '__main__':
    interact(argv[1], argv[2])
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: http://www.atlassian.com/software/confluence Build:#2.6.1 916) - Ошибка/новая особенность - Свяжитесь с Администраторами