Идея: ручные answer-файлы

Последняя правка 3791 день назад
Материал из Daysper manual
Перейти к навигации Перейти к поиску

Ручные answer-файлы[править | править код]

Идея[править | править код]

Сейчас принята концепция, что все answer-файлы генерируются с помощью решения жюри, и поэтому процесс генерации тестов состоит из двух частей: сначала (каким-либо способом) создаются все input-файлы, а потом полностью автоматически по ним генерируются все answer-файлы: каждый answer-файл — это результат работы на этом тесте решения жюри.

Daysper поддерживает такую систему, но, кроме того, он поддерживает возможность того, чтобы часть (а может быть, все, а может быть, и ни одного) answer-файлов создавалась без участия решения жюри. Например, если в задаче есть "ручные" тесты, то вполне естественно на них и answer-файлы подготовить вручную; кроме того, некоторые тесты, генерируемые специальной программой-генератором, могут иметь простую структуру, и тогда эта программа-генератор может (зная структуру теста) сразу создавать и answer-файл. В таком случае daysper будет использовать полученные answer-файлы и не будет перегенерировать их с использованием решения жюри.

Зачем это нужно[править | править код]

Я (П.К., *KAP*) вижу три причины, почему ручные answer-файлы могут быть полезны. Во-первых, они отчасти страхуют автора задачи от использования неправильного решения жюри.

Во-вторых, пусть вы разрабатываете задачу с нуля. Вы написали решение; теперь вам надо, во-первых, его тщательно протестировать, во-вторых, сделать тесты по задаче. Логично совместить оба действия: тестируя свое решение, вы будете подсовывать ему разные подлые тесты — так почему же их не сохранить в качестве тестов для задачи? И наоборот, если уж вы придумываете разные тесты для задачи, то почему бы на них и не протестировать ваше решение? Кроме того, daysper уже представляет довольно удобную систему для тестирования задачи. Почему бы не воспользоваться ею для тестирования вашего решения? Если вы найдете ошибку в своем решении и исправите ее, вы захотите перетестировать решение на всех тестах, которые тестировали раньше и, ясно, удобно это делать не вручную, а с помощью команды типа daysper check. Но для всего этого надо (не всегда, но довольно часто), чтобы answer-файлы у вас были независимы от вашего решения, т.е. как раз и нужны ручные answer-файлы.

Или то же самое, но с другой стороны. Вы тестируете свое решение: вы один за другим создаете тесты, запускаете на них решение и проверяете правильность ответа. В большинстве случаем вы будете знать правильный ответ на этот тест до запуска программы (иначе тестирование на этом тесте теряет половину смысла). Почему бы тогда не сохранить этот ответ в отдельный файл и не использовать его в дальнейшем как ручной answer-файл?

В-третьих, иногда вы хотите использовать задачу, к которой у вас есть тесты и answer-файлы к ним, но нет решения. Если вы конвертируете такую задачу под daysper, логично эти answer-файлы считать "ручными". После этого вы сможете при желании написать свое решение и сразу средствами daysper его проверить.

В общем, мне представляется логичной следующее использование answer-файлов:

  • Если вы используете старую задачу, в которой все answer-файлы генерируются решением, и у вас есть это решение, то "ручные" answer-файлы не нужны.
  • Если вы используете старую задачу, в которой у вас нет решения, но есть все input- и answer-файлы, то у вас на каждый тест есть "ручной" answer-файл.
  • Если вы создаете тесты с нуля (вообще все тесты с нуля или только часть), то:
    • если к очередному тесту вы можете легко создать и answer-файл, то сделайте этот answer-файл "ручным" (в зависимости от теста он будет или генерируемым генератором теста, или полностью ручным)
    • в противном случае (например, если этот тест — полностью случайный), то не делайте на него "ручного" answer-файла.

Реализация[править | править код]

Для поддержки ручных answer-файлов в языке генерации тестов есть шаблоны ^a+ и ^a*. Для создания ручного answer-файла скрипт генерации тестов должен использовать соответствующий шаблон. Daysper считает, что после завершения выполнения скрипта генерации тестов все тесты, для которых был использован один из этих шаблонов, уже имеют корректные answer-файлы, и не будет запускать решение жюри для их генерации. Answer-файлы на все оставшиеся тесты будут сгенерированы с использованием решения жюри.

Примеры[править | править код]

(См. также примеры в Идея: номера тестов).

Ручной тест[править | править код]

Пусть в файлах 01.hand и 01.a.hand лежат ручные тест и answer-файл. Тогда в скрипте генерации тестов (.d-файле) должны быть следующие строки:

copy 01.hand ^t+
copy 01.a.hand ^a*

Генератор[править | править код]

Пусть есть генератор, который генерирует сразу и тест, и answer-файл. Пусть он принимает имена этих файлов как первый и второй параметры командной строки. Тогда в скрипте генерации тестов могут присутствовать следующие строки:

compile gen
gen ^t+ ^a*