Вот уже спал ажиотаж вокруг 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 подраздела.