Несколько недель назад на просторах блогов 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.
Насколько я понял, оно не работает на прошедших контестах. Я установил, решил попробовать на каком-нибудь из прошедших контестов, а оно мне 0 иногда показывало, хотя в реальности там было ненулевое изменение рейтинга.
Нужно подождать пару минут. Причина описана в посте)
.
На большой таблице порядка секунды работает. На див1 моментально.
.
Людей,знающих js, у нас ровно ноль, поэтому явно не оптимально) контрибьюшн приветствуется)
Ребята говорили, что в скорости первоначальной выгрузки от нас не много зависит.
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
We will, if the extension have enough users.
Maybe you can make it userscript like this or this?
А расширение не будет давать дополнительную нагрузку на кф? Вроде же при обычном обновлении скачивается только часть ранклиста.
Только у меня проблемы появились с "показывать неофиц."?
нет
оно еще и считает неправильно
Неправильно считается только для старых контестов, так как скачиваются текущие рейтинги, а не те, которые были до соревнования. Для текущих контестов все работает.
Вероятно, так показалось из-за того, что рейтинги обновились, и дельты, которые видны, взяты относительно новых рейтингов,а не тех, которые были до контеста.
Было бы весело использовать NBHEXT вместе с виртуальными контестами, чтобы узнать возможное изменение рейтинга. Таким образом можно самому себе организовывать в каком-то смысле "рейтинговые" контесты.
Мы планируем это запилить, если расширение будет достаточно популярным)
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 ?
Thanks for your review! We thought it will be interesting to know how the contest is going right now. Sure, we will move our data to own host if current solution won't work well. Thank you again and have fun solving problems!
oh! Maybe I misunderstood. Extension will work at middle of contest ?
Yeah)
Yes, exactly.
GREAT IDEA :)
We are glad that you like it:)
We think that seeing the rating change during a contest is pretty exciting :)
sorry, I didn't read it carefully. you're right , really exciting :)
But how about server high pressure at middle of contest ? Maybe this extra requests (for downloading whole scoreboard) for server will decrease the speed of loading pages or ... ?
We don't think it will cause some visible problems. Anyway,will see tomorrow)
I can't understand this statement clearly :
So, actually, you have to wait around two minutes after you turned on the browser in order to let the extension download current ratings of all the users. Don't worry, it happens only once the browser has started.
It means extension will download standing page just once and will calculate ratings!? or each time we open standing page must download it ?
Only once, when the browser is launched. All other requests work no more than a couple of seconds.
Extension will download all users ratings (with inactive users too) once when browser launched. It takes about two minutes. Actually, it reloads every 12 hours (in case if you keep your computer on and browser launched constantly). Standings data loading every time you open standings page.
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.We will look into it and try to fix it before the next contest. Thanks for your feedback)
Also had this error message while trying to submit a problem in today's round, URL was http://mirror.codeforces.com/contest/592/problem/D?csrf_token=c15c2c92bb3f42d2467b7131ae6e68ee. (I think refreshing didn't fix it, but now (after contest) it's working again.)
А нельзя сделать так, чтобы оно только после контеста показывало прогнозируемые рейтинги? Чтоб во время контеста не отвлекаться :)
Хорошая мысль, надо галочку добавить.
Она уже есть. chrome://extensions/
А как? У меня никакие параметры не предлагает настроить.
Вкл/Выкл :)
Хех, ну ок) Было бы прикольно, если бы он сам начинал считаться сразу после контеста)
.
Спасибо! :)
Looks like 1k_trash has an interesting pastime activity! :p
Dunno, somebody must have accepted a pull request with this change =___=
Someone converting to Safari?
I'd love to try my hand at it if no one else is already working on the same...
Oh sure, that would be great, thank you! And don't forget to make a pull request when you are done.
Спасибо парни, прикольная штукенция! А он для командных рейтинговых приспособлен уже?
Еще нет, пока только для личных контестов. Поддержку командных соревнований обязательно запилим в следующей версии.
Круто! Полезная вещь! Вы круты!
Спасибо!
Обнаружил баг:
Спасибо! Действительно, такой баг есть, но он срабатывает только на новых пользователях Codeforces. На расчете рейтинга для аккаунтов, с которых был написан хотя бы один контест, это не отражается.
Или все же отражается? По результатам контеста изменения заметно отличаются от тех, которые прогнозировал скрипт. Для новых пользователей — в худшую сторону, для всех остальных — в лучшую (наверное, именно за счет новых пользователей).
Спасибо. Судя по всему, вы правы. Определенно разберемся и пофиксим в следующей версии. Как вам в целом расширение и идея?
Может быть, проблемы из-за неправильного стартового рейтинга новых пользователей?
А теперь расширение для предугадывания результатов системного тестирования...
пусть авторы выкладывают набор тестов минут через 10 после конца контеста, тогда задача станет на много проще)) и параллельно решиться вопрос с длинными тестами, которые не отображаются
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)
We will definitely investigate it.
I am actually got +199 ratings, but your plugin showed that I should get +150. How about that? Any help? Thanks.
Also, according to the extension, several unrated coders were supposed to get +800. Perhaps this bug is indirectly affecting rated coders?
Edit: Btw, the fact that the extension is underestimating the rating change in most (all?) cases gives some supporting evidence towards this, as lowering the expected places of unrated coders would increase the expected places of rated ones and therefore cause them to be awarded less points.
You are right. Rating for unrated users is 1500. We are changing rating from 0 to 1500 in our scripts. On testing data results were 100% correct. But accidently new users were not in rating list and their rating was undefined instead of 0. So their rating still were 0 instead 1500. Didn't catch it during our testing. With no doubt we will fix shortly.
Oh, thanks!
By the way, thank you all for the extension! Knowing my expected rating change during the contest was very cool!
Fixed and tested it locally. Results are absolutely correct.
Thank you for your effort. It's an amazing extension.
Неправильно сработало. Предсказывалось +50, на самом деле +66
Будем разбираться. Когда тестировали — было стопроцентное совпадение.
Расхождения были из-за того, что рейтинг новых пользователей считался нулем. В формулах он должен браться как 1500. Если это исправить — результаты совпадут.
Мы это учитывали и меняли 0 на 1500. При тестировании все сходилось. Но мы не учли, что новых пользователей нет в списке зарегистрированных. При тестировании такого случая не могло быть, так как соревнование уже пересчитано. Исправим (собственно, локально — уже).
Hey, great work guys. Also, shouldn't the extension be under "productivity" in the Chrome store and not "accessibility"?
Hey, thank you! You are right, we're going to change the category soon.
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.
That's right, it always uses the current ratings.
Hello usaxena95, thanks for your reply. You are right, now the extension always uses current rating for calculation. We will fix it in the next version, since we will move everything to our own server. So deltas for past contests will be calculating correctly. And also virtual contests will be supported.
Thank you for the interest, stay tuned!
Cool. Awesome work btw. Thanks a lot .
У супер красных рейтинг не пересчитывается.
Ой :) Спасибо за баг-репорт, пофиксим.
It's really awesome !! Loving it !! :D
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.
Thank you, rofi93. It's a known bug, we surely will fix it.
Во время вчерашнего контеста предсказываемое изменение рейтинга было 0 у всех, прождал 5 минут. Начало работать только после того, как рейтинг уже пересчитался (Но возможно, проблема не в расширении, у меня вчера с кодфорсом куча багов было: невозможность дорешивать до обновления рейтинга, долгий переход на страницу "Отправить", долгий переход на страницу рейтинга и т. п.).
Спасибо за отзыв. Да, это нормальное (ну как "нормальное", скорее "обоснованное") поведение, ведь при запуске браузера мы единоразово выкачиваем рейтинги всех пользователей Codeforces. У нас при тестировании это занимало около двух минут, а у вас (учитывая, к тому же, вчерашнюю небольшую нестабильность CF) все пять.
Этого не будет в следующей версии, так как работу с API перенесем на отдельный сервер, который будет постоянно поддерживать текущие рейтинги, дельты и все такое.
Удачи!
после установки расширения пропала возможность просматривать чужие решения(по двойному щелчку на результат). это только у меня?
Нет не только. Правда, не совсем пропала, а скорее, они грузятся теперь очень и очень долго (по крайне мере у меня)
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.
You know that rating formulas have been changed since then, right? :)
Yes, I know, I have taken that into consideration — "That doesn't look (...) like changes that should happen if this was current contest" ;). How do you think that should explain such high deltas? Current changes seem to be smaller than previous ones.
it does not work for me. all the numbers are 0
For me also !
Respect very nice idea
Thank you!
Для сегодняшнего контеста (329), мне предсказывалось +53, но стало +61
Спасибо за наблюдательность!
Если прочитать комменты сверху, или апдейт к посту, то можно заметить, что на втором дивизионе сейчас есть куча спецэффектов, и что на днях мы очень много всего поменяем.
мысли, как улучшить плагин. Никогда таким не занимался, но вроде бы часть кода (т.е. пересчет рейтинга за O(n2)) можно переписать на C++, используя NaCl — должно работать (наверно) гораздо быстрее.
Еще хорошо бы избавиться от JQuery — в паре мест, где оно используется, вполне хватит и обычного javascript.
Как написано в апдейте, мы все переносим на сервер, а там уже мы не ограничены javascript-ом)
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?
Yes CodeForces is more generous than this version :D
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)
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. :)
Чет эта штука не работает(
В посте написано, что сейчас не работает для див2. В скором времени будет апдейт.
Интересно, сегодня у меня одного расширение не показывало изменение рейтинга вообще?
Могу предположить, из-за чего не работает: вероятно, из-за того что MikeMirzayanov недавно добавил списки пользователей.
Is it only me or it isn't working?
I was just about to post the same comment!
same here... showing 0 for everyone
У всех не работает сегодня? или только у меня?
в последних 2-3 контестах не работал, не знаю почему
Потому что http://mirror.codeforces.com/api/help
The page is temporarily blocked by administrator. Эта страница временно заблокирована администратором.
Сегодня все нормально работало!!!
.
На 6к участников, вероятно, долго работало. Если пару минут после обновления страницы подождать, то все равно не обновляет?
Вообще мы решили сделать все хорошо сразу, а не выкатывать маленькие апдейты, поэтому текущая версия не идеальна и почти не отличается от самой первой.
почему только на Chrome? будет ли на Firefox?
Why does this show slightly different rating changes most of the time? And occasionally, it's completely off.
Looks like it only doesn't work for legendary grandmasters.
That's strange, considering it was made after LGMs were introduced. And I think it worked for them before (can someone confirm/falsify this?).
It shows wrong results for unrated users sometimes. I once saw +1000 for an unrated user.
It's usually wrong by 20-30, but in today's contest it was very accurate (at least for me and some of my friends)
Click.
Ok, I didn't check the Russian comments.
I'm slightly saddened that you decided to screenshot my implementation failures for C and D for eternity :(
I'm also happy to see I wasn't the only one to do that :)
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.
i have the same problem. but i forgot to write about it all time
Lately I'm just getting 0s for everyone all the time. Is it just me?
Seems like there are some shenanigans with the Codeforces API and calling the following method fails for some reason.
So that means we should notify MikeMirzayanov to have it fixed, right?
yes, there seems to be some issue when activeOnly is set to false. activeOnly=true is working fine. Also, the extension starts showing non-zero changes (although incorrect, of course) if that parameter value is changed from false to true in the extension package.
Thanks. Sent him a private message, let's hope it gets fixed soon. :)
Stopped working again, all 0s on today's contest :/
Can this extention be made for Firefox ???
:)
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.
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...
Recently I noticed that the extension gives 0 for all handles :\
Ребят, ваше расширение сейчас не работает. Проверял на разных браузерах, скачивал с разных источников.
Пример: Codeforces Round #390 (Div. 2), количество участников 4к, время ожидания 15минут, а показывает для всех 0. Можете пожалуйста исправить это) Было такое офигенное расширение для браузера)
Nice app. But it usually doesn't work. Could you please fix it?
Rubanenko Maxim 1k_trash