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

Автор Rubanenko, 10 лет назад, перевод, По-русски

Несколько недель назад на просторах блогов CF было очередное обсуждение на тему "почему так долго не обновляют рейтинг!?!?". В своем ответе MikeMirzayanov назвал несколько причин: 1. читеров проверяют руками; 2. раунды, как правило, проводятся вечером и Майку нужно потратить какое-то время, чтобы добраться домой; 3. иногда его маленькая дочь просит поиграть с ней и Майк, конечно же, не может отказать.

После того, как 1k_trash, Maxim и я узнали о третьей причине, мы начали думать, что можно с этим сделать. Немного подумав, к нам в голову пришло решение, которе делают счастливыми и участников, и дочь Майка. Решение заключалось в создании браузерного расширения, которое пересчитывает рейтинг в любой момент соревнования, когда вы обновляете страницу. Как-то так:

К счастью, CodeForces дал нам все карты в руки: API и детальная реализация метода пересчета рейтинга.

Раньше мы практически ничего такого не делали, но нам очень хотелось сделать что-то для CodeForces. В конце концов, мы не пожалели и получили много фана в процессе создания расширения. Сначала нам не удалось заставить расширение работать для больших контестов, вроде див2 и общих раундов. API не мог обслуживать тяжелые реквесты относительно начального рейтинга участников. В итоге, нам пришлось свичнуть все на бэкграунд при запуске браузера. Другими словами, при запуске мы выкачиваем начальные рейтинги всех юзеров, чтобы не делать это при каждом обновлении страницы.
Когда мы закончили с этим, было ясно две вещи:

  • на 5к участников наше расширение работало около 30 секунд. Да, мы писали его на JS :)
  • рейтинги были посчитаны неправильно!

К счастью, мы могли сравнить нашу реализацию с реализацией Майка чуть ли не по буквам. Проблема была в типах: официальное решение юзает int, а мы...var :). parseInt почти везде решил проблему, вот и хорошо :)
К этому моменту у нас был правильно работающий пересчет, но он был очень медленным. Наша команда немного приуныла, поскольку мы были уверены, что CF юзает самое быстрое возможное решение, и что у нас нету шансов как-то ускорить процесс. Однако, немного подумав, мы увидели, что "int везде" дает нам возможность сделать некоторую меморизацию. В итоге у нас было решение за O(min(N * K), N2 * log(N)), где N — количество участников раунда, а K — количество разных целых значений рейтинга. В текущих реалиях, K лежит в районе 3-4k, таким образом решение ускорилось раз в 20! В конце концов, мы закончили некоторые мелкие детали и выкатили расширение в хром стор.

Установить расширение

Everybody is welcome to contribute to our Github repository.
Hope you love it!

UPD

Thank you all guys for your feedback. After the extensions attracted so much attention we have no choice but to do our best in order to make it better. We will make a lot of changes this week: fix bugs you reported, add requested features, switch to backend in order to decrease pressure on CF servers during the contest.
A special shoutout goes to people, who contributed to our repository. We are very grateful and will look at every pool request these days.
A big thanks to Mike Mirzayanov for being friendly, ready to collaborate and giving few pieces of advice.

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

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

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

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

seems awesome!!! I think everybody will love it :)

PS: It would be great if you develope the extension for other browsers such as Safari or FireFox :D

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +18 Проголосовать: не нравится

А расширение не будет давать дополнительную нагрузку на кф? Вроде же при обычном обновлении скачивается только часть ранклиста.

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

Только у меня проблемы появились с "показывать неофиц."?

  • »
    »
    10 лет назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится -6 Проголосовать: не нравится

    нет

    оно еще и считает неправильно

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

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

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

      Вероятно, так показалось из-за того, что рейтинги обновились, и дельты, которые видны, взяты относительно новых рейтингов,а не тех, которые были до контеста.

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

Было бы весело использовать NBHEXT вместе с виртуальными контестами, чтобы узнать возможное изменение рейтинга. Таким образом можно самому себе организовывать в каком-то смысле "рейтинговые" контесты.

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится

Awesome :)

Sorry I have a question ?! Why you don't calculate rating after contest just once and save it in a file or database, then extension must just download data from your host and use them without calculation ?

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

Thanks for the extension, it's awesome! There is a small bug. If you uncheck the show unofficial box, then an HTTP 403 error message is showed.

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится

А нельзя сделать так, чтобы оно только после контеста показывало прогнозируемые рейтинги? Чтоб во время контеста не отвлекаться :)

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

.

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +115 Проголосовать: не нравится

Looks like 1k_trash has an interesting pastime activity! :p

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

Someone converting to Safari?

I'd love to try my hand at it if no one else is already working on the same...

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

Спасибо парни, прикольная штукенция! А он для командных рейтинговых приспособлен уже?

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

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

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

Круто! Полезная вещь! Вы круты!

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

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится

Обнаружил баг:

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

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

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

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

        Или все же отражается? По результатам контеста изменения заметно отличаются от тех, которые прогнозировал скрипт. Для новых пользователей — в худшую сторону, для всех остальных — в лучшую (наверное, именно за счет новых пользователей).

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +31 Проголосовать: не нравится

А теперь расширение для предугадывания результатов системного тестирования...

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

    пусть авторы выкладывают набор тестов минут через 10 после конца контеста, тогда задача станет на много проще)) и параллельно решиться вопрос с длинными тестами, которые не отображаются

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

After system test, the extension was showing that I will get -8, but instead I got +6. I think there is difference between your and Codeforces' algorithm (unless some people was banned from leaderboard because of cheating after systest; I'm not sure about that)

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

