panprog's blog

By panprog, 3 years ago, In Russian

В нашем регионе с прошлого года решили проводить муниципальный этап всероссийской олимпиады школьников по информатике на базе Codeforces. Я занимался технической подготовкой тестирующей системы. К моему удивлению, несмотря на то, что это официально рекомендуемая система для проведения муниципального этапа, я нигде не нашел нормальной документации по всему процессу.

Поэтому публикую этот пост для облегчения жизни тех, кто также захочет организовать любую олимпиаду на базе Codeforces, не обязательно муниципальную. Для муниципальной олимпиады специального процесса нет, она создаётся точно также как любой другой контест.

Что нужно до начала олимпиады

Для технической части проведения олимпиады на базе Codeforces понадобится:

  • Комплект задач — условия, тесты, программы проверки (т.е. чекеры, если отличаются от стандартных), желательно валидаторы (проверка корректности тестов и их соответствия условию задачи)

  • Дата, время и продолжительность олимпиады

  • Список участников олимпиады

  • Список организаторов (которые будут иметь доступ к результатам во время и после окончания олимпиады)

  • Аккаунт на сайте codeforces.com, для которого необходимо активировать возможность создания контестов (Мэшапов) — эта возможность есть у участников с "красным" рейтингом, или можно попросить администраторов Codeforces (MikeMirzayanov)

  • Аккаунт на сайте polygon.codeforces.com (это не тот же самый аккаунт что на Codeforces).

Сам процесс создания контекста разбивается на три этапа:

  • Подготовка задач

  • Создание контеста (списка задач и настроек олимпиады)

  • Создание группы (списка участников с логинами и паролями)

Подготовка задач

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

Свои задачи создаются в системе Polygon. Для её использования надо на сайте https://polygon.codeforces.com/ зарегистрировать аккаунт (который отличается от аккаунта на сайте codeforces.com и никак с ним не связан). После регистрации в аккаунт автоматически добавляется несколько примеров простых задач, чтобы посмотреть настройки задач, если что-то непонятно.

Для добавления новой задачи в Polygon необходимо нажать New Problem в верхнем меню навигации. В название нужно ввести название задачи в том виде, в котором оно будет показываться в url, например a-plus-b или bus-stations. Названия разных задач могут совпадать, помимо названия им все равно назначается идентификатор, по которому они и отличаются. После создания задачи она появляется в списке задач как новая. Для продолжения нужно нажать Start в колонке Working Copy этой задачи, после чего открываются настройки задачи: входной и выходной файлы (по умолчанию — стандартные входные-выходные, т.е. чтение с клавиатуры, запись на экран), лимит времени и памяти при выполнение каждого теста, возможность интерактивных задач (т.е. задач, в которых программа участника взаимодействует с программой организаторов, в муниципальных олимпиадах такое я не видел). Изменив при необходимости эти данные (и нажав Save), можно переходить к тексту (условию) задачи. Вся навигация по настройкам задачи — сверху (Statements) или справа (Statements: None, нажать на None).

Текст задачи не является обязательным. Вполне возможна ситуация, когда тексты раздаются в бумажном виде, а в тестирующей системе доступна только посылка решений. Более того, бывает такое, что условия членам Жюри недоступны до начала олимпиады (доступны только тесты). Но тем не менее, если условия всё таки доступны, то удобно, если участники смогут иметь доступ к тексту задачи не только в бумажном виде, но и в самой тестирующей системе. Правда, для этого придётся приводить текст в соответствие с требованиями Polygon.

После перехода в страницу добавления текстов задачи нужно будет выбрать язык, на котором написан текст (можно добавлять условия на разных языках), и нажать Create, чтобы создать текст на этом языке. В дальнейшем можно будет редактировать тексты уже добавленных языков или создать текст на новом языке (Create New). Удобнее всего для участников, когда решения доступны непосредственно в формате html. В этом случае нужно писать условия в урезанном TeX формате, более подробно про это есть ссылка из условий: короткое руководство.

