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

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

Вот уже спал ажиотаж вокруг CodeForces и стали видны основные недостатки в системе. Старые идеи уже не так хороши, как казалось раньше, а новых пока не придумали.

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

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

Сокращения используемые далее:

CF = CodeForces

TC = TopCoder

"В начале было Слово..."

Предлагаю обратиться к тому, для чего вообще проводятся контесты. Можно выделить 3 основных направления:

1. С целью обучения. Зачастую такие контесты составляются тренерами, чтобы решающие ознакомились с задачами из которых они узнают что-то новое. В таких контестах, как правило, встречаются классические задачи.

2. С целью отразить навыки решающего. Большинство контестов проводятся с этой целью, за примерами далеко ходить не надо: NEERC, Чемпионат Урала, TC и т.д. В таких контестах ценится оригинальность задач, оценивается умение участников хитро соображать / качественно и быстро  реализовывать. Другими словами, кто "Быстрее, выше, сильнее", тот и молодец.

3. "For fun". Название говорит само за себя.

Конечно ни один контест не проходит без fun'a и получения каких-либо новых навыков, но в контесте одна из составляющих цели выражена сильнее.

Теперь посмотрим на то, как все проходит на CF. Из числа участников можно выделить 2 основные группы, каждая из которых характеризуется перестановкой из целей, преследуемых людьми из этой группы, идущих в порядке убывания актуальности. 

1. "Обучение. Отражение навыков. Fun". Участники с такими приоритетами по большей части находятся в div2. По мнению администрации это действительно так, и я с этим мнением согласен.

2."Отражение навыков. Обучение/ Fun". Эти люди перед каждым контестм обычно думают: "Вот бы мне щас +75 сделать я бы желтым/фиолетовым/красным. Навыков для у меня достаточно и тот рейтинг, который я сейчас хочу получить соответствует моему уровню". Таких участников можно встретить в div1.

Существуют, конечно, люди которые решают for fun, но их гораздо меньше.

С div2 only контестами все хорошо и они действительно справляются со своей основной целью --- обучением.

Посмотрим на div1 (общие) контесты. Из чего они состоят и чем достигается основная цель (отражение навыков). Далее речь будет идти только о них, если не обговорено обратное.

"Яйцо взбить с сахором, добавить два стакана муки, щепотку соли и все перемешать"

Контесты в АСМ формате состоят из некоторого набора задач. Так, как контесты стараются делать сбалансированными, то можно говорить, что проверяются навыки участника/команды решать задачи широкого круга тематики. Контесты на CF состоят как минимум из двух составляющих: решение задач и взломы. Ко взломам я еще вернусь. Для начала поговорим о главной составляющей контеста -- о задачах.

В посте Alex_KPR, частично затрагивалась эта тема. Копипастить оттуда предложение я не буду, но внимание на нем я заакцентирую.

Каждая задача дается в контесте с определенной целью. Ну вот хоть кто-нибудь мне скажите: какой смысл несет задача А для участников с рейтингом 1650+ или задача Е для участников с рейтингом 1300-? Найдутся люди которые скажут задача А для того, чтобы все сдали и порадовались, а задача Е для тех, кто по глупости слил первый контест или для unrated. Ну неужели люди с 1650+ не сдадут задачу B в своем большенстве? На то у них и рейтинг 1650+. А unrated станут красными / жетыми не через один контест, а через два, если задача уровня E будет для них недоступна. 

По этой подтеме я полностью согласен с Alex_KPR. Стоит давать часть общих задач и часть различных. Такой подход ведет к четкому разделению на дивизионы во время контеса. Консервативное мнение администрации по поводу четкого разделения на дивизионы, на мой взгляд, обусловлина от части тем, что "Это же похоже на TopCoder, а мы не хотим сделать второй TopCoder". На самом деле идея деления на 2 дивизиона во время контеста не нова и заметить ее можно не только на TC. В качестве примера приведу Open Cup.

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

"Давай свой исходник, я тебя похачу"

Да, да, да. Речь пойдет о взомах. Им было посвящено больше всего постов о системе CodeForces за последнее время. Предлагались идеи косметического характера: изменять очки за взломы, как-то их ограничивать, что в итого приводило бы к потере интереса участника к взломам на i-ой минуте контеста %)

