Обновления Testlib и Polygon (июнь 2015)

Revision ru30, by fcspartakm, 2015-06-30 12:52:14

Всем привет!

Раньше мой вклад в развитие Codeforces ограничивался подготовкой раундов (Codeforces Round 288 (Div. 2), Codeforces Round 293 (Div. 2), Codeforces Round 297 (Div. 2)). Но месяц назад я присоединился к работе чудесной команды Codeforces во главе с Михаилом Мирзаяновым (MikeMirzayanov). Традиционно, чтобы вникнуть во все тонкости этого проекта, моя работа началась с системы Polygon. Хотелось бы рассказать Вам о ее изменениях.

Напомню, что Polygon — это система для подготовки задач по программированию. Именно в ней подготавливаются все задачи к раундам Codeforces и многим другим олимпиадам. Системой Polygon могут пользоваться все желающие в любой момент времени.

Для редактирования файлов в Polygon теперь используется Ace Editor. В нем есть приятная глазу подсветка синтаксиса и автодополнение (нужно нажать Ctrl + Space). В скором времени планируется внедрить этот редактор и в Codeforces.

К сожалению, Ace Editor не поддерживает скроллинг текста на телефонах и планшетах, поэтому для них останется старый редактор текста.

На странице валидатора, чекера и интеркатора появилась кнопка View Source, при нажатии на которую можно посмотреть исходный код файла. В основном, это удобно тем, что теперь можно посмотреть код стандартных чекеров.

В библиотеку Testlib также были внесены полезные изменения, которые поддержаны и в Polygon. Теперь можно указывать в валидаторе различные ограничения для различных тестсетов, а также для различных групп тестов. Для регистрации валидатора теперь нужно использовать registerValidation(argc, argv);, а у validator появились методы validator.group() и validator.testset().

Для проверки теста валидатором из командной строки с использованием тестсета и группы надо выполнить команду val.exe --testset "testsetName" --group "groupName" < testFile.

Эти изменения удобно использовать, например, при подготовке школьных задач, где выделяются различные группы тестов, а также позволит использовать в раундах Codeforces мультитестсеты, запрещая использовать таковые для взломов.

Также упрощена проверка покрытия тестами различных случаев. Это поддерживается в Polygon во вкладке Invocation.

Если в валидаторе указать название переменной (это функция игнорируется для переменных, содержащих в названии цифры), то в случае, если нет тестов, в которых эта переменная достигает своего минимального или максимального значения, после выполнения Invocation, появится предупреждение об этом.

Кроме того в testlib/Polygon появилась дополнительная функциональность, которую мы назвали features. Зачастую (обычно координатору подготовки задач) требуется удостовериться, что тесты покрывают тот или иной случай (паттерны). Например, в задаче на графы, вероятно, надо быть уверенным, что есть тесты с несвязными графами и большими деревьями. Для того, чтобы гарантировать это теперь достаточно добавить в валидатор в начале декларацию поддержки двух фич addFeature("disconnected"); и addFeature("big-tree");. В основной части валидатора, после считывания графа можно проверить правда ли он несвязный, и если несвязный, то зафиксировать этот факт вызовом feature("disconnected");. Аналогично с деревом: если граф — большое дерево, то вызвать feature("big-tree");.

Теперь Polygon при запуске invocation предупредит о том, если есть задекларированная фича, но такая, которая не встретилась ни в одном тесте. Это говорит о том (на нашем примере), что тесты не содержат несвязных графов и больших деревьев.

Введение Features будет полезно для человека, проверяющего готовую задачу или готовый контест. Но, как нам кажется, эта функция будет полезна и самим авторам задач.

Валидатор выводит информацию о достижении экстремальных значений переменных и использования features, если ему в командную строку вызова добавили --testOverviewLogFileName log.txt. Именно эти логи разбирает и парсит Polygon, чтобы отобразить предупреждения.

В скором времени Вас ждут все новые и новые улучшения! Всем хорошего летнего настроения!