В поле Name вводится название задачи (например, "Сумма двух чисел"), в Legend — основная часть текста задачи, в Input Format — формат входных данных, в Output Format — формат выходных данных. Ограничения входных данных можно описать в Input Format или в отдельном поле Notes. Тесты, которые должны быть в условии задачи, будут показаны в условии автоматически после настройки тестов. Просмотреть, как условие будет видно участником, можно нажав на ссылку "In HTML".

Дальше необходимо добавить тесты, программы проверки решения (чекеры), проверки тестов (валидаторы) и авторские решения задачи.

Тесты добавляются на странице "Tests" (переход в навигации вверху или справа). По умолчанию для тестов стоит режим ICPC — т.е. без баллов. Чтобы за тесты давались баллы, надо на этой странице поставить галочку Enable points. Если баллы считаются по более сложной системе, как на Региональных олимпиадах и выше, по группам, которые оцениваются по разному и зависят от решения других групп тестов, то настроить эти зависимости можно поставив галочку в пункте "Enable groups". Сами файлы тестов можно добавить нажав "Add Test". Со страницы добавления теста можно добавлять тесты по одному, вручную вводя входные данные в текстовое поле, или закачать архив со всеми тестами. При добавлении архива желательно называть тесты 01, 02 и т.п. так, чтобы сортировка по имени давала правильный порядок тестов. Если тесты названы 1, 2, 3, ..., 10, 11..., то порядок собьется, т.к. порядок по алфавиту будет 1, 10, 11, 2, 3, ... После добавлении архива появляется список всех тестов. Необходимо выбрать, какие тесты будут присутствовать в условии задачи (за них, соответственно, будет 0 баллов, и на них решение участника будет тестироваться предварительно, на всех остальных тестах только если пройдут тесты из условия). Для этого надо или нажать кнпоку Example на нужных тестах, или справа выбрать галочками все тесты, которые нужно добавить в условие задачи, и нажать сверху Example для применения этой настройки для всех выделенных тестов. В появившемся окошке выбрать Use in statements: Yes и Update Examples. Аналогично назначаются баллы за тесты — выбирается набор тестов с одинаковым количеством баллов, нажимается Points вверху в заголовке таблицы и вводится количество баллов за каждый тест.

Программы проверки решения выбираются в разделе Checker. Здесь можно указать одну из стандартных программ сравнения ответа участника с эталонным ответом (сравнение 1 или больше целых чисел, сравнение строк, сравнение 1 или больше вещественных чисел и т.п.), или же закачать собственную программу проверки. Программа проверки должна использовать стандартный модуль для проверяющих программ testlib. Во всех современных олимпиадах обычно присутствуют программы проверки с использованием именно этого модуля. Более подробное описание чекеров здесь.

Программа проверки тестов выбирается в разделе Validator. Эта программа не является обязательной, однако её наличие позволяет удостовериться в том, что в тестах соблюдаются ограничения, указанные в условии задачи, и что тесты сформированы правильно (нет лишних переводов строк, есть нужные переводы строк, нет ненужных пробелов в конце строки и т.п.). С этой страницы есть ссылка на более подробное описание валидаторов.

Авторские решения задачи выбирается в разделе Solutions. Должно быть хотя бы одно правильное авторское решение задачи, т.к. на его основе создаются файлы ответов на тесты, с которыми сверяются решения участников. Файлы ответов нельзя закачать отдельно, они только создаются на основе авторского решения. На этой страничке можно закачивать файлы решений и выбирать среди них основное решение. Кроме того тут могут быть разные варианты решений и/или частичные решения для проверки прохождения тестов такими решениями.

Проверка тестов и решения выполняется в разделе Invocations. По ссылке "Want to run solutions?" можно выбрать одно из авторских решений для проверки, набор тестов для проверки (желательно выбрать все тесты), и запустить проверку. Через некоторое время можно посмотреть результаты проверки, при этом все тесты проверяются и валидатором (корректность теста), и запуском авторского решения. Результат выполнения будет сравниваться с решением выбранного основного авторского решения. Если есть какие-то ошибки, то необходимо их исправить (перезакачать тесты или решения) прежде чем переходить к следующему шагу.

