Приспособление для интерактивных задач (С++)

Правка ru1, от DmitriyH, 2019-02-15 15:04:37

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

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

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


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

Теги интерактивные задачи, шаблон, с++

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru2 Русский DmitriyH 2019-02-15 15:07:03 41
ru1 Русский DmitriyH 2019-02-15 15:04:37 2571 Первая редакция (опубликовано)