Хочу отметить, что это единственный способ "коммуникации" между участниками во время контеста, кроме монитора. Почему я сказал "коммуникации"? Потому, что таким путем один человек передает информацию / влияет на другого. В случае монитора участник видит, что вот эта задача легче, ее много уже решило, а эта труднее. В случае взлома, он получает помощь в виде "Твое решение не верно, я тебя похачил. Ищи багу.". Так, как монитор уже давно устоявшаяся часть контестов, на эту тему я дискуссировать не буду. Взломы же могут иметь гораздо более сильное влияние на положение дел, чем монитор. Монитор для всех един. Во взломе участвуют только 2 человека. Лично я выступаю за отсутствие таких "коммуникаций" во время контеста вообще. Формат РОИ мне как раз этим и нравится. Далее я предложу идею, где влияние хаков будет гораздо меньше чем сейчас.

Начнем и к этой теме подходить не со стороны проблем, которые проявились в последние контесты, а со стороны цели.

Хорошо. Пусть во время контестов требуется оценивать не только уменее решать задачи, а еще и находить баги в чужих решениях. Изначально идея взломов была взята от TC (поэтому мне невольно придется проводить аналогию с ТС) с единственным изменением: решения можно взламывать во время контеста. Именно из-за противоречивости последней идеи и идей TC возникают неприятные моменты . А что будет если начнем "рисовать" с чистого листа?

Пусть мы хотим оценивать умение находить баги в чужих решениях. Что для этого нам нужно? Во-первых нам нужны эти самые решения, во-вторых люди, которые будут взламывать. Решения у нас есть (т.к. это основная часть контеста), а для хакеров еще нужно мотивировать дополнительными баллами. Кроме того нужно выполнение некоторых ограничений и избежание читов.

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

Сколько задач выдается системой? 1, 2, 3? какие задачи выдаются? Только багнутые или любые? Если выдавать 3 задачи то в какой комбинации их выдавать? все 3 багнутые? 1 багнутое и 2 хороших? Как часто выдавать код для взлома? Все эти вопросы достаточно важны и так, как идея выдавать код новая, требуется их обильное обсуждение. Я осмелюсь предложить некоторый вариант, который может выступать в качестве показательного примера качественно-нового подхода.

Выдаем по 3 задачи: 2 из них проходящие все тесты и 1 из них багнутое. С технической точки зрения можно проверять задачи на финальных тестах по ходу их субмита, но результат не сообщать участнику, а использовать только для формирования хак-сетов. Участнику дается 10-15 минут на то, чтобы найти багнутое решение и взломать его. По истечению этого времени хак-сет закрывается и участник больше не может взламывать его. По частоте выдачи хак-сетов есть два предложения. Первое: выдвать хак-сет не чаще чем раз в 7-15 минут. Второе: каждые 7-15 минут у участника увеличивается счетчик неиспользованных хаков, после взятия хак-сета этот счетчик уменьшается, разрешается брать хак сет не чаще чем раз в 0-7 минут. После успешного взлома задачи участнику, чье решение взломали, об этом не сообщается. Задача больше не всключается в хак-сеты если появилялась (либо ломалась) в сете более более 5-20 раз. Хак-сет формируется из решений по одной конкретной задаче. Чтобы участник мог брать хак-сеты по этой задаче, задача должна быть заблокирована. Если всего решений по данной задаче < 5-10, то участнику предлагается просматривать все решения и проводить взломы по старой схеме (на это тоже дается 10-15 минут после чего происходит повторная проверка на кол-во решений).

Можно заметить, что "коммуникация" ослабевает т.к. является теперь односторонней. Участники будут больше полагаться на свои силы, чем на товарища-помощника.

Буду рад увидеть бурное обсуждение по теме абзацев выше.

Я обещал, что буду ссылаться на ТС. Собственно вот. Думается мне, что на ТС задача организации взломов, когда она решалась с нуля, выглядела примерно так. "Хорошо. Будем давать баллы за челенджи. А чтобы люди не тырили чужие решения, пусть они не смогут их видеть до некоторого момента. Чтобы решить проблему 'думать задачи или челить', выделим под взломы вобще отдельную фазу. Этим убъем сразу двух зайцев: дополнительные балы никому не лишние, учитывая что субмитить уже нельзя, к тому же решения никто не будет копипастить. Хм... А не будет ли появлять такой человек который будет челить по 30-40 человек за контест? А разобьем людей по комнатам и все будет ОК."