Когда все условия, тесты, проверяющие программы, авторские решения закачаны и проверены, необходимо сформировать пакет для использования в контесте. Также нужно дать доступ системе Codeforces к этой задаче для использования её в олимпиаде. В разделе Manage access нужно добавить доступ для чтения пользователю Codeforces, иначе эта задача не будет видна из системы контестов Codeforces. Далее необходимо сохранить все изменения в системе, для этого в самом конце страницы в правой панели управления есть ссылка "Commit changes", нажав её и подтвердил сохранение — текущая рабочая копия сохранится как очередная версия задачи. После этого можно создавать пакет для задачи, в разделе Packages. create Standard package. Через некоторое время (обычно несколько минут) пакет будет доступен для скачивания. С этого момента задачу можно добавлять в состав олимпиад созданных на базе Codeforces.

Необходимо таким образом добавить все задачи олимпиады в систему Polygon.

Создание контеста

Созданные пользователями соревнования в Codeforces называются Мэшапы. Для доступа к ним необходимо зайти в свой аккаунт на сайте codeforces.com (НЕ polygon), в разделе Тренировки — Мэшапы. Этого раздела у вас не будет, если у вас эта возможность не активирована. Попросите администраторов Codeforces (MikeMirzayanov), чтобы они активировали для вас Мэшапы. Со страницы Мэшапов можно создать новый мэшап.

На странице создания Мэшапов необходимо ввести название олимпиады (например, "Муниципальная олимпиада по информатике 2021") и длительность в минутах (эти параметры можно будет позже при желании изменить). Кроме того здесь же можно создать Мэшап на основе уже созданного Мэшапа (например, можно не теряя результатов основной олимпиады создать такой же Мэшап для дорешивания задач). На этой же странице можно указать задачи, которые будут использоваться в олимпиаде. Для того, чтобы вставить задачи, созданные в системе Polygon, необходимо в Polygon открыть нужную задачу и в самом низу правой панели найти ссылку с url задачи (над ссылкой Commit Changes). Нажатие на ссылку копирует её в буффер обмена. Далее надо вставить ссылку в поле ввода названия задачи в списке задач Мэшапа и нажать плюс — задача добавится в Мэшап (url задачи должен замениться на её название). Таким образом необходимо добавить все задачи олимпиады, после чего нажать "Создать Мэшап". Новый Мэшап добавится к списку соревнований, после чего надо зайти в него (нажать ссылку "войти" в соревновании).

Задачам по умолчанию назначаются "короткие" имена: A, B, C, D, ... Если нужны другие обозначения (например, 1, 2, 3, 4,...), то можно поменять эти короткие названия, нажав значок редактирования в заголовке задач, или значок редактирования для конкретной задачи. При входе в редактирование задачи можно также указать ограничения по времени и памяти на каждый тест, если они отличаются от стандартных (заданных для задачи в Polygon).

По умолчанию созданному соревнованию назначается формат ICPC (без баллов). Для того чтобы включить режим IOI (с баллами), необходимо перейти на страницу Ред. (во второй строке навигации вверху страницы), где можно выбрать формат соревнования. Здесь же можно задать время начала соревнования, уровень доступа, возможность дорешивания, заморозку монитора, если необходимо и различные другие опции. Для муниципальной олимпиады обычно нужно отключить дорешивание, виртуальное участие, саморегистрацию, не разрешать видить ход соревнования незарегистрированным, общий статус (иначе все участники будут видеть результаты всех остальных участников в реальном времени), ранклист (чтобы участники не могли видеть своё место).

Создание группы

Группа нужна, чтобы создать список участников и разрешить им доступ к набору соревнований (мэшапов). Группа может просто иметь участников (зарегистрированных пользователей Codeforces) и использоваться для того, чтобы дать пользователям доступ к соревнованию. Однако для олимпиад типа муниципальной нужно, чтобы пользователи сами не регистрировались, а выдавать им логины-пароли конкретно на одну олимпиаду. Для этого в Codeforces есть специальные группы, которым можно назначить ещё и собственный домен 3-го уровня.

