
Ниже по тексту представлен только предположительный формат — что-то наверняка поменяется. В частности, надеюсь на помощь сообщества для поиска нелогичностей и каких-то тонких моментов. Впрочем, я уже обсуждал этот формат с динозаврами спортивного программирования, и никто на явные ляпы не указал.
Формат 5 задач × 2 часа мне кажется вполне удачным и рабочим вариантом. По этой причине в ближайшем будущем менять это мы не будем, хотя, конечно, возможны эксперименты и отклонения.
1. Перед началом соревнования все делятся на комнаты, в каждой комнате примерно 20 участников. Пока деление будет происходить случайно, но, через некоторое время оно будет как-то кореллировать с рейтингом.
2. С началом контеста все выглядит вполне по ICPC-шному: все задачи сразу доступны для просмотра/решения, текст условий выглядит простым и понятным. Выбираешь задачу и начинаешь ее решать. Думаю, расположение задач примерно по усложнению неплохая идея. Цель участника — заработать как можно больше баллов.
3. Стоимость задач в баллах определяется следующей таблицей. Например, если была сдана задача B после 10 минут контеста, то за нее начисляется 1000 - 4 * 10 = 960 баллов. За каждую неудачную попытку положен штраф в 50 баллов. То есть, если задача B была сдана после 10-ти минут от начала с 3-ей попытки, то балл за нее равен 1000 - 4 * 10 - 2 * 50 = 860 баллов. Впрочем, сколько бы вы попыток не сделали стоимость решения не может опуститься ниже 30% баллов (см. колонку "Мин. балл (30%)").
Задача | Макс. балл | Мин. балл (30%) | Потеря (баллов в минуту) | Балл на конец контеста |
A | 500 | 150 | 2 балла | 260 |
B | 1000 | 300 | 4 балла | 520 |
С | 1500 | 450 | 6 баллов | 780 |
D | 2000 | 600 | 8 баллов | 1040 |
E | 2500 | 750 | 10 баллов | 1300 |
4. И вот наступает момент, когда вы решили задачу и отсылаете ее на проверку. Во время контеста задача проверяется только на предварительном наборе тестов (еще мы их зовет претестами). Претесты не известны участникам, на них тоже можно получить разные вердикты (например, "Неправильный ответ на претесте 7") . Их особенность состоит в том, что их не очень много, и они не проверяют решение полностью. То есть тот факт, что решение прошло претесты говорит только о том, что оно вполне разумно. Думаю, количество претестов будет от 2 до 10. Претесты скорее всего не содержат максимальные тесты, некоторые случаи и т.п. Может даже оказаться, что ваше решение каким-то случайным образом прошло все претесты — но это скорее из области фантастики.
5. После того как вы сдали задачу (т.е. отослали решение, которое прошло все претесты) в текущем положении участников вам начисляют баллы за эту задачу. Формулы я описал выше. Теперь у вас есть альтернатива — в том случае, если вы уверены в своем решении, то можете заблокировать эту задачу для себя. Если вы заблокировали задачу, то больше не сможете перепослать ее ни при каких обстоятельствах. С другой стороны у вас появляется интересная возможность взлома чужих решений участников из вашей комнаты.
6. Если в ходе контеста вы решили задачу, затем ее заблокировали, то вы можете просматривать и взламывать чужие решения участников из вашей комнаты. В процессе взлома вы можете предложить тест (или генератор его) на котором взламываемое решение предположительно не работает. Если оно и в самом деле не работает на этом тесте — то взлом успешен.Здесь нет ограничения на то — должна ли быть заблокирована задача у того, чье решение вы ломаете. Конечно, надо помнить, что взломав чужое решение в случае отсутствия блокировки на задачу у жертвы, она получает оповещение о том, что решение было взломано и может попытаться перепослать задачу. В таком случае, тестирование решения осуществляется не только на претестах, но и на всех взломах, которые были совершены для этого участника по этой задаче. Успешно пересдать задачу можно лишь только в том случае, если удастся исправить решение так, что удачная попытка взлома уже таковой не является. В том случае, если у жертвы решение заблокировано — то после его взлома участник может только расстраиваться, потому что исправить ситуацию уже невозможно (epic fail).
7. Попытке взлома подвергается последнее из прошедших претесты (плюс, возможно, предыдущие взломы) решение по этой задаче.
8. Перепосылка решения даже в том случае, если оно на текущий момент пройдено, может уменьшить ваш балл. Это произойдет в том случае, если перепосылка будет успешной (то есть пройдет претесты + взломы). В таком случае, предыдущая успешная попытка будет считаться штрафной.
9. За успешный взлом положена награда в 100 баллов.
10. За неуспешый взлом придется расстаться с 50 баллами.
11. Если вы заблокировали задачу, но ваше решение взломали, то у вас сохраняется возможность взламывать чужие решения.
12. При взломе можно как вбивать тест вручную, так и отсылать программу, которая его выводит в стандартный вывод. Программа должна всегда выдавать один и тот же тест, например, нельзя инициализировать датчик случайных чисел текущим временем. В любом случае надо очень точно следовать формату теста. Каждая строка должна заканчиваться символом перевода строки.
13. Попытка взлома может быть проигнорирована. Это происходит в ряде случаев: тест некорректный, его не удалось сгенерировать, одновременно со взломом жертва перепослала задачу и т.п.
14. Конечно же, во время соревнования категорически запрещено общаться с другими участниками, использовать не свой код для решений/генераторов, обмениваться идеями решений, взломов. И вообще, нарушение правил спортивной и личной этики может привести к дисквалификации. Также запрещается осуществлять взлом системы соревнований в любой форме. Короче, уважайте других и себя.
15. Обфусцировать код решения, а также создавать препятствия его чтения и понимания запрещено. То есть запрещено использование любых спец. приемов призванных усложнить чтение кода с целью понимания его работы.
16. После двух часов этого развлечения соревнование заканчивается и у каждого участника выбирается последнее решение по каждой задаче (разумеется, только успешное). Все такие решения перетестируются на финальном наборе тестов. В результате у кого-то решения пройдут, у кого-то упадут. Финальным результатом за соревнование считается сумма баллов за все решения, которые прошли финальное тестирование плюс то, что вы получили (или, наоборот, потеряли) за осуществленные взломы.
Все, finita la comedia, то есть game over.
Жду ваших мнений,
MikeMirzayanov
P.S. Я умышленно избегаю топкодеровского термина challenge: он плохо переводится на русский, к тому же у Топкодера могут быть амбиции на эксклюзивность челлендж-фазы и т.п. Прошу в обсуждениях использовать термин "взлом", спасибо за понимание.




