Блог пользователя Nickolas

Автор Nickolas, 12 лет назад, По-русски

Финалы Challenge 24 наконец закончился, и, как обычно, я спешу поделиться впечатлениями о нем. Спонсор впечатлений — команда Progopedia в составе: Андрей Максай (maksay), Сергей Дымченко (kit1980) и я (Nickolas). Такие вещи лучше всего писать сразу после контеста, пока еще свежи впечатления и эмоции. Можно, конечно, начинать писать их еще во время соревнования (в прошлом году я так и сделала — все равно к ночи от меня толку было мало), но в этом году мы были настроены бодро и боролись за баллы до последних минут контеста, поэтому блогу пришлось подождать.

Очная часть Challenge 24 заняла чуть меньше двух суток: регистрация и экскурсия для желающих в пятницу, сам раунд с утра субботы до утра воскресенья, а для самых выносливых и практически не нуждающихся во сне — награждение победителей и церемония закрытия в воскресенье днем. Мы прилетели в пятницу днем и сразу отправились в университет; к счастью, на этот раз обошлось без приключений типа отмененных рейсов, как в прошлом году, так что успели вовремя. Впрочем, не то чтобы совсем вовремя: когда мы подписали все бумаги (ну, знаете, о том, что мы не будем бузить, протестовать против папарацци и вообще вести себя неприлично), зарегистрировали ноутбуки (в этом году обошлось без удивленных вопросов от организаторов "что, три ноута — и все?") и добрались до комнаты, в которой нашей команде предстояло провести 99% раунда, три из четырех мест в ней были уже заняты, и нам предоставили выбор из одного оставшегося — маленького и неуютного, возле самой двери. Чтобы создать хотя бы минимально интимную обстановку (а решение задач, тем более командное, — дело очень интимное и требует соответствующей обстановки), пришлось изрядно повозиться.

После этого мы отправились на экскурсию, предоставленную организаторами и завершающуюся катанием на корабле по Дунаю, — насколько мне известно, первую за все годы проведения Challenge24. Увы, первый блин получился комом — "экскурсия" оказалась пешим марш-броском от университета до причалов, с паузами на "а давайте сделаем групповое фото на фоне вот этого музея", но без смыслового сопровождения (например, что это, собственно, за музей). Я не против марш-бросков, я люблю гулять по незнакомым городам, но с комментариями и без ноута на спине :-) Катание на корабле оказалось, гм, именно катанием на корабле — с музыкой, едой и толпой совершенно посторонних туристов, но опять же, без комментариев к тому, что за красоты и интересности проплывают мимо нас на берегу. Для полноты картины все это закончилось не в 9 вечера, как было обещано, а в 10. Видимо, задумка заключалась в том, чтобы спровоцировать знакомство и общение участников из разных команд (которого в прошлом году мне сильно не хватало), но делать это накануне соревнований, когда многие участники приехали в этот же день и не отказались бы от пары дополнительных часов сна (мы, например, выходили из дому что-то около 6 утра), кажется мне как минимум странным. Логичнее всего было бы не ходить на экскурсию накануне и на завтрак и церемонию открытия в день контеста, а вместо этого спать, спать и еще раз спать, запасаясь силами на сутки вперед, но увы, мы осознали это слишком поздно, где-то на церемонии открытия :-)

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

A. Alarm system

Типично алгоритмическая задача, которую решали Андрей и Сергей, сдав в общей сложности четыре теста из десяти.

B. The Great Mixup

Типично алгоритмическая задача, длинное и запутанное условие которой сводилось к вычислению произведения чисел по заданному модулю; легкость ее решения несколько смазалась одним пропущенным нулем в модуле 10...07 и соответственно долгим поиском причин расхождения ответов с примером :-)

C. Functions

Задача типа марафона — нужно было сгенерировать как можно меньший набор тестов для заданного контура, который выявлял бы поломки каких-то узлов контура. Отличалась особо невразумительным условием — из нашей команды понял его один Сергей, сделал вручную первый тест и за полчаса до конца контеста объяснил условие Андрею. За эти полчаса Андрей закодил несколько вариантов решения и сдал все оставшиеся тесты; и я официально объявляю это самым впечатляющим примером спортивного программирования, которое я когда-нибудь видела! Как минимум потому, что происходило это на двадцать четвертом часу контеста, когда я уже и обычный текст набирала с трудом.

