Всем привет!
Раньше мой вклад в развитие 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, чтобы отобразить предупреждения.
В скором времени Вас ждут все новые и новые улучшения! Всем хорошего летнего настроения!
Minor feature request: add a button to create validator/checker file in the repository directly, probably using some template (either shared or personal). I edit these files in web interface directly, but I still need to create them locally in order to upload them initially which doesn't make much sense.
это функция игнорируется для переменных, содержащих в названии цифры
А почему? Единственная разумная мысль -- не проверять это для координат (а ля
x1 y1 x2 y2
), но тоже как-то странно.Потому что есть частый паттерн примерно такого вида:
Автокомплит редактора, однако, от Бога. Автокомплит уровня notepad++, который автодополняет только тем, что уже видел + маленький встроенный набор, никакой вменяемой логики по матчингу подстрок (выдаёт явно много трэша, что видно даже на скриншоте), контекста не понимает (считай даёт возможность написать полную чушь). Крайне тупое создание, в общем.
Кто в нём вообще нуждается в таком варианте?
Автодополнение по образу и подобию Sublime Text. "Трэш", как вы называли, позволяет разворачивать "ftl" в "find_template_loader" или исправлять опечатки.
Из минусов — полностью согласен, что встроенный набор чересчур уж маленький. Скорее всего, объясняется тем, что не хотели отдавать клиенту файл со всеми идентификаторами стандартной библиотеки. Хотя это может и не быть проблемой, сервер ведь сжимает файлы перед отправкой.
И еще: необходимость жать Ctrl+Space сводит почти на ноль ускорение написания кода. Лучше бы подсказки сами появлялись. Или хотя бы по нажатию Tab производилась замена по "самому подходящему" правилу (из предположения, что пользователь знает, что это за правило).
На школьных олимпиадах также очень полезно иметь возможность запустить валидатор на тесте и получить на выходе результат "к какой группе относится тест". Вот сгенерировал классный тест, хочешь добавить в какую-нибудь группу, а запускать валидатор пять раз подряд не хочется.
А создавать файл, не загружая с компьютера, все еще нельзя? Или я чего-то не знаю?