Привет, 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
Это только первые причины, что пришли мне в голову в два ночи. Уверен, что хорошенько подумав, можно сообразить и другие.
Вывод простой. Каждый раз, когда вы создаете задачу не в Полигоне, то бог убивает котенка.
А у Вас не было мысли платно лицензировать Полигон для установки на сторонний сервер? Тогда, возможно, даже параноидальные румыны согласятся пользоваться им для подготовки SEERC'а.
Если нужда в подготовке контеста возникает раз в год, то сделать это можно и в MS DOS, если на пункт "проверить, а все ли нормально" выделить больше десяти минут.Острая необходимость в Полигоне скорее есть у людей, занимающихся этим более регулярно.
.
Мысль(весьма очевидная, как мне казалось) в том, что тысячи задач и контестов были успешно подготовлены и без полигона. В силу этого, мне кажется, что основная проблема румын не в отсутствии этого самого полигона.
Если присмотреться, то можно увидеть, что я ничего хорошего/плохого не сказал про Полигон. Акцент на другом.. Почему-то, большинство думает, что поход к хирургу исправит плохого танцора.
Может я что-то не понимаю/знаю, тогда скажи)
Все правильно. Полигон — очень круто. Но вот как это происходит у меня:
Во вторник утром я опять побочным эффектом от делания задачек убил двух котят... Примерно за полчаса в сумме. Это в разы меньше, чем ушло бы в полигоне.
А сколько ништяков дает интегрирование всех сделанных задачек с моей файловой системой... Возможность быстро смотреть файлы, умный поиск, скрипты!
А еще помню страшный летний анекдот "XXX, дай задачку? а она в полигоне! ну так дай задачку! а полигон то ли лежит, то ли тормозит...". Возможно это единичный случай, но =(
P.S. Или я отстал от жизни, и задачки из полигона уже можно интегрировать ко мне на комп? хотя бы в readonly режиме.
Это все-таки свойство ЛКШатского полигона. Саратовский им не обладает.
Еще как обладает. Лежит вроде редко, но вот зато вылогинивать мастер.
Можешь расшифровать?
В смысле, рассказать, что конкретно быстрее?
Ползадачи = шаблон
Навигация по файлам, время доступа к файлам, скрипты
Я не понял фразы "побочным эффектом от делания задачек убил двух котят".
Теперь увидел "Каждый раз, когда вы создаете задачу не в Полигоне, то бог убивает котенка" в конце поста, стало понятно :)
Я думаю здесь ты применил литературную гиперболу. Если у тебя уходило по 15 минут на каждую из задач, то хотя бы даже полигонизировать ее после — дело +5 минут. Используя Полигон, ты не подписываешь кровью обязательство не использовать локальную файловую систему и всё прочее. Однако не имея на настоящий момент эти две задачи в Полигоне, была потеряны половина полезных штук из поста.
Да, ты прав, я имел в виду именно "разработку в polygon" vs "разработку в привычной среде обитания". И там разница действительно в 2-3 раза, а то и больше. Я часто делаю простые задачи, на написание именно кода там уходит мало времени.
Залить в полигон -- не проблема и это действительно дело 5 минут. Но потом что? Если задача меняется, а она будет меняться, у себя локально я могу это быстро исправить. Overhead на синхронизацию с полигон все еще велик. И риск ошибочной синхронизации, пока это не делается автоматикой тоже есть. Об этом Паша ниже писал.
Видимо, более интересный вопрос не где делать задачи, а где хранить. Тут с одной стороны проще перейти на polygon, с другой стороны очень не хватает API для автоматизации внесения изменений снаружи.
На самом деле некоторых вещей недостает. А именно, местная система контроля версий мало что умеет. Было бы удобно, например, смотреть историю файла или чекаутить прошлые версии. Может быть, можно как-то соединить полигон с готовой системой контроля версий?
Так ведь все изменения на почту отправляются, там можно все версии посмотреть.
Могу сказать, чего мне не хватает в полигоне, и почему я все-таки предпочитаю svn, для всего кроме ЛКШ. В ЛКШ надо каждый год делать примерно одни и те же задачи, поэтому преимущество от того, что задачу легко найти и исправления будут один раз навсегда перевешивают.
1a. Общий код в разных частях задачи. Например генератору нужно решение, чтобы подобрать тест, максимизирующий какой-то параметр. Конкретный случай — какая-то задача с одного из ASC, которую мы с KAN долго и мучительно заливали в полигон в ЛКШ.
1b. Задачи, в которых тест зависит от ответа на предыдущий. Если хочется сгенерировать какой-то специальный тест, необходимо знать ответ во время генерации, что требует копирования кода. Альтернатива, которая спокойно сделается локально — запустить решение, которое не будет учитывать эту зависимость, потом подменить тест, так, чтобы он перешел в нужный.
1c. Задачи в которых требуется нетривиальный запуск/компиляция решений. Примеры — почти все сборы к IOI. Кроме того, даже если есть одна такая задача, то делать хоть что-то в полигоне не удобно. Кажется, что желание, чтобы все было в одном месте логично.
1d. Требуется какая-то дополнительная валидация. Например группы тестов.
1e. Хочется иметь возможность посмотреть на тест глазами. Локально я написал визуализатор и запустил его. В полигоне, я должен сделать 15 кликов мышкой, чтобы достать тест, перед этим.
1f. Есть какая-то задача, в которой решений приближенное. Но генератор знает точный ответ. Привет от контестов Petr. Он их делает в Polygon, в результате решение, которое генерирует точно правильный ответ, выглядит как мегабайт констант, которые по хешу теста выводят точный ответ, и генерируется генератором локальным запуском. Самое простое решение, правда?
1g. Еще 10 идей, которые пока не приходили в голову, но придут, когда будут уместны.
Мне этого уже больше чем достаточно, чтобы использовать полигон только в ЛКШ, где преимущества это все все-таки перевешивают, и когда у меня нет выбора (например раунд на CF, открытая олимпиада). И то в случае ЛКШ, я в основном заливаю готовые задачи, а если делать новую, предпочту сначала максимально сделать все локально, а потом залить.
По пункту 1 (нестандартный формат сложно упихать в стандартный дескриптор) поддержу. Как сделать дескриптор стандартом, но расширяемым — отдельная интересная задача.
По пункту 4 (нестандартные условия) — по факту так: в Петрозаводске готовые в Полигоне условия просто выкачиваются и доформатируются пару минут руками, так проще и быстрее. Очевидный недостаток такого метода в том, что баги после этого надо исправлять в обоих местах.
По пунктам 2, 3 и 5 (скорость действий и локальная копия) — консольный клиент к Полигону с рабочей копией на локальном диске и синхронизацией в стиле систем контроля версий мог бы оказаться решением.
А как предлагаете разносить функциональность между консольным клиентом и Полигоном? Вопросы управления задачами оставлять на уровне полигона, а всё что касается работы с файлами — выносить в клиент?
Может быть, можно создать такой консольный фреймворк для работы с задачами? Чтоб он умел запускать тесты, валидаторы, проверять все как положено. Например, добавляешь новое решение — прописываешь его в xml-ке — и оно подхватывается.
Собственно, наверняка внутри полигона что-то такое уже имеется и работает. А поверх такой штуки уже можно использовать любую систему контроля версий.
Продублировать какие получится функции в виде консольных команд. Чтобы вместо "кликнуть 100 раз мышкой" было возможно "запустить один скрипт", где один раз заранее написаны 100 эквивалентных команд.
Я считаю, что когда у polygon'а будет полноценный api (Или уже есть? Летом я спрашивал у Fefer_Ivan, ещё не было), консольных клиентов понапишут достаточно сами — добавят поддержку во всякие t, Makefile от PavelKunyavskiy и прочее.
В общем-то да, консольный клиент был бы простым следствием из достаточно полного API.
Ребята из комментариев снизу напомнили: в polygon нельзя выбрать компилятор для файла, он автоматически определяется по названию файла. То есть, не отличить python2 от python3 (это разные языки, если что), не различить версии gcc или хотя бы стандарта для c или c++. А файлы с суффиксом «.c++» вообще не залить.
(Интересно, умеет ли polygon хотя бы отличать файлы «.c» от «.C» и проставлять для последнего c++?)
По поводу дубликации кода.
Весь общий код можно вынести в header файл и добавить его к ресурсам контеста. Там же, где лежит testlib.h. Тогда если валидатору, чекеру и генератору нужен будет общий код, они смогут его получить через, например, #include <problem-commons.h>.
Решениям этот header, правда, не будет доступен.
А почему бы не выложить полигон в open-source? Это решило бы сразу все проблемы: и для параноиков, которые не хотят отдавать задачи кому-то ещё, и для обычных людей, которым не хватает каких-то фич (они смогут их сами прикрутить).
Конечно, было бы хорошо, чтобы поддерживались группы тестов (и иные особенности школьных олимпиад), и "расширенные" возможности по оформлению условий (на практике действительно бывает проще и быстрее править TeX-файлы локально), и ряд других полезных вещей. Но это, наверное, требует каких-то нетривиальных доработок (и заметного времени на них).
А напомнить хотелось бы об одной вещи, которая примерно год назад была оценена как достаточно легко внедряемая в существующую систему — о разборе, который был бы "интегрирован" в задачу и собирался бы в отдельный TeX-файл (а также pdf и html) как для задачи, так и для контеста в целом (так же, как собираются сейчас условия).
Вот здесь я тоже хочу поддержать. Это же реально не так сложно внедрить, но это позволит автоматизировать процесс подготовки разбора к задачам раундов, а так же, сделает удобным подготовку разборов, например, к контестам в Петрозаводске и его зеркале в Ижевске. Ижевские команды ну ооочень оценят.
Отдельный вопрос — за Polygon спасибо, пользуемся, благодарны. Но именно потому, что пользуемся, появляются некоторые вопросы и пожелания.
(1) Как-то уже предлагалось (не помню точно, кем, но точно предлагалось) ввести более подробные статусы решений. Что-то наподобие "это (неправильное) решение ОБЯЗАНО дать хотя бы на одном тесте TLE, ОБЯЗАНО дать хотя бы на одном тесте WA, и кроме того МОЖЕТ на некоторых тестах дать RTE". Как по мне — гораздо более полезно для контроля полноты тестов, чем то, что есть сейчас.
(2) Иногда всё же было бы супер-удобно позволять копировать задачи и потом править разные копии по-разному. Особенно это могло бы быть полезным для НЕ_олимпиадных задач с автоматической проверкой — например, http://informatics.mccme.ru/mod/statements/view3.php?id=3700&chapterid=3602#1 и http://informatics.mccme.ru/mod/statements/view3.php?id=3700&chapterid=3603#1 Кстати, при достаточно аккуратной реализации branch-ей это могло бы даже уменьшить общее количество хранимых на сервере полигона данных!
Оба следующих вопроса касаются вопроса взаимодействия polygon и ejudge. Вроде ведь никто из них НЕ_позиционирует себя как конкурента другого или как "будем делать назло другому". Тогда почему, почему???
(3) Неоднократно случалось изменение протокола взаимодействия, из-за которого ломался импорт задач в еджадж. Аж интересно, чего ради-то, и неужели никак нельзя этого избегать...
(4) Почему заодно с формированием .tex и .html версий условий нельзя сформировать ещё и .xml-версию согласно требований ejudge? По идее, раз уж реализовано .html, то и там должно быть несложно...
(4) — почему не выкладывать в еджадж pdf-ку? Ведь распечатываете для участников вы именно pdf-ку.
Повторю свой собственный ответ в одной из других тем:
Тоже, конечно, выход, но как по мне — малость костыльный.
1) Иногда можно сомневаться в наличии/адекватности/... pdf-viewer-а, тогда как наличие web-browser-а и так и так неминуемо необходимо
2) Насколько понимаю, всякий более-менее адекватный способ прикрутить условие задачи в еджадж так, чтоб онО отображалось в веб-браузере, будет давать гарантированно правильные еджаджевские time limit, memory limit, имена файлов. С отдельно собранными pdf уследить за этим труднее, особенно когда у автора нет возможности достаточно заранее и достаточно подробно тестить различные решения задачи именно на том же сервере, где будет проходить собственно контест, и как следствие ограничения (особенно по времени) приходится менять в последний момент.
3) Всё-таки удобно иметь условие задачи и кнопку "Отправить решение" на одной странице.
(Конец самоцитаты)
Кстати, бывает и так, что бумажный вид в принципе никому не выдаётся. Когда, например, формат официально заочный или полу-заочный (на многих площадках, официальных, но удалённых друг от друга). Разумеется, только для личных олимпиад, не для ACM, где важно наличие отдельных от компа копий условий.
Пожалуйста, рады быть полезными.
Вполне вероятно. Стоит подумать, но совсем автоматически это контролировать не получится. Например, изменив тест перед коммитом всё равно вы должны будете запустить решения на тестах у убедиться, что не возникло ошибки.
Копирование задач может оказаться полезным, сами попадали несколько раз в эту ситуацию. Кажется, это не сложно сделать. Обсужу с разработчиками.
На моей памяти только 1 раз было изменение без обратной совместимости. Обычно мы стараемся ее поддерживать и что-то может поломаться только в очень редком случае. Можете напомнить о чем речь?
Я вот не знаю ничего о xml-формате условий, мне кажется это какой-то внутренний формат ejudge. В данном случае, предпочту, чтобы ejudge или его операторы научились автоматически конвертить из tex/html в свой xml.
К пункту (3). Может я чего недопонимаю, но, даже если списать на лично мою криворукость все случаи, когда чего-то не работало у меня, вроде как остаются как минимум два разных случая:
== первый ==
В теме https://ejudge.ru/forum/viewtopic.php?f=5&t=1808 (от осени 2013-го) написано:
xxx: При попытке импорта вылетает послание "polygon login action failed: invalid login or password?", хотя в логине и пароле я уверен(в конфигах всё пишется как надо). ... ... ... Что я делаю не так?
cher: Полигон летом изменил протокол взаимодействия. Поддержка нового протокола взаимодействия будет реализована в следующей версии.
== конец первого, начало второго ==
Не так давно В.М.Гуровиц писАл (внутри комментариев к http://vk.com/wall1695846_11590 ), что загрузка из полигона в еджадж не работает нигде, ибо опять был изменен (со стороны полигона) формат взаимодействия.
== конец второго ==
cher неправ, изменили не летом, а недавно совсем (неделю назад примерно). Было изменено название поля в форме авторизации (login -> loginOrEmail) — к API это не имеет никакого отношения. То что ejudge парсит странички и таким образом взаимодействует с Полигоном — неудачный способ интеграции. То, что это захаркожено в ejudge, а не является конфигурируемым параметром, тоже неудачный ход. Например, в этом тексте указано, как выкачивать материалы прямым способом через API.
На самом деле я уже попросил нашего разработчика сделать fallback в старый параметр (костыль-костылем) как раз под ejudge. Полагаю, в понедельник внедрим.
А сколько котят убивает бог, когда при создании задачи в Полигоне автора задачи вылогинивает за неактивность? Если больше 0.5, то с точки зрения максимизации кошачьей популяции выгоднее все-таки Полигоном не пользоваться :-)
Не всегда максимизация кошачьей популяции идёт на пользу: например, вот этих птичек кошки истребили полностью :с
Об этой проблеме я не знал и почему-то на нее не попадал. Я сейчас перенес место хранения сессий, должно всё починиться. Спасибо!
У меня сложилось впечатление, что полигон как проект — мёртв (т.е. им никто не занимается):
Главная проблема — п.1. По этому поводу я два раза писал в личку MikeMirzayanov, но судя по отсутствию какой-либо реакции, эти сообщения отправились в /dev/null.
(3) — можно же выкачать пакет с задачей, зайти в папку statements и там тыкнуть на run.bat / run.sh, нет?
2. c++11 там же, к слову.
(а маркдаун настолько умный, что считает, что нумерует элементы лучше меня)
Совсем не мертв: на днях появилась галочка при логине "Attach session to IP address (more secure)", стало возможным создавать задачу прям сразу в контест (одновременно выдав нужные права разработчикам контеста), появились звездочки "избранное" на задачах внутри интерфейса контеста. Кроме того, в комментариях обратили внимание на необоснованные логауты — я думаю, что сегодня решил эту проблему. Да и как может быть мертв проект, который является ключевым в нашей инфраструктуре и в котором подготавливаются все задачи Codeforces?
По пунктам:
My bad. Я сделал багтрекер на github, но выяснилось, что он требует авторизацию для того, чтобы оставить issue. Может и норм, тогда просто надо поменять ссылку. А вы знаете достойную замену с возможностью анонимными пользователям оставлять issues? Документация устарела и не уверен, что так она и нужна. Я постоянно возвращаюсь к идее сделать Complete User Guide, но рук не доходят. Видимо пока просто уберу ссылку.
Из-за того, что разработчики Python 3 приняли какие-то странные решения — его трудно поддержать. Как я понимаю — формально Python 2 и Python 3 разные несовместимые языки. Однако программ на них одинаковые расширения (что ладно, это нормально), так еще и интерпретатор одинаково называется
python
. Я не очень понимаю, как в таком случае писать, например, doall скрипты. Сейчас в них запускается просто python, в надежде что это Python 2 (что так и есть в большинстве случаев). Опять же, пока питон в полигоне один, выкачавшему пакет трудно ожидать, что в этом месте имеется ввиду Python 3. А вот при появлении двух Питонов (зоопарка Питонов!) всё становится менее очевидно. Я не спец в Питоне, может есть какие-то элегантные решения?Вы имеете ввиду, что хорошо бы в пакете иметь файлики типа generate-pdf.{sh,bat}? Я о таком и не думал, почему-то мне такое не было нужно. Это, вероятно, добавить не трудно.
Это не просто — во внутренней рабочей копии поддерживается всякая генерация метаданных, что возможно сделать — это readonly способ выписать свою working copy. Эта мысль мне пришла уже после чтения комментариев здесь. Но не уверен, что это сильно спасет. Писать свой API довольно сложно и ресурсов на это пока нет. С другой стороны, как писал выше — я подготовил более 400 задач в Полигоне и как пользователь сильной необходимости не вижу.
«…так еще и интерпретатор одинаково называется
python
»Это проблема конкретно windows. В других системах, конечно же, есть отдельные интерпретаторы
python2
иpython3
.Если очень хочется автоматически отличить исходник на python2 от исходника на python3, то следует посмотреть на shebang. Если там конкретно написано, какой язык использовать, то и отлично, а если нет — автор исходника сам долбак и использовать какой-нибудь по умолчанию.
Уже получше, но в Windows проблема остается. И это, конечно, проблема не Windows, а Питона )
Согласен, авторы windows-сборки питона могли бы подумать головой. Но увы.
Кстати! Я только что обнаружил workaround
py -2
иpy -3
, это конечно не так круто, но всё-таки. Если они правда работают для всех комбинаций инсталляции, то это может быть выход.По-моему главным является пункт 4 — "Полигон сокращает порог вхождения в процесс подготовки задач."
Как видно в комментариях, в недовольных оказались только опытные составители задач, а не новички. Ну так на здоровье, делайте все в своих папочках на компьютере, а когда он потеряется или полетит жесткий диск, то и ваши задачи уплывут.
В то же время во всем цивилизованном мире уже давно используют фреймворки — а Polygon как раз и есть тот самый фреймворк для создания задач. И пусть он иногда медленный, это разумная плата за надежность. По сути, Polygon позволяет создавать контесты, вообще ничего не храня на диске — код можно успешно писать и компилировать на ideone, а все остальное делать в Полигоне.
Действительно, очень хорошо, что Полигон есть. Новым авторам задач легче их делать в первый раз в Полигоне, чем дублировать в очередной раз нужную часть его функциональности. Организаторам легче использовать получающиеся задачи, поскольку их формат более-менее унифицирован. Это несомненная заслуга Миши Мирзаянова.
И логично, что у более опытных авторов задач накопились наработки, которые не совместимы с Полигоном, и это затрудняет его использование. Что-то же они сами использовали вместо Полигона всё это время. Ну и Полигон, естественно, не идеален.
Кстати, про использование IdeOne в качестве инструмента подготовки задач звучит забавно: если забыть выставить видимость, код будет public, и это может привести к спецэффектам на соревновании.
Всякий раз, когда не могу решить задачку больше десяти минут, начинаю листать паблики в айдеоне :)
Ну вот это довольно однобокое восприятие. Я же писал — даже у опытнейших авторов из-за отсутствия инструментария и автоматизации попадаются обидные баги.
Я уже не говорю, что на выходе получаются не машинночитаемые пакеты, а архивы для ручной обработки (а это принципиальная разница). Ну вот даже архив опытнейшей группы авторов с важного контеста RCC Финал 2014 содержит несколько причин, почему требуется ручное вмешательство при его разборе:
Кроме того, отсутствуют условия в LaTeX, что усложняет переиспользование задач. В архиве отсутствуют библиотеки testlib/testlib4j и нет каких-либо ссылок на них. Отсутствуют генераторы и способы генерации тестов, что усложняет их последующую поддержку при необходимости.
Кстати, справедливости ради еще раз отмечу — что это очень хороший архив контеста, у многих других авторов или других контестах ситуация намного хуже.
По поводу первого пункта: И что-то действительно меняется если все компилировать под c++11 (не компилятся, имеют другое поведение)?
Ну вроде 100% обратной совместимости нет, вот здесь, например, http://stackoverflow.com/questions/6399615/what-breaking-changes-are-introduced-in-c11 кое-что написано. То есть теоретически напороться на что-то можно, рисковать в общем случае не хочется.
Я понимаю, что 100% совместимости нет, (а еще понимаю, что все-таки случайный код обычно обратно совместим, а чтобы получить несовместимый нужно постараться, но это все не важно)
Мне интересно, почему не верно утверждение, "все решения авторов финала RCC 14 написаны на c++11".
Мысли в сторону: да почему стандарт, который вышел 3 года назад и скоро перестанет даже быть последним(или уже?, я не очень слежу) все считают настолько новым, что c++ по умолчанию — это не он. Никто же не говорит, что есть Java и Java 8. :(
The best part of Polygon:
Easier platform -> More contest writers -> MORE CODEFORCES ROUNDS!
Hi, Mr.Mirzayanov, perhaps you could help us with a polygon issue. Recently, minimario and I have been trying to prepare problems on Polygon; however, it seems that input with space separated integers is not supported for standard checkers (and the checkers I made...). The checker crashes each time... Thanks in advance, trophies
PS: I post here, because, if any other people are facing the same problem, they can just look at this thread.
It is completely supported. I think that you are doing somethig wrong. You can share a problem to any experienced writer and he could help you.
https://polygon.codeforces.com/c/contestid/english/statements.pdf Does this means if I write https://polygon.codeforces.com/c/482/english/statements.pdf i will be able to download the Round 275 Div1 problems as pdf?
No, contestid stands for the internal Polygon id of a contest in the Polygon. Polygon doesn't know about Codeforces.
This feature is useful to integrate some online judge with Polygon.
Вопрос: Если я решил провести олимпиаду для учащихся школы , то можно ли использовать Полигон? Составить задачи, залить тесты можно. А как сделать,чтобы задачи тестировались по правилам личной олимпиады.
Полигон не тестирует задачи участников, он помогает подготовить задачи. Используйте задачи в системе тестирования, которая поддерживает правила школьных олимпиад.
Оставлю свой скромный комментарий:
это очень круто "- вам будет трудно забыть сделать первый тест тестом из условия, Полигон покажет вам предупреждение;" но я сейчас специально проверил это, и не смог найти никакого предупреждения. Поясните пожалуйста в каком оно виде? (при создании тестов, условия или при коммите?). Может сделать более заметным если оно есть?
Я бы попросил пойти чуток дальше и сделать проверку что все (а не только первый) тесты условия есть сколько-то первых тестов в тестсете. Это сделать сильно проще многих вещей обсуждаемый здесь) Сам уже два раза сталкивался с такой ошибкой.
Там число, которое количество тестов оранжевое.
Предупреждение показывается в блоке с summary по задаче справа. Раз оно не заметно, то мне кажется хорошей идеей выносить все предупреждения еще на страницу, где делается коммит.
Именно так и делается. Поясняющее сообщение:
Samples are not first tests
.Круто когда хотелки уже давно сделаны, спасибо =) все проблемы от незнания.. Да было бы круто вынести предупреждение еще и на страницу с коммитом
"I first publicly spoke about Polygon in a narrow circle of Russian teams' coaches on ACM-ICPC World Finals in 2009. I cannot say that everybody was enthusiastic about the innovation. Some people were openly skeptical about such system's viability and relevance."
Its nice to see when a new idea that is not well accepted at the beginning takes flight, and becomes something as useful as Polygon is now.
F*ck the skeptics, and keep up the good work!!
Are there any ways to make members in a group can view wrong testcase from Codeforces Mashup?
Polygon looks great! I started to develop a problem.
One question. What languages are supported for checkers, validators, generators, and sample solutions? Thanks.
Thanks! Right now Polygon supports C++, Java, Python 2, Perl and Ruby. In nearest plans to support Python 3 and C++0x. The main reason why we do not support wide range of languages that a problem package should be easy to build. For example, as you know it not easy to install OCaml on Windows correctly. And it is not cool to require it to build a package.
Hi, Polygon looks like a great system! Thanks!
However, I couldn't figure out how to download all test data (input + output files).
I suppose this should be handled by Packages, but whenever I create a full package I get
PackageException: Got exception while generating tests.
Please help!!
Are you sure that complete invocation returns no error? I'll write you in usertalks the details.
Your problem fails to be run on testset "tests". You have invalid test or something like it.
Oh, Yes..!!
I was only using the other testset, so didn't realize this. Thanks for the help. It's really an awesome tool.
Я просто оставлю это тут. И закрою вкладку :)
.
Вообще можно подменить olymp.sty в файлах соревнования. См. ссылку Properties/Files.
Мы там комментили строчки "имя входного файла" и "имя выходного файла", чтобы условие на одну страницу влезало и чтобы новички не пытались использовать файл с именем stdin.
.
Вот внезапно не так давно писал в рассылку Нижегородской городской олимпиады по информатике, чем мне не нравится полигон. В итоге, правда, мы вроде сошлись на мысли, что большинству членов жюри полигон удобнее, и поэтому будем на него переходить, но тем не менее приведу ниже соответствующий фрагмент моего письма с мелкими правками (в квадратных скобках). (Конечно, многие моменты тут уже были освещены другими комментаторами.)
Во-первых, это какая-то непонятная закрытая система. Никто не гарантирует, что она будет доступна еще 5-10 лет (а у нас в тикетах задачи с 2008 года, а в svn — вообще последние 8 олимпиад). При этом если *** [используемый нами хостинг свн] закроется, мы без особых проблем переедем на другой хостинг trac+svn, или даже довольно просто поднимем такой хостинг сами (я думал над этим, но пока не вижу необходимости). Если закроется полигон, то что делать?
(Вот сейчас я могу легко добыть архив ЛКШ до ~2011 года, причем именно в форме репозитория — все рабочие файлы там есть; в свое время создавались архивы и т.д.. Начиная с 2011 года в ЛКШ во многих параллелях используется полигон, и возобладало мнение, что делать архивы параллелей не надо, т.к. "все есть в ejudge и в полигоне". Но в результате, когда мне некоторое время назад понадобились какие-то материалы, я их добыть не смог, т.к. ЛКШасткий полигон лежал.)
Во-вторых, я не знаю, как "основной" полигон, но тот полигон, который используется в ЛКШ, крайне нестабилен. Постоянно у тех, кто работает в полигоне, возникают проблемы, что он недоступен, или что нет инвокеров и т.д. При этом если сервер полигона отвалился, то сделать ничего в принципе невозможно; а в svn вполне можно продолжать вести разработку на своем компе и закоммитить когда все поднимется.
В-третьих, конкретно для нас — я не понимаю, как в полигоне делать книжку с разборами. [Мы на ННОИ традиционно выдаем книжку с подробными разборами, примерами программ и т.д., и у нас это все интегрировано в систему.]
В-четвертых, полигон невозможно автоматизировать. В svn я могу написать скрипт, который пройдется по всем условиям и прогонит их через ispell. Я могу написать скрипт, который выдаст статистику "сколько решений есть по какой задаче". В полигоне это невозможно.
В-пятых, в полигоне очень плохо версионируется участок "мой рабочий комп" — полигон. Точнее, он не версионируется никак. Я могу внести в полигоне прямо через редактор полигона какие-то изменения в решение, а потом внести другие изменения в файле решения, сохраненном у меня на на компе, залить этот файл в полигон — и тем самым затереть изменения, которые были в полигоне. Аналогично, я могу случайно скачать файл себе на комп и тем самым затереть те изменения, которые были на компе. Никакая система контроля версий такого не позволит никогда. У меня нет простого способа убедиться, что у меня на компе последняя версия задачи, кроме как скачав полностью package, — но package никак не подходит для разработки задачи.
Может быть, я забыл что-то еще, но и это, на мой взгляд, достаточно серьезные недостатки.
Конечно, у полигона есть и достоинства. В первую очередь полигон удобнее для тех, кто первый раз в жизни делает задачи, да и вообще не имеет большого опыта разработки программных продуктов (т.е. не знает, что такое системы контроля версий, не хочет писать скрипты и т.п.) Как говорил в свое время Виталий Гольдштейн, "я могу взять десять школьных учителей, показать им куда что тыкать, и они создадут более-менее нормальные задачи". Это, безусловно, плюс, но, мне кажется, он не относится к нашей ситуации, все-таки у нас люди, которые имеют необходимый опыт.
Полигон также хорош тем, что позволяет проверять задачу и не позволяет чего-то забыть. Но наш daysper, например, делает фактически то же — только не проверяет неправильные решения, но это, имхо, уже мелочи. При этом я не настаиваю уж совсем на daysper, можно использовать t.sh/t.py от Олега Давыдова, или Makefile от Паши Кунявского и т.п.
В обсуждении у нас всплыла еще одна проблема — email-оповещения. ИМХО, при подготовке серьезного контеста высылать какую-либо конфиденциальную информацию на email — это очень небезопасно. У нас на почту высылались лишь сообщения вида "pkalinin has commited a changeset", а уж что именно там закоммичено — надо лезть в svn или в trac и там смотреть. Как мне объяснили, полигон высылает на почту очень подробные логи изменений. Это плохо; причем риск в первую очередь даже не в том, что какие-то умные школьники взломают мою почту, а в том, что я теперь должен намного внимательнее следить за своей почтой. Например, я на занятиях со школьниками залогиниваюсь в почту и иногда оставляю компьютер с открытым gmail без присмотра. Пока у меня там нет конфиденциальной информации, я не вижу в этом ничего плохого. Но если там будут материалы олимпиады, то школьник может специально, а еще более вероятно — случайно — что-то заметить.
Еще, кстати, подумал вот о каких проблемах (все, что написано выше и что я пишу ниже — это скорее мои предположения, у меня нет большого опыта работы в полигоне).
Вот принято считать, что первые тесты должны быть тестами из условия. Но это осмысленно на олимпиадах, на которых участники могут получать фидбек в процессе тура (ACM, токены и т.п.) На классической школьной олимпиаде, когда тестирование происходит после тура, нет большого смысла ставить тесты из условия первыми (более того, это даже не стоит делать — зачем объяснять школьникам и их учителям, что вот эти тесты стоят ноль баллов, потому что это тесты из условия?). Но при этом надо иметь возможность сделать отдельный package по задаче, который будет включать только тесты из условия — чтобы тестировать на них во время тура. Это возможно сделать?
Еще проблема. Подготовка олимпиады — это не только подготовка задач. Например, есть разные файлы, которые хочется версионировать, но которые не относятся к какой-либо конкретной задаче — например, памятка участника, инструкции для жюри, списки участников и т.д. Если у меня задачи лежат под свн или другой системой контроля версий, то я рядом делаю каталог, где храню все такие файлы. В полигон же такие файлы не поподают в принципе. Аналогично, например, надо иметь список рассылки для жюри, хорошо бы иметь какую-нибудь а-ля вики-систему для хранения текущей информации. Если задачи хранятся в свн, то есть много систем, позволяющих интегрировать и свн, и списки рассылки, и вики — например, trac. Если работать в полигоне, то появляются костыли типа табличек в гуглодоках.
Наконец, третья проблема. Что произойдет, если по каким-то причинам в полигоне пропадут все данные? С Codeforces такое уже было, да и понятно, что 100% гарантии не даст ни один сервис. Но если я использую svn, то потеря данных на сервере мне не очень страшна — у меня останется рабочая копия, с которой можно прекрасно работать, которую я могу закоммитить на новый сервер, или на старый, если на нем восстановят работу. Пропадет только история, что не очень страшно. Если я использую распределенную систему контроля версий, то тем более потеря данных на сервере мне не страшна. В полигоне же если данные на сервере потеряются, то лучшее, что у меня останется — это скачанный package и всякие рабочие файлы, разбросанные по моему компу. Это никак не приспособлено для дальнейшей разработки задачи. Даже если полигон оперативно восстановят, я не смогу легко все это импортировать обратно, т.к. в полигоне нет никаких средств автоматического испорта задач, пусть даже своих собственных package'й. В результате, при потере данных в полигоне я буду вынужден потратить кучу времени чтобы восстановить возможность работы с задачами.
Интересно, когда уже у кого нибудь (или у группы людей) сдадут нервы и они напишут свой "Полигон 2.0" с ...
.
Пробовали, да и продолжают пробовать, насколько я понимаю, но (по моему ощущению) не хватает энтузиазма. Я расскажу про то, как это выглядит с моей стороны.
Я вот, например, в 2009-10 году пилил daysper (wiki, во многом устаревшая) (начинали мы с Олегом Бурундуком, но продолжал я в одиночку фактически). В принципе, система вполне себе рабочая, я ее неоднократно использовал в ЛКШ (Саша Тимин даже давал очень восторженные отзывы о ней), но других людей уговорить перейти на нее я не сумел, и разработка загнулась.
В ЛКШ.Зима в 2010-11 (если не ошибаюсь) году собралась довольно представительная група людей и в который раз решили, что надо бы разработать систему с нуля. Выбрали название — please, обсудили основы "чего мы хотим", договорились работать... Где-то через несколько месяцев, обнаружив, что последние несколько десятков коммитов — только мои, без какого-либо фидбека и тем более участия от остальных разработчиков, я решил забить. Хотя система уже имела минимальный функционал для создавания задач.
Please потом был реинкарнирован с нуля (осталось только название и язык программирования) в параллели П в ЛКШ, но в итоге тоже не обрел популярности.
Это все, конечно, утилиты командной строки (у второго please потом еще был и web-интерфейс), но это и логично, если мы хотим сохранить работу в svn.
Насколько я понимаю, разрабатывается и еще куча подобных систем (t.py от Олега Бурундука, Makefile от Паши Кунявского; наверное, мои сведения устарели), но все пилят свои системы вместо того, чтобы объединиться и сделать что-то общее.
Мое личное мнение, что, конечно, стоило бы разработать единую систему командной строки, но это возможно делать только большой командой заинтересованных людей (и потому ничего из вышеперечисленных большого распространения не получило), а такой заинтересованности почему-то нет...
У вас не остались какие нить заметки по поводу требований к системе, которые выдвигались во время обсуждений?
Про daysper — фактически, вики и содержит нечто подобное.
По старому плизу можно откопать в истории репозитория, вот, например: https://code.google.com/p/please/source/browse/?r=126#svn%2Fwiki (ревизия 126 — это, я так понимаю, последняя ревизия старого плиза)
По новому плизу — я не специалист.
А еще к старому плизу вот: https://code.google.com/p/please/source/browse/trunk/miscellaneous/meow.txt?r=126
11 — Polygon is awesome!
I've been the ACM Arab regional contest chief judge for three years, and Polygon saved a lot of time and effort while preparing the problems.
Thanks a lot MikeMirzayanov!
Is there a tutorial about the API?? I couldn't manage to find it.
I tried to find it once again, but I couldn't. What parameters should I give to the link? And, are there more APIs that I can use?
Hi, I was wondering: is Polygon server sourcecode open? If not, why? I think that opensourcing it would be a huge boost to development.
Not sure this is the best place to write this, but I couldn't find a bug/issue tracker for Polygon.
How can I include testcases in the problem statement that contain '#', i.e. a sharp? When trying to generate a PDF file, the LaTeX process throws an error. In the statement itself I can escape it writing '\#' (while still rendering fine in HTML), but not in the testcase data.
you may want custom input/output for that
I'm not sure I understand your suggestion. If you mean to add a testcase not generated by a script: I tried that, but generating the PDF still failed.
I think this could be fixed by modifying the LaTeX templates:
olymp.sty
already provides a command\exmpfile
instead of the\exmp
used in the defaultproblem.tex
. That command uses a verbatim environment to include the testcase as file. However, I don't know what to replace${test.input}
with to reference the testcase file, instead of its contents.I mean you may go to setting of specific test, there will be an option to use custom input/output.
Want another Christmas tree :3
want another Christmas tree :3
А есть ли возможность добавить в полигон готовую pdf-ку с условием?
Только начал пользоваться Полигоном. Я создал несколько тестсетов,а как добавить их на кф не понятно(( решения тестируются только на стандартном наборе (tests). Скажите, пожалуйста, где и как можно "включить" остальные тестсеты?
Спасибо:)
Добрый день. Никак, они нужны для других моделей тестирования. Просто добавьте все ваши тесты в тестсет tests.
спасибо! я так и сделал, но надеялся на существование более изящного решения:)
У меня есть ряд вопросов по polygon. 1) Во вкладке Package я нажимаю "Create package", вижу вердикт "PackageException: Got exception while generating tests." Нельзя никак поподробнее узнать, какой конкретно exception и на каком конкретно тесте это произошло? Или надо вообще все тесты руками перебирать, думать, где может быть проблема?
2) Написал валидатор http://pastebin.com/bmyAgh0a Написал генератор тестов http://pastebin.com/HPP0dCGN Но когда во вкладке "Tests" я пишу скрипт <#list 1..30 as item> generator {item} > </#list>
То добавляются тесты, которые не проходят ограничения, не соответствуют валидатору. Так разве должно быть? Я думал, тест генерится, потом проверяется валидатором, а только потом, если все хорошо, то добавляется. Видимо, это как-то по-другому делается. Расскажите, пожалуйста.
3) Не пойму, что с рандомом. Вот я пытался в генераторе проверять, что тест подходит под условия (см. пункт 2) http://pastebin.com/KrvVaUpA Почему-то размеры массивов A и B всегда в диапазоне 57-61 и никакие другие. Прямо вообще никогда маленькие числа рандом не возвращает. Как-то это очень подозрительно, как бы не баг. Или я не так обращаюсь к нему?
4) Как добавить сэмплы? Нигде не нашел. А то у меня в итоге получилось условие задачи совсем без примеров (я это увидел, когда добавил задачу в мэшап)
Нажми preview tests и увидишь, какие тесты сгенерились, а какие упали из-за валидатора.
Работает именно так, как ты описал, т.е. тест добавляется в любом случае, а потом проверяется. Не надо генерировать некорректные тесты.
Рандом надо инициализировать, по умолчанию он инициализируется аргументами командной строки, если запускать просто как gen.exe > test.txt то аргументы всегда будут одинаковые и результат всегда будет одинаковый. А когда генерируешь тест на полигоне, пишешь например "gen 10 > 1", "gen 100 > 2" — т.е. в первый раз запустится с аргументами "gen 10" и запишется в первый тест, а во второй раз с аргументами "gen 100" и запишется во второй тест, т.к. аргументы разные, рандом тоже будет разный.
Напротив теста есть кнопка Edit, там есть галочка use in statements.
Спасибо dalex, pitfall, elena.
С 1, 3, 4 все ясно. Не пойму только по 2 пункту. Вот ты пишешь "не надо генерировать некорректные тесты". Генератор должен выдавать только валидные тесты? То есть в коде генератора мне надо как бы использовать еще и валидатор сразу? Я могу тогда просто взять и засунуть в генератор целиком код валидатора в виде отдельной функции. И потом в бесконечном цикле генерировать тесты, пока не найду валидный. Это так что ли делается?
Нет, надо просто сразу генерить валидный тест, в чем проблема то?
Т.е. если у тебя инпут — целое число от 1 до 1000, то пишешь не так:
а вот так:
Ну бывает же, что я не могу сразу строить, допустим, граф, который требуется по условию. Например, какой-нибудь граф, в котором ровно 3 цикла, только 2 из которых имеют общую вершину. Или еще сложнее какие-нибудь условия. Я не знаю, как построить такой тест. Но я могу сгенерить случайный и проверить его на правильность.
Задачи такие придумывать не надо.
(Могу что-то путать) Можно функцию проверки того, что граф удовлетворяет условию запихнуть в библиотеку, которую добавить в Files (тогда она будет видна и валидатору, и генератору, если в коде эту библиотек у подключить, конечно).
2) Валидатор используется в инвокейшенах, стрессах, при валидации пэкэджа
3) Вы обращаетесь правильно, однако неправильно предполагаете, что размеры массивов будут маленькие. Рассмотрим битовое представление сгенерированного числа (будем генерировать числа от 1 до 2^61 для наглядности), а если точнее, то на старший разряд. В нем будет единичка с вероятностью 1/2, а если в нем единичка, то значит, что длина битового представления будет 61, вероятность что будет 60 — 1/4, вероятность, что 59 — 1/8, и тд. Просто вы ошибочно предположили, что длина битового представления чисел равновероятна.
4) Нажмите напротив теста edit, и на страничке редактирования нажмите галочку Use in statements
Polygon can be tricky at first glance but after some testing it is surprisingly simple and helpful. All I needed was just an afternoon and a cup of coffee to get a grasp on it.
I hope the platform gets more recognitions in the future.