Олимпиады по программированию, взгляд из НГУ. Статья 4 — как проходит тур
Продолжение погружения в мир спортивного программирования уже на ваших экранах. Теперь будет самая вкуснятина. Раньше я ходил вокруг да около, теперь же пора взяться за самую суть. Посмотрим, как проходит какой-нибудь из туров, что длится в эти 5 часов азарта и креатива. Сегодня будет много всего весёлого.
Для тех, кому эта статья будет первой из цикла:
Первая статья — про составление задач.
Вторая статья — про тестирующие системы.
Третья статья — про работу оргкомитета.
Тур Всесиба обычно начинается с пробного тура. Обычные две задачи, уже несколько лет бессменные в этом качестве — сумма чисел и Crazy Jury. Делается это ровно для того, чтобы команды привыкли к месту, к настройкам софта и всего такого. Некоторые команды очень радуются и решают обмануть систему, написав вместо пробника шаблоны алгоритмов. Зря, зря. Обычно на этих олимпиадах перед самим очным туром проводится циклический сдвиг команд за компьютерами и все шаблоны остаются соперникам. Точнее — не остаются, ибо папки предусмотрительно очищаются оргкомитетом.
Также целью пробного тура является проверка работоспособности всех механизмов олимпиады. Собственно, первые пару-тройку раз на 8 Всесибе ujudge улёгся именно во время отборочника. Уже навевало не самые хорошие ощущения, но об этом потом и подробнее.
Жюри обычно собирается за полчаса-час до тура. Опять же, проговариваются все задачи и пробегаются глазами все условия на предмет ужас-ужас-ужаса. Тут самое интересное происходит, когда вопросы есть, а отвечающего на них рядом нет. Так, в последнем запуске Всесиба на исследовательской задаче возник резонный вопрос Мише Дьякову, замкнутые ли у него геометрические примитивы (условие задачи для интересующихся). Всё бы ничего, только поинтересовались у Миши этим по телефону, разумеется, разбудив его. Минут через час Миша появился в расположении жюри и под громкий смех всех членов судейской бригады описал всю свою гамму чувств в этот момент.
Минут за 15 до начала тура команды пускают за компьютеры. Уже можно набивать шаблоны, благо логин для команды постоянный на весь турнир. Минут через 10 после этого оргкомитет разносит запечатанные конверты с заданиями на этот тур. Все ждут отмашки из комнаты жюри (куда вход и даже взгляд участникам строго запрещён). Взмах клетчатым флагом — конверты рвутся, быстрые кодеры садятся быстро кодить, а у жюри начинается весёлая пора. Уже минуте на второй начинаются вопросы жюри через тестовую систему. Процентов 50 отсеиваются с комментарием «Без комментариев». Зачастую даже ответ на простой вопрос команды ставится на голосование, поскольку возможно придётся вносить поправки в условие задачи. Но бывают и весёлые моменты. Так, на одной из олимпиад (вроде бы в ВКИ) кто-то задал вопрос, необходимо ли сопровождать исходник программы комментариями. Интересно, как отреагировал участник на резонный ответ «Без комментариев» и не стал ли он убирать задокументированные куски кода. Науке это не известно. Зато науке известен весёлый ступор жюри, когда одна из команд на очном туре ну никак не знала, что такое тор и с чем его едят (а едят обычно с чаем в виде баранки). Весь мыслительный аппарат был направлен на то, как же это объяснить. Кто-то полез в вики. Кто-то начал изображать тор в пейнте. Саша Киров оказался расторопнее всех и сбегал с аналоговой бумажкой, объяснив незадачливой команде кусочек геометрии. Курганские математики никогда не теряются.
Всё хорошо, если ничего не ломается. Но ничего не ломаться просто не может. Самое хорошее, если сломалась задача. Вдруг попал некорректный тест, не отвечающий условиям, либо немного не соблюдён формат входного файла. Сначала на жюри обрушаются потоки гнева от всех команд, чьё де факто верное решение сыпется. Затем эти потоки перенаправляются человеку, отвечающему за тесты. Если всё плохо и всё сломалось, то тест убирают, а все решения отправляют на перетестирование. Командам, конечно, не очень это радостно, но все имеют право на ошибку. Так порой кто-нибудь получает сразу пять плюсов за задачу. Хорошо хоть за лишние плюсы штрафные баллы не накидываются.
А самое страшное — когда что-то происходит с тестирующей системой. Опять же вспоминается наш бедный, бедный ujudge. Система с симпатичной мордочкой, неназойливым вкраплением ajax-а и нормально продуманной архитектурой. Только с нагрузкой она не справлялась. На полуфинале школьной олимпиады, когда это возникло в первый раз, мы даже не знали, на что грешить. В тот же день вылетел центральный маршрутизатор универа и 3 команды из ФМШ, писавшие задания позже остальных команд (по сути, им было важно только количество задач, дабы пройти отбор) сдавали задания через гений технической мысли — флэшконет. Мы с Мишей настолько вошли во вкус, что в аудитории участников нарисовали на доске окошко браузера и там своевременно отображали количество сданных задач. Такая вот эмуляция сервера.
На очном туре же всё было куда печальнее. Тестер валился в нокдаун, поднимался стараниями Андрея, писавшего очередную заплатку, либо выводившего его из комы и опять укладывался спать под давлением кучи отправленных задач. Ходила даже шутка, что ujudge — уникальная система, поскольку работает на мышечной силе автора. Так вот. Помним, что клиент у нас хорошо масштабируется. У жюри в наличии целый терминальный класс, потому было поднято ещё несколько instance-ов тестера и веб-морды. С целью обезопасить компьютеры от посягательств на них были развешаны эпичные таблички «машинко тестирует» и «машинко вебсервер». Я лично, увы, их не видел.
Экстенсивный путь не дал желаемого результата. Как оказалось, балансировщик нагрузки давал сам по себе вкусную просадку производительности. Шаман перла Саша Фенстер за 5 минут накидал на коленке скрипт случайной балансировки. Стало чуть лучше, система даже минут 5 продержалась. Участники к тому времени уже закипали. Я, пользуясь наглостью и админресурсом бомбардировал знакомых из жюри в аську вопросами «акогда?» и «кагдила?», другие команды тоже не скучали. Кто-то от всей души написал в вопросы жюри незабываемое «Спасибо составу жюри за поистине феерическую производительность тестирующей системы». Татьяна Викторовна на это ничтоже сумняшись ответила «Доброе слово и кошке приятно =) » На том и решили.
В жюри тем временем продолжалось шоу. Андрей пытался поднять свою систему. Параллельно захотели попытаться поднять старую систему, но перл на сервере нашего факультета обновили, а системка за ходом времени не поспела. В итоге к ночи Миша Калугин и Алексей Романенко её запинали, но голосованием жюри была выбрана другая тестирующая система. Об этом, правда, позже. Пока творился весь этот бедлам, Андрей Лопатин в уголке на своём ноуте с флэшки развернул собственную тестирующую систему, загнал туда все тесты, проверил решения, поправил тесты и тихо-мирно сказал, что тестирующая система есть. В итоге на абсолютно форс-мажорном решении, через 3 часа после времени старта тура этот тур всё-таки начался. Ну прошёл в дальнейшем, слава богу, без таких проблем. Второй тур писался тоже на системе Лопатина.
Во время второго тура в жюри тоже мало скуки было. Лопатин, Станкевич и Гозман (каждый по уму примерно как 4 моих команды) решили поиграть во Всесиб. Сели за один ноут, с гыгыканьем и прибаутками начали решать тур. В итоге — за 1.5 часа из положенных 5 тур был взят. Решения жюри — поправлены и улучшены, а в тестах найдена пара-тройка багов. Вот она, сила ума.
Ну с тем, что проходит во время первой части тура мы разобрались. Под конец же начинается самое интересное. После 4 из 5 часов тура идёт заморозка рейтинга. Таким образом, вы можете знать лишь то, сколько решили вы сами на данный момент. Некоторые команды хитро пользуются такой фишкой, но в этом я расскажу в статье по командной игре. Если тур прошёл без задержек, то через 5 часов после начала всё заканчивается и команды идут отдыхать. Но если были заминки, жюри может добавить несколько минут к туру, которые могут стать решающими (так наша команда один раз за счёт 20 бонусных минут сумела вырвать 3 место по универу в отборочном туре, когда я в диком кипише написал придуманный за 5 минут до предварительного финиша алгоритм).
Далее обычно идёт небольшая пауза (например — на покушать) и следом за ней — разбор задач. Поначалу — неофициальный. Команды рассказывают друг другу, на каких грязных хаках они протащили своё решение и почему задача валится на 9 тесте и как бы это можно было обойти, будь они несколько умнее в детстве. А затем уже на сцену выходит великое и могучее жюри. Каждый рассказывает одну-две задачи, участники задают умные вопросы, получают не менее умные ответы. Как и должно быть, хотя иногда разговор уводит довольно далеко и дискуссию приходится прерывать.
На разборах часто тоже бывают забавные вещи. Начнём с того, что человек может выйти рассказывать не свою задачу. На Всесибе, конечно, не так, но на каком-то школьном туре (чуть ли не полуфинал всероссийской командной) так и было. На разбор осталось всего трое человек из жюри: я, Миша Городилов и Ваня Корниенко. Ну мы раскидали 9 задач друг между другом и начали рассказывать. Первая поломка произошла у Миши. Он где-то около часа объяснял тренеру одной команды, как писать быстрый аналог связных списков на массивах на Паскале. Дети поняли минут через 10, а остальные 50 минут Миша и тренер пытались найти взаимопонимание в терминологии. Хорошо, что произошла такая затяжка, потому как мы с Ваней нашли одну задачу, решение которой не знал ни я, ни он. Была у нас только грубая схема алгоритма. В итоге мы, как славные выпускники курганской математической школы, за полчаса смогли самостоятельно вывести этот алгоритм и доказать его трудоёмкость. А затем на «камень-ножницы-бумага» определяли, кто пойдёт его рассказывать, боясь повторить опыт Миши, мучавшегося в то время у доски.
Ещё иногда бывает неожиданно увидеть автора задачи. На Всесибирских олимпиадах у «старичков» даже иногда бывает что-то типа конкурса — угадать кто какую задачу написал. Так вот, с этим связаны ещё одна забавная история. Миша Калугин после ухода в жюри стал подрабатывать во время туров ещё и фотографом. Зеркалка есть, руки вроде тоже, так что почему бы не ходить и не щёлкать. Ответственность за написание задач с него снята этим не была. Так вот. Разбор задач, выходит к доске Михаил. Голос из Томска: «Блин, у них даже фотограф задачи решает!» Занавес.
Вот так и проходит типичный тур Всесиба. Без радостей и счастьев не обходится. Но и всё вышеперечисленное в один заход входит редко, иначе Открытый кубок КВН нашего университета померк бы рядом с Всесибирской олимпиадой.
За предоставленные хорошие воспоминания хочу сказать спасибо Мише Калугину, Коле Куртову, Толе Петрову, Мише Городилову, Саше Кирову, Наташе Поповой и немножко — себе.
В следующих сериях я вернусь в привычную для себя роль участника, кодера, игрока и расскажу, как проходят тренировки и туры для команд.