Там разбиение на комнаты решает свою задачу --- ограничение взломов. А на CF этого ограничения, как мы видим, не достаточно. Тут-то и начинают появляться проблемы, если на уже готовую идею пытаться навешать другие. (На фундаменте 5-этажки не построить небоскреб )) )

Способ ранжирования/оценки в контестах.

Основные стороны этой проблемы можно посмотреть в посте natalia.

Один контест в год -- мало, 20 контестов в месяц -- много. Ищем золотую середину.


PS Пост не закончен, добавлю в скором времени еще 2 подраздела.

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

14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
ИМХО:

Во-первых, вспомню эпизод из жизни, когда мой однокомандник попросил у тренера разрешения пропустить командную тренировку, чтобы напись SRM. Ответ был такой:"SRM - это развлечение, а наши тренировки - работа". Так что наша цель участия на Codeforces for fun.

Во-вторых, по-моему, хаки - важная часть Codeforces, так как они предоставляют больше места для маневра на контестах. 
Когда участников > 500 все ломают паленые решения не задумываясь о том, что тот, кого взломали, потом решит эту задачу и получит баллов больше, чем +100 за хак)
Но вот на контестах с менее чем 30 участниками вопрос "хачить или не хачить" будет стоять острее, что приведет к интриге и фану)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится

    "Существуют, конечно, люди которые решают for fun, но их гораздо меньше."

    Пока я ни один контест в формате CF на 3 человек не видел %)

14 лет назад, # |
  Проголосовать: нравится +31 Проголосовать: не нравится
Не, из выдачи трех решений для взломов ничего хорошего не выйдет. Там еще больше случайности будет, чем сейчас: иногда будет все ясно, а иногда - ничего. Кому-то 5 раз за контест попадется халявный взлом, а кому-то ни разу. Плюс еще информация о том, что одно из трех решений - неверно, немного угнетает. Короче, неправильно это.
14 лет назад, # |
  Проголосовать: нравится -11 Проголосовать: не нравится
Отдельная фаза для челленжей, имхо, идеальный вариант. Но тогда слишком будет похоже на topcoder(не знаю, хорошо это или плохо).
14 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится
Заголовок хоть как то связан с содержанием статьи ?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    <irony>Очевидно да. На CF грядут огромные изменения, наступает новое время, а Connector выступит коннектором этого стыка.</irony>
    • 14 лет назад, # ^ |
        Проголосовать: нравится +12 Проголосовать: не нравится
      Какое новое время наступает ? О стыке чего идёт речь ?
14 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится
Про "Обучение. Отражение навыков. Fun": мне кажется, автор недооценивает роль последнего пункта. Дело в том, что формат Codeforces значительно отличается и от формата командных ACM-соревнований, и от школьных олимпиад. Те, кто серьезно ориентируется именно на эти соревнования (например, ранее высказавший свое мнение Fefer_Ivan), используют для обучения и для отражения навыков что-то более сходное с ACM ICPC или IOI. Codeforces остается for fun.

Что уж говорить про играющих тренеров и ветеранов :)

Хотя может быть, я и неправа. Было бы интересно провести соц.опрос на тему "Цель участия в контестах Codeforces".
  • 14 лет назад, # ^ |
      Проголосовать: нравится +7 Проголосовать: не нравится
    По-моему, роль первого пункта автор тоже недооценивает, оставляя его в основном для div2 :)
    Ну и соответственно переоценивает роль оставшегося "отражения навыков".

    Опрос о целях участия мне тоже был бы интересен.
14 лет назад, # |
Rev. 2   Проголосовать: нравится +18 Проголосовать: не нравится
Можно, я просто похвалю стиль написания статьи? Вот автор очень правильно поступает, что эксплицирует цель - ради чего вообще что надо. Когда этого не делается, может возникнуть бессмысленный и беспощадный холивар из-за того, что участники вообще не договорились, а одинаковых ли вещей они хотят, и некоторым невдомёк, что другой может думать иначе. А так - сразу каждому, кто хочет не согласиться, ясно: рассуждения в принципе не бред, однако он не согласен с выводами, поскольку не согласен с исходным пунктом.

Короче, прежде чем рассуждать как, надо явно высказать своё мнение по поводу зачем. Чего я всем членам сообщества и желаю.