DmitriyH's blog

By DmitriyH, history, 5 years ago, In Russian

Для облегчения тестирования решения интерактивных задач сделал С++ шаблон.

Состоит из следующих основных частей (см. код):

1) OnlineJudgeInteractor: отвечает на вопросы через stdin/stdout
2) LocalTestInteractor: в конструкторе принимает секретную информацию и отвечает на вопросы, зная её
3) Solver: принимает на вход любой IInteractor, задаёт вопросы, возвращает найденный ответ

При запуске без аргументов, ведёт себя как обычное решение (использует Solver + OnlineJudgeInteractor).
При запуске с аргументом -t читает секретную информацию из stdin и использует Solver + LocalTestInteractor.
Если задать аргумент -t interaction_log.txt, то LocalTestInteractor сохранит в заданный файл ответы, которые бы мог прочитать OnlineJudgeInteractor.

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

Разберём использование на примерах.

Создаем файл in.txt и пишем туда загадываемые массивы:

> cat in.txt
5
4 6 1 5 5

3
10 11 12


Запускаем решение в тестовом режиме, убеждаемся, что оно угадало ответы:

> solution.exe -t <in.txt
Using local interactor

Next test
! 4 6 1 5 5

Next test
! 10 11 12


Запускаем решение в тестовом режиме с дампом взаимодействия в interactor_log.txt:

> solution.exe -t interactor_log.txt <in.txt
Using local interactor
Using file 'interactor_log.txt' for interactor input log saving

Next test
! 4 6 1 5 5

Next test
! 10 11 12


Дамп получился следующий (6 строк относятся к первому тесту, 4 строки — ко второму):

> cat interactor_log.txt
5
10
7
5
6
10
3
21
23
22


Запускаем решение в обычном режиме, скармливая ему дамп:

> solution.exe < interactor_log.txt
Next test
? 1 2
? 2 3
? 3 1
? 3 4
? 4 5
! 4 6 1 5 5

Next test
? 1 2
? 2 3
? 3 1
! 10 11 12


Наблюдаем, как оно взаимодействует и что выводит.

Если собрать решение с -DONLINE_JUDGE (т.е. как при тестировании на сервере) или раскомментировать первую строку файла, то всяких "Next test" выводиться не будет и из stdin будет читаться ровно один тест:

> solution_oj.exe <interactor_log.txt
? 1 2
? 2 3
? 3 1
? 3 4
? 4 5
! 4 6 1 5 5


Замечания/пожелания приветствуются.

  • Vote: I like it
  • +16
  • Vote: I do not like it