Неправильно сработало. Предсказывалось +50, на самом деле +66

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

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

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

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

Hey, great work guys. Also, shouldn't the extension be under "productivity" in the Chrome store and not "accessibility"?

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +13 Проголосовать: не нравится

Hello, I had a doubt. If I go to the standings of some past contest, the delta column I see there is completely different from the actual rating changes shown in the RATING CHANGES tab.

Is it because you calculate the rating changes of the past contests using the current rating of the participants and not the actual past ratings before the specific contest.

I know that this extension is actually meant for only live contests. But just a confusion why is it inconsistent with the past contests.

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +9 Проголосовать: не нравится

У супер красных рейтинг не пересчитывается.

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

It's really awesome !! Loving it !! :D

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

If i try to check the Show Unofficial box in the standing, it doesn't work and gives an error while keeping enabled the extension.

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

Во время вчерашнего контеста предсказываемое изменение рейтинга было 0 у всех, прождал 5 минут. Начало работать только после того, как рейтинг уже пересчитался (Но возможно, проблема не в расширении, у меня вчера с кодфорсом куча багов было: невозможность дорешивать до обновления рейтинга, долгий переход на страницу "Отправить", долгий переход на страницу рейтинга и т. п.).

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

    Спасибо за отзыв. Да, это нормальное (ну как "нормальное", скорее "обоснованное") поведение, ведь при запуске браузера мы единоразово выкачиваем рейтинги всех пользователей Codeforces. У нас при тестировании это занимало около двух минут, а у вас (учитывая, к тому же, вчерашнюю небольшую нестабильность CF) все пять.

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

    Удачи!

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +21 Проголосовать: не нравится

после установки расширения пропала возможность просматривать чужие решения(по двойному щелчку на результат). это только у меня?

»
10 лет назад, скрыть # |
 
Проголосовать: нравится -9 Проголосовать: не нравится

That doesn't look neither like changes that happened at time of the contest or like changes that should happen if this was current contest — deltas are way too high (like 2 times?). Screenshot was taken on #317 if that's of any relevance.

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

it does not work for me. all the numbers are 0

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

Respect very nice idea

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

Для сегодняшнего контеста (329), мне предсказывалось +53, но стало +61

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

    Спасибо за наблюдательность!

    Если прочитать комменты сверху, или апдейт к посту, то можно заметить, что на втором дивизионе сейчас есть куча спецэффектов, и что на днях мы очень много всего поменяем.

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

мысли, как улучшить плагин. Никогда таким не занимался, но вроде бы часть кода (т.е. пересчет рейтинга за O(n2)) можно переписать на C++, используя NaCl — должно работать (наверно) гораздо быстрее.

Еще хорошо бы избавиться от JQuery — в паре мест, где оно используется, вполне хватит и обычного javascript.

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

I think there might still be a minor bug in the extension, since I was supposed to get a +96 but got a +103 instead. I restarted my browser before the contest. Is there anything else that I should have done?

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +2 Проголосовать: не нравится

Not a correct output :).

However I guess that this one probably can be easily explained — I guess it didn't catch up after my submission of C? #bugreport

(I still wait for an explanation of my previous screen, which is still a mystery for me)

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

I disabled the extension before contest and during the contest i enabled it. But, now it's not showing any rating change. Showing 0 for everyone !! :( what's wrong ??

UPD: Now it's working. :)

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится

Чет эта штука не работает(

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +22 Проголосовать: не нравится

Интересно, сегодня у меня одного расширение не показывало изменение рейтинга вообще?

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +44 Проголосовать: не нравится

Is it only me or it isn't working?

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится

У всех не работает сегодня? или только у меня?

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится

Сегодня все нормально работало!!!

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

.

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

    На 6к участников, вероятно, долго работало. Если пару минут после обновления страницы подождать, то все равно не обновляет?

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

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +5 Проголосовать: не нравится

почему только на Chrome? будет ли на Firefox?

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

Why does this show slightly different rating changes most of the time? And occasionally, it's completely off.

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +13 Проголосовать: не нравится

Possible bug: on standings page, when i double click in any cell to view submission history, it doesn't get loaded (the 'loading' icon keeps on rotating). This doesn't happen when i disable the extension.

»
10 лет назад, скрыть # |
 
Проголосовать: нравится +83 Проголосовать: не нравится

Lately I'm just getting 0s for everyone all the time. Is it just me?

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +43 Проголосовать: не нравится

Stopped working again, all 0s on today's contest :/

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +15 Проголосовать: не нравится

Can this extention be made for Firefox ???

:)

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

It doesn't work, shows 0s for everyone and when I double click on a cell to view the submissions it gets stuck on the loading page.

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +31 Проголосовать: не нравится

Seems to be a problem with the CodeForces API once again, the URL used by the extension (http://mirror.codeforces.com/api/user.ratedList?activeOnly=true) gives Error 503 Service Temporarily Unavailable. (This time also with activeOnly=false.) Messaging MikeMirzayanov to make sure he's aware...

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

Recently I noticed that the extension gives 0 for all handles :\

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +19 Проголосовать: не нравится

Ребят, ваше расширение сейчас не работает. Проверял на разных браузерах, скачивал с разных источников.

Пример: Codeforces Round #390 (Div. 2), количество участников 4к, время ожидания 15минут, а показывает для всех 0. Можете пожалуйста исправить это) Было такое офигенное расширение для браузера)

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +64 Проголосовать: не нравится

Nice app. But it usually doesn't work. Could you please fix it?

Rubanenko Maxim 1k_trash