D. Drums

Задача на обработку звука. С обработкой изображений мы бы еще попробовали, но вот звук — исторически слабое место нашей команды; ночью Сергей что-то пробовал с ней сделать, но ничего хорошего из этого не получилось, если не считать изумительных пурпурных спектрограмм :-)

E. Interval

Типично алгоритмическая задача, которую Андрей решил, кажется, еще раньше, чем я прочитала условие, так что я даже не вчитывалась.

FGH. TV

Совершенно потрясающий комплект трех задач, данные в которых давались в виде телевизионных сигналов с помехами. Их нужно было расшифровать и в зависимости от задачи найти путь в лабиринте (F), посчитать количество улыбающихся и мрачных лиц на картинках (G) или интерактивно идентифицировать пролетающие самолеты как дружеские или вражеские (H). В задаче про самолеты встречались еще какие-то секретные подзадачи, но о них лучше расскажут те, кто их хотя бы видел :-) Преобразование сигнала в картинку я написала сравнительно быстро, но вот на выполнении заданий застряла всерьез и надолго. Проблема была в том, что левый край картинки передавался исправно, а с приближением к правому краю изображение забивалось помехами, да так, что на правом крае нельзя было толком отличить улыбку от ее противоположности, а черный квадрат лабиринта — от белого, потому что оба они были черно-белые в полосочку.

Возилась я с этим довольно долго и с мизерным результатом — сдала только первый тест к задаче про лица, и то посчитанный вручную.

IJ. Air hockey

Интерактивная задача, в которой боты всех команд играли друг против друга в что-то вроде хоккея. Нас она не слишком вдохновила, и всегда было что-то другое, поинтереснее, так что ей мы практически не занимались. Какой-то бот у нас был, но он делал что-то довольно странное, ни одного теста в тренировке не проходил, и на турниры мы его не выставляли.

K. WW3

Изумительная интерактивная задача, в которой боты команд играли один на один в войну с несколькими видами войск и захватом городов. Многие команды написали бота поздно или не писали его вообще, играть против них было одно удовольствие — достаточно было занять хоть один город. У нас бот был более продвинутый (еще бы — в общей сложности мы уделили этой задаче больше всего времени), и занял он место порядка десятого в итоговом зачете.

L. Wheelchair

В этой задаче нужно было прогнать объект из прямоугольника и пары отрезков через лабиринт в заданную точку как можно более коротким путем, при этом объект мог двигаться либо прямо, либо поворачиваться вокруг середины одного из отрезков. По слухам, эту задачу нужно было писать через графы возможных положений объекта и переходы между ними, но это я бы точно не осилила. Впрочем, четыре теста я все-таки сдала, нарисовав для них вот такие картинки.

Как? Ну, практически вручную. Если быть точной, я написала программку, которая рисовала лабиринт и траекторию объекта в нем по заданному файлу ответа, и подбирала файл ответа "на глазок". Первые 22 часа контеста это решение уверенно лидировало, но увы, потом подтянулись команды, которые решали нормально, и по трем тестам из четырех у меня получилось порядка 70 баллов (из 100) за каждый.

M. Compress

За 6 часов до конца контеста нам подбросили еще одну задачку — записать заданный список слов в клетки кроссворда с пересечениями так, чтобы занять как можно меньше клеток. Ею тоже занялся Андрей.

В целом в этом году задачи были более сбалансированные — всем в команде было что делать все 24 часа соревнования. Видимо, поэтому мы чувствовали себя бодрее — я, например, попыталась пристроиться поспать на бинбэге всего однажды, и то не очень успешно — я была разбужена и брошена на запуск и техобслуживание бота к задаче K. К другим командам тоже относится — спящих тел и сомнамбулически шатающихся по коридору участников было гораздо меньше, чем в прошлом году. Мне кажется, в этом году состав команд был в среднем сильнее (вот как важно вовремя прорекламировать контест на правильном ресурсе ;-)); если так пойдет и дальше, то онлайн-раунд перестанет быть халявой, а на финалах без трех красных в команде делать будет просто нечего.

