Что это такое
Контест — набор алгоритмических задач с тестами, как на Яндекс.Контесте или Codeforces. У каждой задачи есть условие, примеры и ограничения по времени и памяти. Участник пишет решение на Python, C или C++ прямо на странице задачи (или перетаскивает файл), нажимает «ОТПРАВИТЬ» — и через секунды видит вердикт: OK, WA, TL, ML, RE, OL или CE вместе с номером первого непройденного теста.
Контесты живут в разделе «Контесты» панели, рядом с соревнованиями. Соревнование проверяет одну тетрадь метрикой; контест гоняет много маленьких программ по многим тестам. Участник у них общий: тот же ключ входа, тот же список /k.
| Вердикт | Что значит |
|---|---|
OK — Принято | Все тесты пройдены. |
WA — Неправильный ответ | Вывод не совпал с ответом. |
TL — Превышено время | Процессорное время на тесте больше предела — или программа ждала дольше двух пределов по часам. |
ML — Превышена память | Пиковая память больше предела. |
RE — Ошибка выполнения | Программа завершилась с ненулевым кодом или по сигналу. |
OL — Слишком большой вывод | Больше 64 МБ вывода на тест. |
CE — Ошибка компиляции | Код не скомпилировался (у Python — синтаксическая ошибка). Попыткой не считается. |
SE — Ошибка проверки | Сломалась сама проверка — например, ваш чекер. Участнику ничего не стоит; посылку можно перепроверить. |
Заведите контест
- В панели откройте «Контесты» и нажмите «НОВЫЙ КОНТЕСТ». Дайте название и адрес — по ссылке
/a/<адрес>класс откроет контест. - В разделе «Основное» напишите строку для списка и вступление: правила пары, чем можно пользоваться. Вступление — Markdown с формулами
$…$. - Добавьте задачи («+ новая задача»). Порядок задач — это их буквы A, B, C…; строку можно перетащить.
- Выберите правила подсчёта, сроки и языки (ниже о каждом).
- Когда эталон каждой задачи проходит все её тесты, нажмите «ОТКРЫТЬ КОНТЕСТ». Пока что-то мешает, кнопка объясняет, что именно.
Кнопка «Посмотреть глазами участника» открывает страницу контеста так, как её увидит класс, — даже у черновика.
Задача: условие и ограничения
В редакторе задачи — условие в Markdown (формулы в $…$), ограничение времени на тест и ограничение памяти. Время — процессорное: Python получает те же секунды, что и C++, поэтому, если задача про асимптотику, проверьте эталон на Python. Примеры в условие переписывать не нужно — участник видит под условием тесты, отмеченные «пример», с кнопкой «копировать».
Как сравнивать вывод с ответом:
- «по словам» — слова через любые пробелы и переводы строк; так проверяет большинство задач;
- «построчно» — строки целиком, без хвостовых пробелов и пустых строк в конце;
- «числа с точностью» — по словам, а числа совпадают, если разница не больше заданной (абсолютной или относительной);
- «свой чекер на Python» — когда верных ответов несколько. Напишите функцию:
def check(input: str, output: str, answer: str) -> bool:
# input — тест, output — вывод участника, answer — ваш ответ
...Вернуть можно True/False или пару (False, 'пояснение') — пояснение видите вы, а на примерах и участник. Исключение в чекере — это ошибка проверки (SE), а не проигрыш участника.
Тесты
«Загрузить архив» принимает .zip в привычных раскладках, их не нужно перекладывать:
| Раскладка | Пример |
|---|---|
| Polygon, Яндекс.Контест | tests/01 и tests/01.a |
| in/out | 1.in и 1.out (или .ans, .a) |
| папки | input/input1.txt и output/output1.txt |
Порядок тестов — по номерам в именах. Тест можно добавить и вручную («+ тест вручную»), отметить примером, удалить. Ответы загружать не обязательно: «Ответы из эталона» прогонит эталон на тестах без ответа и запишет то, что он вывел.
Изменили тесты, когда посылки уже есть? В пульте нажмите «Перепроверить задачу…» — посылки пройдут проверку на новых тестах, и лидерборд пересчитается.
Эталонное решение
Эталон — ваше решение задачи. Он проверяется ровно как посылка, на тех же пределах, и показывает самый долгий тест и пиковую память: видно, какой запас вы оставили участникам. Пока эталон не прошёл все тесты текущей версии, контест не открыть — задача, которую не решает даже автор, — это класс, безуспешно ищущий ошибку у себя. Участникам эталон не показывается.
Правила подсчёта
ICPC — для контрольной на время. Задача либо решена, либо нет. Место — по числу решённых задач, затем по штрафу: минуты от начала до каждого «принято» плюс штраф за каждую неверную попытку до него (по умолчанию 20 минут). Ошибка компиляции попыткой не считается; посылки после «принято» проверяются, но на место уже не влияют.
IOI — для домашней работы. Задача стоит 100 баллов. Режим «поровну за тесты» делит баллы между тестами, кроме примеров; режим «по группам» даёт баллы группе, только если пройдены все её тесты. По каждой задаче идёт лучшая посылка, место — по сумме.
Места на лидерборде всегда разные: при равенстве выше тот, кто раньше получил последнее «принято» (IOI — раньше набрал свою сумму).
«Попыток на задачу» ограничивает число посылок по одной задаче; ошибки компиляции и ошибки проверки лимит не тратят.
Заморозка и разморозка
Заморозка — традиция ICPC: за заданное число минут до конца лидерборд перестаёт показывать чужие новые результаты. Каждый по-прежнему видит свои вердикты, а чужие попытки после заморозки выглядят как «?» с числом попыток. Таблица остаётся замороженной и после конца, пока вы не нажмёте «Разморозить» — так итоги можно открыть на разборе, всем классом.
Сроки и дорешивание
Начало и конец задаются в часовом поясе инстанса. До начала участник видит обратный отсчёт и не видит задач. После конца приём закрывается — если не включено «Дорешивание после конца»: тогда посылки принимаются и проверяются, но в лидерборд не идут. «Продлить» в пульте сдвигает конец; «Завершить сейчас» закрывает приём сразу.
Языки
Python 3, C++20 (g++ -std=gnu++20 -O2) и C17 (gcc -std=gnu17 -O2 -lm). Компиляторы берутся из окружения контеста — того же образа, что у ядер занятий; редактор показывает версии. Если в образе окружения нет компилятора, язык помечен недоступным.
Как проверяется посылка
На посылку — один одноразовый контейнер без сети, с корнем только на чтение и пределом процессов. Внутри проверяющий процесс компилирует решение и запускает его на каждом тесте от непривилегированного пользователя: со своим пределом процессорного времени, памяти, размера вывода и стека, с одним ядром. ICPC останавливается на первом непройденном тесте, IOI проходит все тесты, пропуская остаток группы после ошибки. Участник видит ход проверки вживую — «тест 7 из 22».
Очередь одна на инстанс и переживает перезапуск сервера. Ваши прогоны эталона идут первыми, дальше посылки по времени, и у одного участника проверяется не больше одной посылки за раз. Сколько посылок проверяется одновременно, видно и настраивается на полосе «ПРОВЕРКА» над списком контестов; там же проверку можно приостановить.
Лидерборд и проектор
Лидерборд ICPC показывает в клетке «+» или «+2» с минутами решения, неудачные попытки — «−3», первое решение задачи — залитой клеткой, а внизу — сколько человек решили задачу и сколько было попыток. У IOI в клетке баллы. Участник может переключиться на «Рядом со мной». Почты на чужих строках сокращаются, как в соревнованиях; «только участники» прячет таблицу от всех, кроме участников контеста.
«Показать на экране» в пульте открывает тёмный вид для проектора с крупными строками и обратным отсчётом — его удобно держать на экране всю пару. «Скачать CSV» выгружает лидерборд для ведомости.
Пульт идущего контеста
У открытого контеста вместо редактора — пульт: лента посылок с фильтрами по задаче, вердикту и участнику; по клику справа открывается разбор — код, вердикт и таблица тестов с временем и памятью, а для непройденного теста вывод программы рядом с ответом (скрытые тесты видите только вы). «Перепроверить» ставит посылку в очередь заново. Вкладки «Лидерборд» (без заморозки), «Вопросы», «Задачи», «Участники» и «Настройки».
Вопросы и объявления
На вкладке «Вопросы» участник спрашивает по задаче или в целом. Вы отвечаете «Ответить лично» — ответ увидит только он — или «Ответить всем»: вопрос с ответом станет объявлением для всех. Объявление можно написать и без вопроса. Непрочитанные ответы отмечены точкой на вкладке.
Участники
Участник контеста — тот же, что у соревнований: логин Telegram или почта как имя и ключ входа вида K7Q-M2X-9FD. Кто уже входил в соревнования, сразу вошёл и в контесты. Вступить можно заранее и пока контест идёт; посылки без вступления не принимаются. Убрать человека из контеста можно на вкладке «Участники»: его посылки и строка в таблице уйдут вместе с ним.