Привет, Codeforces.
Уверен, многие в курсе — просто напомню. Polygon — это сервис для подготовки задач по программированию. Обычно используется в подготовке к олимпиадам, но часто и для учебных задач по информатике. Расположен он по адресу https://polygon.codeforces.com/ и открыт для всех желающих.
Я недавно обнаружил, что вот уже прошло более 5-ти лет как была создана система разработки задач Polygon. Самое время обобщить накопленный опыт использования.
Впервые о Polygon я публично рассказал в узком коллективе тренеров российских сборных на финале ACM-ICPC в 2009-м году. Я не скажу, что все восприняли разработку с энтузиазмом, были и те, кто высказал откровенный скепсис жизнеспособности и востребованности такой системы. Прошло 5 лет и на финале ACM-ICPC в Екатеринбурге Олег Христенко (человек-Снарк) сказал, что считает создание Polygon моей большей заслугой, чем Codeforces. Я, конечно, был удивлен, но Полигону это передал :-)
К началу работы над Полигоном (а это была осень 2008-го года) я приступил с точным осознанием необходимости подобной системы. К тому времени я уже был опытнейшим автором задач для большого количества контестов — бесконечное количество школьных Саратовских олимпиад, четвертьфиналы ACM-ICPC, мои задачи были на ВКОШП, РОИ, полуфинале ACM-ICPC NEERC, на финале TopCoder Open и еще много где. В большинстве случаев задачи разрабатывались в системе контроля версий, были разложены по папочками и структурировались какими-то полуформальными негласными правилами именования.
Ниже я попробую тезисно сформулировать, почему использование Полигона это хорошо, а неиспользование — плохо.
1. Полигон защищает от ошибок
В Полигон встроено множество средств автоматизации и самопроверки. Несколько примеров:
- вам будет трудно опечататься в тесте из условия или забыть его актуализировать после изменения тестов, так как он вставляется автоматически, а ответ генерируется системой авторским решением;
- вам будет трудно оставить в архиве некомпилирующееся решение (даже опытные команды типа ИТМО регулярно оставляют в архиве решения на Java, где имя класса не совпадает с именем файла);
- вам будет трудно забыть сделать первый тест тестом из условия, Полигон покажет вам предупреждение;
- вам будет трудно написать генератор, который инициализируется от времени и поэтому при последовательных запусках выводит разные тесты, Полигон запустит генератор пару раз с интервалом в секунду и проверит совпадение тестов.
2. Архивы (пакеты) задач Полигона единообразны и машиночитаемы
Поразительно, но олимпиадное сообщество за более чем 20 лет активного развития так и не стандартизовало способ распространения задач. Задачи из Полигона имеют одинаковый и логичный способ организации файлов и являются машиночитаемыми. Файл problem.xml содержит не только базовую мета-информацию вроде ограничений на время и память, но и в деталях всё что понадобится для последующей автоматизированной работы над задачей.
Вот несколько примеров:
- для TL указан тип процессора, для которого он был выбран;
- явно указан способ ввода-вывода и имена файлов, если таковые используются;
- название задачи с поддержкой многоязычности;
- точный способ генерации каждого из генерируемых тестов;
- теги решений (например, заведомо медленное решение, может быть помечено тегом time-limit-exceeded);
- точные пути до тестов и прочих ресурсов.
Мне не известны другие используемые настолько полные машиночитаемые форматы дескрипторов.
3. Полигон берет на себя долговременное хранение и доступность
Я прям сейчас могу открыть задачи Саратовского четвертьфинала ACM-ICPC 2009-го года, поправить тест. Все те, кто имеет права на задачу, могут сделать тоже самое. Все изменения будут видны всем авторам, они будут нотифицированы по email, а автоматические системы могут подхватить изменения после перевыпуска пакета. Во время правки я могу запустить решения, все тесты будут провалидированы, решения запущены.
Что же обычно происходит, если Полигон не используется? На время разработки олимпиады поднимается сервер системы контроля версий, обычно потом он гасится, остается только архив: теряется история правок, доступы на разработку, автоматизация запусков и других действий.
4. Полигон сокращает порог вхождения в процесс подготовки задач
Авторами Codeforces являются участники соревнований разного уровня подготовки, разного культурного и профессионального бэгграунда, для многих — это первый опыт подготовки задач. Почти всегда они с легкостью понимают что и как надо делать, что и как добавлять.
Если Полигон не используется, то процесс обычно регулируется системой негласных правил (медленное решение называйте с суффиксом _slow, ну или _tl), неопытному участнику непонятно с чего начинать и как. Кроме того, обычно требуются знания основ работы с svn и командной строкой, а работа для пользователей Windows и Linux различается.
5. Полигон помогает управлять доступом
В Полигоне вы можете взять и дать права на задачу любому зарегистрированному пользователю. При работе без Полигона, этим обычно занимается администратор сервера с системой контроля версий, а вам недоступен даже список соавторов. Вы не можете сами управлять доступами, управление происходит обычно на уровне контеста, а не задач.
6. Полигон имеет issue-tracking
Возможность добавления и управления заданиями просто необходима при одновременной работе более чем одного разработчика. Более того, issue-tracking востребован и при индивидуальной работе. Работа структурируется, мелочи не забываются. Сколько я работал вне Полигона — верхом управления заданиями был специальный файлик с нумерованным списком заданий.
7. Полигон легко интегрируется с тестирующими системами
Полигон предоставляет машиночитаемые пакеты задач с подготовленными тестами (как для Windows, так и для Linux), так и с возможностью их сгенерировать при разворачивании пакета. Полигон имеет простой HTTP POST-based API для доступа к данным. При формировании POST-запросов надо передавать параметры login и password пользователя (и опционально revision).
- https://polygon.codeforces.com/p/username/problemname — скачать последний пакет;
- https://polygon.codeforces.com/p/username/problemname/problem.xml — скачать дескриптор из последнего (если не указан revision) пакета, например, чтобы увидеть, что изменился revision и надо перекачать пакет;
- https://polygon.codeforces.com/c/contestid/contest.xml — скачать дескриптор контеста
- https://polygon.codeforces.com/c/contestid/english/statements.pdf — скачать PDF с условиями на английском, все условия перечислены в дескрипторе контеста.
Откажитесь от ручного копирования задач в тестирующую систему, пусть она сама выкачает задачу и задеплоит или обновит ее.
8. Без Полигона требуется специальный софт на компьютере разработчика
Например, разработчику на Windows может понадобиться bash, чтобы запустить doall.sh, генерирующий все тесты. Или Java-программист будет вынужден поставить C++, чтобы скомпилировать чекер. Для компилирования условия ставьте LaTeX.
Полигон избавляет от всего этого, многое делается на стороне сервера.
9. Полигон безопаснее большинства альтернативных способов совместной разработки
Полигон использует HTTPS, привязку к IP-адресу (опционально, рекомендуется), привязку к браузеру, CSRF-токены всюду.
10. Полигон классифицирует и индексирует задачи
Вы никогда не запутаетесь в задачах. Только созданных мной задач в Полигоне около 500, но благодаря тега, фильтрам, поиску и распределению по контестам, я в них не путаюсь и могу быстро найти что надо.
The End
Это только первые причины, что пришли мне в голову в два ночи. Уверен, что хорошенько подумав, можно сообразить и другие.
Вывод простой. Каждый раз, когда вы создаете задачу не в Полигоне, то бог убивает котенка.