5.Если вы заблокировали задачу, но ваше решение взломали, то у вас больше нет возможности взламывать чужие решения.
Зачем же так жестоко? Казалось бы, информация о том, что твоё решение взломано, сильно в дальнейших взломах не поможет. Или это правило нужно для того, чтобы заблокировать стратегию "отсабмитил фигню по сложной задаче, чтобы получить возможность взломов"?
Мне ещё кажется, может так получиться, что какой-нибудь слабый участник допускает в решении много багов, а сильный участник при взломе умышленно делает тест только против одного бага, чтобы иметь возможность взломать это же решение ещё один раз после ресабмита. Может, стоит ввести ограничение на взлом одной и той же задачи одного и того же человека (не более одного успешного раза)?
Вообще, интересно было бы поучаствовать в контесте по такой системе, должно получиться очень весело. Спасибо вам за огромную и важную работу, которую вы проделываете!
Как я понял "взлом" - это предложение теста, на котором сданная программа не даёт правильного ответа. Может быть, лучше использовать термин "опровержение"?
У меня несколько вопросов:
1) Сохранится ли деление на дивизионы?
2) Если ответ на первый вопрос "Да", то в одной комнате будут участники одного и того же дивизиона или нет?
Так что какие форматы будут нравиться этим людям, такие контесты и будут.
Ставить перевод строки в конце файла, даже исходника, это что-то типа правила хорошего стиля. Никто же не заставляет вас делать разумные отступы в коде? Вот и перевод строки ставить тоже полезно.
eJudge взломали!
И нет сабмитов, нет контестов, все сидят в печали...
:o)
Для распределения участников по комнатам наверное лучше всего подойдет "корзинный" метод жеребьевки. В футболе например он используется. Суть такова:
Например 1-20 человек по рейтингу идут в первую корзину. 21-40 во вторую и т.д.
Далее из каждой корзины случайно или как-нибудь еще выбирается по 1 человеку и они идут в первую комнату. Далее также выбираются и идут во вторую комнату. И так пока не кончатся люди. Таким образом средний рейтинг каждой комнаты будет сбалансирован.
>термина challenge: он плохо переводится на русский
испытание
"Я наиспытывал решений на 200 баллов"звучит хуже, чем "Я нахачил решений на 200 баллов".
На мой взгляд лучше остановится на взломе.
Как тут уже заметили, у этой системы есть огромный недостаток - это равная стоимость задач. Точнее получится так, что
Выход из ситуации только один - взвешивать задачи. Мои идеи:
2) "В том случае, если у жертвы решение заблокировано — то после его взлома участник может только расстраиваться, потому что исправить ситуацию уже невозможно (epic fail)." Т.е. если твою заблокированную задачу взломали, то ты можешь о ней забыть.
3) Не ошибается только тот, кто ничего не делает.
Все участники делятся на два дивизиона.
Из каждого дивизиона зарегистрировавшиеся участники делятся на комнаты по 20 человек.
Получаем:
- внутри комнат можно делать взломы.
- внутри дивизионов по завершении соревнования считается рейтинг.
Т.е. если человек написал плохое решение в комнате лузеров, оно же всё равно упадёт на нормальных (системных) тестах, а изменения общего рейтинга для него будут считаться относительно всех участников дивизиона, НЕ комнаты.
Если имеется в виду, что я не должен иметь возможность заваливать, пока не умею полностью решать — нужно как-то это гарантировать; непонятно, как это сделать так, чтобы претесты не были полным набором тестов. Если нет, то хочется избежать угадывания претестов — например, дать другие (меньшие) ограничения на претесты. Угадывание же добавляет элемент случайности.
Наверно, эта ситуация особенно знакома участникам индийских контестов, в которых авторы так не любят указывать ограничения: у простых задач есть много разных наборов ограничений, на которые нужны разные решения; какой же из них имели в виду?
Про обещание, они могли бы указать, что тесты содержат "все" случаи попадающие под ограничения. Т.е. если неправильное решение проходит тест, то это случайность, и вина авторов задачи, что они не смогли его сломать.
Нельзя смотреть чужой код, пока не заблокируешь задачу.
С двумя аккаунтами правда можно
Никто не будет ни хитрить ни подсматривать.
Вы отталкиваетесь от изотупичного предположения, что можно будет пройти претесты халтурным решением, что, вероятно, неправда.
Претесты скорее всего будут проверять почти всё, за исключением случаев типа
1. Ответ не влазит в int
2. Ответ надо выводить по модулю, и вы делаете что-то типа if( n == 0 ) cout << 1; вместо cout << 1 % p;
3. Вы не рассматриваете граничный вниз случай
взял на вооружение :o)
У меня два небольших вопроса:
1) Зачем вообще блокировать свою задачу? Только для того, чтобы иметь возможность взламывать чужие решения? И можно ли вообще не блокировать успешно решенную задачу (прошедшую претесты)?
2) Правильно ли я понимаю, что контест не будет разделяться на фазы, как на топкодере? (То есть, фазы решения задач и взлома по сути будут проходить одновременно: от начала до конца контеста)
- Можно не блокировать.
- Блокировать, чтобы просматривать решения. Скорее всего это нужно для того, чтобы нельзя было посмотреть чужие решения, понять свой какой-то недочёт и резко-резко исправить ситуацию. Исправить то уже нельзя - решение заблокировано.
2) Да, видимо всего одна фаза.
Иначе можно заблокировать, посмотреть код сложной задачи у сильных участников (переписать поменяв что-то по своему, чтобы уж совсем 1в1 не был код) ну и соответственно решить
Те кто решат мало задач вряд ли смогут взломать легкие задачи у сильных участников.
Просто не очень честно то, что если человек 1 сдал какую-то задачу, остальные не могут его челленджить. Как-то это странно)
потому что написание кода и взлом - два принципиально разных способа зарабатывать баллы и они, на мой взгляд, никак не должны зависеть друг от друга, поскольку здесь речь идет о двух различных навыках - писать код и искать ошибки + подбирать тесты.
"А теперь прикинь, если дать возможность сразу заблокировать задачу."
Вот возможно именно поэтому надо сделать в 2 части - во второй части после окончания кодинга можно будет взламывать все решения.
1) В зависимости от задачи участникам может быть выгодно или наоборот не выгодно чтобы его решение челленджили. Выгодно - если написал не совсем понятное решение и взлом позволяет "тестировать" до окончания задачи. Не выгодно - ты написал все что мог и уверен что лучше уже не придумаешь + лелеешь надежду на то, что твое решение пройдет все авторские тесты. Другими словами ты надеешься на удачу, но сильно сомневаешься что нет такого теста который мог бы завалить твое решение. При этом естественно, что ты не хочешь дарить никому баллы. Получается, мы имеем 2 ситуации, которые могли бы довольно сильно повлиять на тактику во время контеста. Можно при сабмите сделать галочку что-то типа "пожалуйста хачьте мое решение", которая бы приносила тем кто челленджит больше баллов, чем за челлендж задачи без этой галочки. Но это все вносит некоторую специфику и наверно такие вещи вносить все-таки не нужно.
2) Наверняка найдутся люди которые будут стараться сабмитить в самом конце чтобы их решение ни дай бог не почелленджили. Может сделать после окончания фазы кодинга еще минут 5 на челлендж)?
3) Возможно стоит сделать попытки по взломам тоже с разными весами.Веса видимо должны зависеть либо напрямую от стоимости задачи, либо являться некоторыми параметрами, выставляемыми авторами до начала контеста.
Я слышал не редко от людей, что у них уже автоматизированный процесс перегоняет решение в FineReader, а затем запускает стресс-тест против своего решения :о)
Первую половину я тоже как-то давно писал, а вот до стресс-теста руки не доходили.
Ну и мои 5 копеек:
1) Не очень нравится, что фазы решения и взлома полностью совмещены. Мозги для них как бы совсем по-разному работают (во всяком случае у меня :). Опять же, кто слабо решает, будет преимущественно искать удачи на взломах, т.е. решать так и не научится. Предложение: фаза взлома начинается через 1 час после начала контеста (т.е. в течение 1-го часа ни просматривать, ни взламывать чужие решения нельзя!)
2) А теперь по поводу самого взлома: чтобы сделать его более интересным, надо сделать привязку количества баллов за успешный взлом к разнице рейтингов участников. То есть, чтобы выгоднее было взламывать решения топовых участников и тех, кто выше тебя по рейтингу.
Реализовать можно домножением 100 баллов на коэффициент типа:
С = 1 + (Rvictim - Rmy) / 1000
То есть,. если участник с рейтингом 1500 (как у меня) взломает решение участника с рейтингом 2000, то я получу 150 баллов. Если же наоборот, то он получит только 50 баллов. При равенстве рейтингов будет 100.
Я исходил из предположения, что в одном дивизионе разброс рейтинга больше 1000 не будет, забыв, что в 1-м дивизионе может быть 1500. Так что формулу надо поменять на такую:
С = 1 + (Rvictim - Rmy) / 1500.
Плюс сделать минимальное кол-во баллов за взлом, например, 20.
Идея была: чтобы участники взламывали решения примерно равных и более сильных. Ну и чтобы хай-левел участникам не выгодно было ньюбов хачить! :)))
На мыло пришло письмо
...оставил комментарий на ваше сообщение. Перейдите по ссылке http://codeforces.com/comments/466#comment-6607 для просмотра.
Надобы, наверное, как-то всё-таки разделить отсылку на почту ссылок codeforces.com и codeforces.ru (для русско- и англоязычных пользователей).
Мне ещё с www.codeforces.ru приходило. И тоже нужно было логиниться отдельно.
It'll be so until that someone submit a new solution (if the problem wasn't closed; if closed - NO WAI), that again passes pretests And tests, that used to hack this person's solution before.
Допустим, я сдал четыре задачи, я их заблокировал, но мне скучно. Я беру, и все поинты сливаю на то, чтобы поднять какого-то серого чувака в комнате. Так как я теряю 50, а он получает 25, он получит половину моих поинтов. Учитывая, что что-то он все-таки сдаст, ему будет очень клевенький дамп вверх :о)
А если психов как я будет два (а лучше три :о)), то можно чувака, который ничего не сдал, вывести на первое место.
Я думаю, если бы такое правило реально ввели, были бы соревнования по вытаскиванию серых чуваков в топ :о) Чья комната лучше откормит серого чувака :о)
читать "который сдал самую простую задачу, об которую мы собственно все и будем его поднимать"
If BF/load are issues just add an X seconds delay between hacking attempts.
I don't really think it would be useful to try "hacking" at all. In TC challenges were already too much of an unusable gimmick for most div1 coders. But if besides of the risk of losing points, you also add that you cannot resubmit any more and that you have to use time during coding phase it is too much.
One more argument for making penalty for unsuccessful hacking - it should stop hacking flood and brute force hacking :-D
IMHO, with your system the whole idea of combining the coding and the hacking phases together almost doesn't make sense. I agree that the importance of hacking is now emphasized, but well, that's the feature of the format. By the way, in alpha round #20 ivan.popelyshev started to hack solutions only after he submitted all 3 problems himself, and still made it to the 1st place.
As for the tracking of the scoreboard — I'm sure there will be improvements of the interface that will make this easier.
I liked the idea of silent and multiple hacking by Kalinov. It makes sense.
1. The way I understand it, we cannot hack at problems we haven't submitted and locked ourselves. But we might have formulated usable test cases, even if we failed to submit. Would it be possible to lock a problem we haven't submitted - in effect we forfeit our chance to submit the problem any more in the contest - and then challenge?
2. In TopCoder, the text of solution code is unobtainable by copy-paste or any other way. This is essential to prevent automated challenges. Is there a similar restriction in the new format?
On the whole, this new format looks promising. Looking forward to the first rated match.
No, you can't copy-paste other's solution.
You can still hack others
првильно ли я понимаю :
я могу взламывать только те задачи, которые я на етот момент здал и заблокировал ?
и если у меня задачу взломали, то возможнось взлома терятся или нет ?
>я могу взламывать только те задачи, которые я на етот момент здал и заблокировал ?
да
>и если у меня задачу взломали, то возможнось взлома терятся или нет ?
нет, не теряется
P.S. I can see that this way you will be mention his cheating and will disqualify him, but it's just a matter of canceling the potential of cheating as much as you can. Also, note that you won't even think of cheating if the process is done for a small value of N.
Solution: Don't let someone hack another ones solution for more than once (or twice)
А вдруг я ошибусь? А вдруг неверный взлом будет? А потом еще больше штраф будет? Нет, лучше не буду взламывать...
А сейчас штраф достаточно небольшой, одинаковый для всех и понятный. И бонус за удачный взлом точно такой же ясный и понятный.
Никто же не запрещает взламывать?
А инициатива она всегда наказуема.
И никто не заставляет.
А так уже целые тактики есть что и как делать. :-)
Усложнить? о_О Последние пять рейтинговых контестов для обоих дивизионов в среднем только три участника решали все задачи. (Да, я посчитал.)
Sorry for my bad English
Here's a sample Java solution for problem A from beta round #1
1. Proceed to the "Contests" page. (link)
2. Enter one of the previous contests. (example)
3. Proceed to the "status" page (status)
4. Find some accepted solutions in Java
5. Look at the code clicking the solution ID link.
P.S. It seems to be that you just print the answers for the sample tests. Instead you should read the input data from the standard input stream.
Есть вопрос, даже скорее пожелаение...
Почему нельзя сразу тестировать на претестах и финальных тестах, также сразу делать таблицу конечных результатов, но пользователю, во время олимпиады, отображать только как прошли претесты и таблицу "предварительных" результатов. (ну т.е. то как есть сейчас)....?????
Обобщю.... можно плюс ко всему, что есть сейчас, добавить тестирование на финальных тестах, но без отображения пользователю во время олимпиады....
Это ускорит работу по созданию конечных результатов !!!
Это логичная идея, и вроде бы на топкодере так и поступают. Во время контеста претесты по идее создают очень маленькую загруженность (в самом деле, есть 5 задач, по каждой не более 10 претестов, а тестирующих машин - тоже около 10).
Я думаю, просто до реализации этой фичи ещё не дошли, - и так вон пока виртуальные пользователи только-только реализованы.
What about the following idea: after the finish of each contest, problemsetters upload all tests to all their problems as an archive (to some site). It's not difficult for authors to take an archive from the system ('Polygon') where the problems are created.
I don't know when the feature of viewing test data will be available on Codeforces, so I suppose this is the best solution. It's really not a good idea to ask tests in comments on the site, IMHO.
Можно кликать по ячейке, но это неудобно.
Или может я чего-то не знаю?
8. Перепосылка решения даже в том случае, если оно на текущий момент пройдено, может уменьшить ваш балл. Это произойдет в том случае, если перепосылка будет успешной (то есть пройдет претесты + взломы). В таком случае, предыдущая успешная попытка будет считаться штрафной.
I am asking because some hacks may expose bugs that the system tests may not cover. In such a situation, a solution may get accepted because the author of the hack failed to check the solution or was in a different room.
Кажется такое планируется. :-)
Кстати, чисто топкодеровский подход к делу... Интересно бы посмотреть, кто умудрится написать идеальный код, который просто невозможно взломать;)...
UPD.
Ненавижу, когда какие-то балбесы, мягко говоря, ставят минусы, даже сами не понимая, почему. От великого ума, наверное...
Я думаю, что было бы не плохо изменить название вердиктов на английский, т.е. Accepted, Wrong Answer, Time limited, это было бы куда удобнее и привычнее, или хотя бы, возможно, сделать выбор языка вердиктов. Помню часто на CF были у меня косяки когда видел Ошибка времени исполнения , увидев слово "времени", происходили ассоциации с вердиктом TL, что убило меня т.к. в задаче было 6 математических действий. Да и вообще как-то красивее по-моему вердикты на английском.
UPD
Решил предложить небольшую идейку, нет блин народу же надо минусовать на за что. :(
По UPD: Не пишите про минусы, это раздражает народ ещё больше.
А ваc не смущает `time` в runtime error?
Хотелось бы услышать мысль MikeMirzayanov об этом:
В принципе можно оставить всё как есть. Нормальные люди приходят сюда качать свои скиллы (и расти) - а читеры тупо тратят время и роют себе могилу (как разработчикам)...