Для создания группы надо зайти в раздел "Группы", выбрать "Создать группу", ввести название группы на русском (например, "Муниципальная олимпиада по информатике 2021"), видимость "закрытая", политика регистрации зрителей и участников "по приглашению", нажать "Создать". После этого нажать на "Адм." для редактирования группы, и в окне редактирования к тем полям что были при создании добавятся еще поля html заголовка и домена группы. Нужно ввести какой-либо домен: например, exampleolymp2021, тогда контесты вашей группы будут доступны по ссылке https://exampleolymp2021.contest.codeforces.com/

Также можно установить заголовок страницы (иначе там будет логотип Codeforces), например:

<h3>Всероссийская олимпиада по информатике 2020/2021 учебного года<br /> Муниципальный этап, г. Орёл</h3>

И можно установить язык интерфейса — русский. Сохранить изменения. По ссылке можно узнать больше о доменах для групп.

Дальше необходимо добавить контексты, в которых смогут принимать участие участники группы. Для этого надо узнать ID созданного Мэшапа. Для этого надо зайти в свой созданный Мэшап и посмотреть его ссылку, она будет вида https://codeforces.com/gym/123456 — вот 123456 это и есть ID Мэшапа. Далее в группе нужно зайти в Соревнования, добавить соревнование, ввести ID Мэшапа, подтвердить что скрытый контест будет виден участникам группы.

Теперь необходимо внести всех участников в состав группы, сгенерировав для них логины и пароли. Для этого нужно перейти в раздел "Состав", и в правой панели управления нажать кнопку "Пользователи домена". В появившемся текстовом окне нужно внести на каждой строчке информацию о каждом участнике в виде:

123456 | login1 | password1 | Иванов Иван Иванович, 9 класс

123456 | login2 | password2 | Петров Пётр Петрович, 10 класс

Первое число — это ID мэшапов, к которым имеет доступ этот участник (можно перечислить через запятую несколько ID). Удобно такой текстовый файл с логинами генерировать какими нибудь несложными программами по списку участников, но можно и вручную всё ввести. В списке участников также могут быть логины для Жюри. После сохранения — появляется список участников, в котором можно менять "Тип участия" (участник или менеджер). Если поставить Менеджер, то под этим логином можно будет просматривать результаты соревнования, попыток участников, отвечать на вопросы участников, менять время или продолжительность тура и т.п.

По кнопке "Печать паролей" можно получить страницу с логинами-паролями всех участников для распечатки. Удобно для раздачи этих данных участникам. Логины и пароли можно раздавать участникам заранее, вместе с URL, куда им нужно зайти для участия в олимпиаде. До начала олимпиады они будут видеть только название олимпиады и время когда она начнётся.

На этом подготовка контеста завершена. В установленное в Мэшапе время для залогиненых участников олимпиады станет доступна кнопка "Войти", после чего они смогут войти в соревнование, получить доступ к задачам и посылке решений. Менеджеры контеста смогут наблюдать за ходом олимпиады, отвечать на вопросы участников и смотреть результаты в реальном времени. По каждому участнику можно будет смотреть сделанные ими попытки решений, исходный код всех попыток, а также протоколы тестирования. Кроме того доступна выгрузка решений участников единым архивом, а также выгрузка лога тестирования, на основании которого можно, например, создавать собственные протоколы тестирования. Протоколы тестирования также можно создавать, используя API сайта Codeforces, через которое можно получить текущее количество баллов по всем задачам по всем участникам. Протоколы тестирования есть и в самом Codeforces, но их вид настроить нельзя и в нашем регионе такие протоколы совершенно не подходили к нашим требованиям по протоколам. Тем не менее через API получилось сделать простой генератор протоколов в реальном времени без дополнительных ручных действий (но это выходит за рамки этого поста).

Рекомендую для начала создать контест Пробного тура с парочкой простых задач, проверить как всё работает, а потом провести пробный тур для всех участников основного тура, чтобы участники ознакомились с тестирующей системой и со всеми процессом посылки решений через неё.

  • Vote: I like it
  • +48
  • Vote: I do not like it