Добрый день.
Сегодня я хотел бы поделиться с общественностью своим небольшим проектом (который был частью моей ВКР), сервисом по "разморозке" результатов соревнований формата ACM ICPC — "System for Right Solutions Standings Dancing" (S4RiS StanD). Проект выложен на github.
Вместо вступления
В 2011 году моя команда таки прошла в полуфинал, где на закрытии я в живую увидел работу подобной системы ИТМО. Ощущение было сильным. Но проанализировав его работу и пересматривая снятое мною видео, я понял, что вполне можно улучшить данную реализацию, сделать её открытой, чтобы и на более скромных, локальных соревнованиях, участники смогли с трепетом следить за подведением результатов. Это было выбрано в качестве части моей ВКР, было использовано уже на одном соревновании и получило логическое продолжение.
Кратко о сервисе и его возможностях
Сервис представляет собой всего лишь одну web страничку с ядром, написанным на JS и не требует никаких "серверных" скриптов. Поэтому данный сервис можно без проблем использовать локально.
Как работает S4RiS StanD
Для работы сервиса нужен лог соревнования, содержащий всю необходимую информацию. Структура данного лога — это корректный код в формате JSON, спроектированный для максимальной простоты написания программ-конверторов из лога реальных тестирующих систем в лог S4RiS StanD JSON Log.
После загрузки лога происходит "промотка" результатов до последнего места. "Разморозка" результатов происходит итеративно. Каждый следующий шаг инициируется нажатием клавиши ‘N’ на клавиатуре при активном окне со страницей сервиса в окне браузера.
Разморозка происходит по следующим правилам
- В текущей строке результатов (которая выделяется цветом), которая ассоциируется с указанным участником ищется первая по алфавиту задача, по которой были попытки сдачи во время заморозки (в ячейке данной задаче написано выражение ? N, где N — количество сабмитов по текущей задаче в целом).
- Если такая задача нашлась, то ячейка с ней начинает “моргать” и отображение результата по данной задаче будет сделано при следующем шаге разморозки.
- Если попытка успешная — то строка с участником занимает новую позицию с учётом известных на данный момент результатов других участников по правилам ACM ICPC.
- Если не размороженных задач у участника не осталось — мы переходим на строку выше.
Как известно, организаторы соревнований всегда имеют некую “нижнюю” планку мест, начиная с которых они выдают дипломы и печеньки участникам. Стандартный режим разморозки (который пинается по нажатию на N) крайне медленно позволяет добраться, например, до 40 места, если участников около 100 и в заморозке было много не успешных сабмитов.
Идея "авторазморозки" до какого то места вполне очевидна и может быть востребована, но нормально контролировать очередь анимаций при такой разморозке весьма проблематично (и это хорошо видно было на полуфинале NEERC 2011 когда на экране творилось непонятно что). Поэтому я решил попробовать найти “золотую середину” и предлагаю вам следующий механизм "разморозки".
Режим "ускоренной разморозки"
К "активной клавише" 'N'(Next) добавляется клавиша 'F'(Fast), при нажатии на которую происходят следующие действия — мы идём по текущей строке участника, размораживая все сабмиты до тех пор, пока участник не получает AC по какой то задаче или все задачи уже разморожены. Никаких длительных анимаций мигания нет.
Тестирование показало, что данные 2 режима вполне можно совмещать и общая скорость "разморозки" повысилась весьма прилично.
Так же в последней версии была реализовано некое подобие адаптивной вёрстки — в зависимости от размеров окна браузера и указанного количества одновременно отображаемых участников сервис старается максимизировать занимаемое пространство браузера. Это было сделано чтобы избавить от надобности зумить браузер при использовании проектора. Цветовая схема так же специально выбиралась такая, чтобы в светлых помещениях информация на проекторе была лучше видна.
Поддерживаемые браузеры
Корректная работа сервиса проверена в браузерах Mozilla 9.x и выше , Opera 11.x и выше, Chrome 17.x (появляются странные артефакты если зумить страницу) и выше.
В ходе тестирования на логе Moscow Quaterfinal 2011 (около 120 команд, 1800 сабмитов) было выяснено, что сервис оказался неплохим нагрузочным заданием для браузеров.
Лучшие результаты показали Opera 12.x, Chrome 22.x.
Где посмотреть работу и где скачать
Демонстрацию работы первой версии сервиса на примере “разморозки” результатов XV межвузовской олимпиады, проходившей 24-25 марта 2012 года в г.Вологда, можно посмотреть на youtube
Временный демонстрационный стенд расположен по адресу http://students.uni-vologda.ac.ru/pages/pm07/ost/stand/S4RiS StanD.html. Для демонстрации работы предлагаю воспользоваться логами 2-ух форматов — Ejudge (Moscow Quaterfinal 2011) и "родным" логом системы — S4RiS StanD JSON( Межвузовская олимпиада г. Вологда 2011)
Рекомендации по использованию
- До демонстрации разморозки обязательно проверьте, что система выдаёт в конечном итоге те же результаты, что и ваша тестирующая система.
- Крайне не желательно слишком быстро размораживать таблицу — это чревато появлением косяков в анимациях. Спокойно дождитесь окончания всех обновлений на странице после очередного нажатия клавиши.
- Во время “быстрой разморозки” включите какую нибудь ритмичную музыку, чтобы увеличить напряжение окружающих.
- Для увеличения активной площади экрана включите "полноэкранный режим" в браузере.
- Чем больше записей в логе соревнования — тем больше нагрузка на браузер и его JS движок. На слабых машинах и не последних версиях браузеров возможно падение скорости и плавности.
Данная версия приложения реализовала почти все мои и чужие фантазии в данной области, но я готов прислушаться и к новым предложениям, если данная разработка окажется востребованной.
Данное ПО распространяется по лицензии Creative Commons Attribution Non-Commercial Share Alike и автор не несёт ответственности за возможные сбои приложения.
Если у кого то есть желание предложить альтернативную цветовую схему, посоветовать как то оптимизировать код ядра — я с удовольствием приму Ваши предложения.
UPD: В новой версии реализована локализация. Теперь сервис сам определяет язык браузера (который точно можно установить для Opera и Chrome) и выдаёт текст в переводе на данный язык. Пока реализован перевод на английский и русский.
PS: Большое спасибо Максиму daftcoder Делюкину за рекомендации и поддержку проекта.
UPD: Если моя "адаптивная вёрстка" внезапно залагала в полноэкранном режиме — попробуйте его включить только когда полностью отрисуется таблица ну или намного поковыряйтесь в движке, если знаете JavaScript :-)
IMHO, удобнее для зрителя было бы показывать текущего участника вторым снизу на экране, а не вторым сверху!
Эффект такой же, как в автомобиле/поезде — приятнее смотреть вперёд, чем назад! :)
Возможно, но тут немного другой подход. Чем меньше видно уже "размороженных" тем больше интриги. В автомобиле видимо интриги излишней создавать не надо :-)
В любом случае номер этой строки можно установить какой нужно. "Подпилить" данный скрипт не проблема — я максимально всё комментировал в коде.
Ну как раз таки если показывать выше, то и появляется больше интриги, ведь у них есть вопросики:)
Да и за первыми местами следить интереснее.
BTW, IMHO, естественно
Очень здорово. Только название какое-то странное.
Вопрос по истории. Кто-нибудь знает на каком соревновании впервые была использована такая фича? На финале ACM-ICPC?
Являлся зрителем разморозки результатов на межвузе в Вологде, действительно, прикольно!)
Спасибо за сервис! Из предложений могу высказать возможность управлять некоторыми другими клавишами. Дело в том, что большинство пультов, которыми многие щёлкают во время презентаций, поддерживают PageDown, PageUp и иногда ещё и B (англ.). Соответственно, может появится желание назначить действия и на эти кнопки тоже. К тому же, если это несложно в реализации, может быть очень полезной функция отката резалтов на 1 шаг назад, because shit happens.
It would be a good idea host this project in Git also, in my opinion it make things easy to distribute and other people to help in the project. Some options are Github or Bitbucket
Well done!
Sorry wrong blog :(
can someone help me ?? Actualy when ever i am opening a contest and trying to click on submit tab ,it says oops!something is broken .First i thought it was temporary ,but its happening for the last 2 days.
Отличная идея! Спасибо
А что за трек на видео играет?
I've also wrote a live board solution project.
see http://winguse.com/blog/2012/10/20/nenuliveboard/
I am the one of the technical leader of ACM-ICPC Asia Regional, Changchun Site. And this project was well displaying the live time scoreboard during the contest in our gymnasium.
Demon see http://acm.nenu.edu.cn:8080/BoardWeb/
I hope my project will be helpful during the ACM contest world wide.
Your application can work with any back-end system other than the one with which it is working now? I think that one of the main requirements of these systems is the simplicity of their interaction with variety back-end systems. We have no common specifications for every judge systems what kind of information we can get from it and it can be very hard to modify back-end, that it could work with such application. How difficult is it to get another system to work with your application? PS: Give more info about principles of interaction your application with back-end.
My project is designed during the Changchun Regional Contest, which using the PC^2 to be the judging system.
I wrote a PC^2 scoreboard API to get the status from the judge system and insert them in to the database for caching.
The database may be the interface between my scoreboard and any other back end system. The database only contain the information of Teams, Problems and Status. All the ranking information is computed on the browser site by using JavaScript. So, at this point, my project is also fitting in other judge system. Having a look of this file, by looking at the database structure of my project you will be more clearly.
But however, due to time and other reason, I haven't written any documents in English, but only in Chinese, sorry for that.
OSt, не подскажете, как можно скачать лог соренования группы в Codeforces?
Try this project