Tags codeforces, polygon, testlib, полигон

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en12 English fcspartakm 2015-06-30 14:23:45 30
ru32 Russian fcspartakm 2015-06-30 14:23:31 0 (опубликовано)
ru31 Russian fcspartakm 2015-06-30 14:23:12 30 (сохранено в черновиках)
ru30 Russian fcspartakm 2015-06-30 12:52:14 15 Мелкая правка: 'orces.\n\n![ ](h' -br/
en11 English fcspartakm 2015-06-30 12:51:57 228 Tiny change: '.\n\n[cut]\n\n![ ](h' -br/
ru29 Russian fcspartakm 2015-06-30 12:47:13 284
ru28 Russian fcspartakm 2015-06-30 12:42:33 0 (опубликовано)
en10 English fcspartakm 2015-06-30 12:42:21 77
ru27 Russian fcspartakm 2015-06-30 12:37:26 45
en9 English fcspartakm 2015-06-30 12:36:50 139
en8 English fcspartakm 2015-06-30 12:32:04 153
ru26 Russian fcspartakm 2015-06-30 12:17:58 131
en7 English fcspartakm 2015-06-29 19:28:58 61
en6 English fcspartakm 2015-06-29 19:28:15 10 Tiny change: 'om/4cbe16/тетстстс.png)\n\nI' -
ru25 Russian fcspartakm 2015-06-29 19:26:07 62
en5 English fcspartakm 2015-06-29 19:25:19 65
ru24 Russian fcspartakm 2015-06-29 19:24:58 71
en4 English fcspartakm 2015-06-29 19:23:53 1089
en3 English fcspartakm 2015-06-29 18:57:06 2096
en2 English fcspartakm 2015-06-29 17:46:39 451
en1 English fcspartakm 2015-06-29 17:35:14 4050 Initial revision for English translation
ru23 Russian fcspartakm 2015-06-29 15:28:43 263
ru22 Russian fcspartakm 2015-06-29 15:26:44 168
ru21 Russian fcspartakm 2015-06-29 15:25:59 167
ru20 Russian fcspartakm 2015-06-29 15:25:14 890
ru19 Russian fcspartakm 2015-06-29 15:16:29 39
ru18 Russian fcspartakm 2015-06-29 15:15:48 80
ru17 Russian fcspartakm 2015-06-29 15:14:52 58
ru16 Russian fcspartakm 2015-06-29 15:11:18 16
ru15 Russian fcspartakm 2015-06-29 15:10:48 6 Мелкая правка: 'нию, [Ace Redactor](http:' -> 'нию, [Ace Editor](http:'
ru14 Russian fcspartakm 2015-06-29 15:09:54 48
ru13 Russian fcspartakm 2015-06-29 14:44:32 1 Мелкая правка: 'estsetName --group "' -> 'estsetName" --group "'
ru12 Russian fcspartakm 2015-06-29 14:18:44 8 Мелкая правка: ' хорошего настроения' -> ' хорошего летнегнастроения'
ru11 Russian fcspartakm 2015-06-29 14:17:58 2 Мелкая правка: 'upName" ----testOver' -> 'upName" --testOver'
ru10 Russian fcspartakm 2015-06-29 14:17:38 187
ru9 Russian fcspartakm 2015-06-29 14:01:49 543
ru8 Russian fcspartakm 2015-06-29 13:56:37 2 Мелкая правка: 'мального и максимал' -> 'мального или максимал'
ru7 Russian fcspartakm 2015-06-29 13:56:16 14 Мелкая правка: 'титестсеты, чтобы избежать проблем с' -> 'титестсеты без проблем с'
ru6 Russian fcspartakm 2015-06-29 13:55:15 84
ru5 Russian fcspartakm 2015-06-29 13:53:07 986 Мелкая правка: 'человека. Например, ' -
ru4 Russian fcspartakm 2015-06-29 13:38:02 100 Мелкая правка: '`.\n\n\n\n' -
ru3 Russian fcspartakm 2015-06-29 13:37:09 322 Мелкая правка: 'et()`.\n\n![ ](http://mirror.codeforces.com/492b87/validator.png)\n\n' -> 'et()`.\n\n\n\n'
ru2 Russian fcspartakm 2015-06-29 13:20:48 550 Мелкая правка: 'та.\n\n2. ' -
ru1 Russian fcspartakm 2015-06-29 13:15:15 341 Первая редакция (сохранено в черновиках)