Для облегчения тестирования решения интерактивных задач сделал С++ шаблон.
Состоит из следующих основных частей (см. код):
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
Запускаем решение в тестовом режиме с дампом взаимодействия:
> 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
Замечания/пожелания приветствуются.