Подробные результаты есть вот здесь; при должном упорстве в них можно усмотреть массу любопытного. Например, победители в лице команды Havka-papstvo (кстати, поздравляю!) очередной раз подтвердили мое мнение о том, что настоящему спортивному программисту пустяки типа нетипичных задач, странного формата или незнакомого языка программирования — вообще не помеха :-) Команда, занявшая последнее место, решила тест I7 — один из немногих, которые так и не дались победителям. И так дальше в том же духе.

Интересно послушать истории и комментарии других участников — знакомых лиц было преизрядно (с asaveljevs мы даже ехали вместе из аэропорта).

P.S. А еще о контесте сделали видео.

  • Проголосовать: нравится
  • +73
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

Несколько дополнений по задачам:

A — задача на поток (вертикальные/горизонтальные непрерывные куски коридора — вершины, клетки — дуги). Видимо, там заходил и тупой поток, но мы написали preflow-push (на макстесте работало сильно меньше секунды).

FGH — у нас никаких помех ближе к концу не было, получались совершенно нормальные картинки :) Может, вы как-то криво парсили? В F мы сдали всё, в G — только первые 2 теста (в последнем там даже склейка кадров infinity работала; 3-4 мы не сдали из-за багов во внутрикомандном взаимодействии :) )

K — а там можно где-то посмотреть итоговый зачёт? Вообще мне показалось, что правила проведения турнира там были довольно странные.

L — а Havka-Papstvo там всё вручную сделали — весь прикол в правильных инструментах для ручного решения.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    FGH — там действительно бывает не ровно 160 символов в строке, об этом даже в условии сказано. Надо растягивать/сжимать до 160 пикселей

    K — там была страничка во время контеста, на которой было написано кто с кем и как сыграл, и обновлялась табличка после каждого тура. Мы выиграли оба последних турнира очень тупой тактикой — первые пол битвы в каждом городе производится пехота. Каждая пехота идет к ближайшему городу, а если кого-то видит рядом по дороге — стреляет в него. Этакий зерг-раш

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Ну так без растягивания/сжатия даже семпл не парсился. Так что вряд ли пролема у Nickolas была в этом.

      Ну, мы ту табличку не увидели, т.к. свалили сразу после того, как дописали нашу K. Интересно было бы посмотреть на итоговые результаты (наша стратегия отличалась от вашей только тем, что мы строили не только захватчиков городов, но и разведчиков :) и ещё какими-то глюками в протоколе при общении с сервером).

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Судя по скриншоту проблема именно в этом. У меня были такие картинки пока я их нормализовать не стал

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Сэмпл у меня выглядел примерно так

        И он вполне прилично парсился усреднением черного и белого по квадратикам лабиринта. Или хотя бы визуально :-) До изменения длины строки я не догадалась.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Верно ли, что задачу М подбросили так как лидеры сдали все?

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Вроде как это у них почти традиция — добавлять задачку ближе к концу. По крайней мере мы ожидали этого.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      в прошлом году задачи только убирались на протяжении контеста ;)

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Тем более, лидеры сдали не все. И до самого конца контеста шли турниры по хоккею и WW3. Поэтому появление задачи М скорее было запланировано. Для нашей команды оно было очень своевременным. Мы как раз спорили, что нам решать, а тут — новая задача :)

»
12 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Egor, расскажи как вы решали. Интересно же!

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +31 Проголосовать: не нравится

    A — написал Петя, сперев у меня библиотеку ради min-cost max-flow

    B — написал я

    С — писал Петя, вроде бы он умеет доказывать оптимальность своих ответов, но тем не менее у нас не максимум ;)

    D — писал Паша, словив все возможные грабли с ошибками у жюри. Во всех тестах, кроме одного, все составлено ровно из семплов с той же громкостью, в еще одном тесте бывают семплы с 1/3 и 2/3 громкости. Решение — подставляем семплы и смотрим, уменьшилась ли сумма квадратов. Если да, то он сюда подходит

    E — Пашка решил в самом начале

    F — я довольно долго тупил, что у нас больше одного кадра зашифровано :) После этого написал склеиватель кадров (к сожалению, мой не работал для G5) и довольно легко прошел все тесты для F

    G — воспользовался склейщиком кадров и посчитал первый тест руками. Распознователь лиц написал Петя, прошли еще 3 теста

    H — очень долго тупил с тем, что можно забивать на пропущенные пакеты и просто склеивать, что получил подряд и выводить на экран, если это похоже на кадр. Получилось что-то, что выдавало порядка 5-6 фпс, что нормально. Затем искал на картинке штрих код. Если после этого оставалось еще 3 области, похожие на белые кружочки, правильно друг относительно друга расположенные, то считал это самолетом (кружочки — мигающие лампочки на хвосте и крыльях). Это опознает около 10% пролетающих самолетов, из них порядка 70% правильно (правильные штрих код и свой/чужой). Когда прилетел Ктулху — очень долго тупил, но потом все таки решил распознавать штрих-код на нем, успел немного баллов набрать. Потом еще догадался, что летающие тарелки тоже не зря там летают (хотя у них была очень маленькая разница между цветом штрих-кода и остального тела). С телетекстом не сложилось

    IJ — Петя написал нашего бота

    K — Пашка написал наш zerg-rush

    L — Пашка написал визуализатор с кнопками управления. Ручками было пройдено 5 тестов. Потом Петя написал какое-то подобие bfs, а я его допилил так, что мы улучшили 3й тест и получили по нему 100 баллов

    M — занимался Петя, но с низким приоритетом

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А зачем в A mincost-maxflow? Там потока с нижними ограничениями хватает. И кстати, где можно посмотреть mincost-maxflow твоей библиотеки, который на 100000 вершин работает? Неужели ты закодил cost scaling oO?

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Ответ на вопрос как — медленно ;)

        Остальное знает Петя

»
12 лет назад, # |
  Проголосовать: нравится +20 Проголосовать: не нравится

неплохой отчёт =)

я не пойму, как можно писать что-то в блог, когда находишься в другой стране и хочется лишний час где-то погулять и на что-то посмотреть :) у тебя железные нервы, Nickolas!

немного черкну про замечательную задачу H

суть такова: присылается телевизионный сигнал, по которому необходимо считывать бар-код с самолётов и отличать союзников от врагов

бар-код — это последовательность широких и узких полос на брюхе самолёта, а "друг или враг" определяется по наклону крыльев: у врагов этот угол составляет не меньше 45 градусов

баллы давали по четырём номинациям: за считывание бар-кодов с самолётов; за бар-коды изредка прилетающих НЛО, уничтожающих эти самые самолёты; за Ктулху, который внезапно появился около 12 ночи и зохавывал вообще всё подряд; и за телетекст, догадаться до существования которого было, наверное, невозможно

кроме того постоянно менялся цвет фона, а ближе к ночи на небе зажглись звёзды, поэтому алгоритм постоянно приходилось допиливать под изменяющуюся ситуацию =) фана было — хоть отбавляй =)

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Could you explain the solution to problem B a bit more?

The official analysis of problem A seems rather complex, I wonder anyone has some simpler approach. My first idea is backtracking with some pruning.

I was surprised that the problemsets don't have any input constraints and memory/time limits, how did you deal with that?

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Input constraints and limits make sense when you have to submit code which needs to solve some test cases (unknown beforehand) within certain limits on the server. In this case you had to submit only the results of calculations, without any constraints on how you obtained them.

    Most test cases were already provided (well, except for interactive problems), so input constraints could be figured out from them. Time limit is defined by the requirement to finish the calculations till the end of submission phase :-) Last year we had a solution which spent about 6 hours processing medium-sized test case, and it was fine since it finished like half an hour before the end of the contest. And memory limit is "as much as your system will handle", it's really up to you.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

И для полноты истории — мой отчет о прогулочно-туристической составляющей поездки и прилагающиеся к нему фотографии (много лемуров и сусликов и по чуть-чуть всего остального). Исключительно на русском.