Полгода назад я написал пост о моем интересе к упражнениям для тренировки мозга, результатом которого был небольшой сайт с такого рода упражнениями, созданный для всех желающих вступить на путь когнитивного просветления. Так как сайт делался с оглядкой на десктопные игры и приложения, то и получился он по сути таким приложением только в вебе. Но недавно было решено исправить этот маленький недостаток и добавить какое то взаимодействие между пользователями сайта, в надежде что кому то это сможет придать дополнительную мотивацию к тренировокам. Первое что приходит в голову это конечно же система соревнований.
Горизонтальное разделение
Сначала были попытки найти сторонний сервис который можно было бы по быстрому прикрутить, но все что я нашел, было заточено под казуальный игры с простой системой единой таблицы результатов и щепоткой ачивок. Мне же хотелось что бы из коробки было разделение пользователей по скиллу(достаточно стандартная практика, например в таких играх как LoL и SC2), ведь если участвую сто человек, то очевидно кто то окажется на сотом месте, и возможно будет себя чувствовать не очень комфортно, смотря на топ десять с результатами в разы больше чем у него. Следовательно нужен механизм для разделение на меньшие группы равных по силе. В итоге пришлось писать самому.
Я не стал слишком мудрствовать и выискивать какие то хитроумные алгоритмы под эту задачу. Раз нужно разбить на однородные группы, значит получаем стандартную задачу кластерного анализа, берем алгоритм k-means и получаем разбиение. Единственная проблема которая тут возникает, это то что слишком хороший и слишком плохой результат могут под себя отхватить целую группу. Так же идем от простого и причисляем эту задачу к известной проблеме в статистике, проблема обнаружения выбросов, берем простейший алгоритм для их нахождения, и перед использованием кластеризации, отсекаем эти результаты и автоматом зачисляем соответственно в лучшую и худшую группу.
Итого, имеем горизонтальное разбиение. Далее можно было бы систему улучшить за счет добавления еще и вертикального разбиения, которое бы решило проблему слишком большого количества одинаковых результатов. То есть, вместо того что бы иметь одну группу с результатами 1 1 1 2 2 2 3 3 3, лучше что бы было три равноправные группы 1 2 3, 1 2 3, 1 2 3. Но так как участников пока не очень много, и проблема не стоит столь остро, было решено эту модернизацию отложить до лучших времен.
Формат
Статичный список из топа, мне показался менее интересным чем постоянный обновляющийся, поэтому был выбран формат еженедельных соревнований. И так как тренировки приносят наибольшую пользу при их регулярности, неплохо было бы как то простимулировать человека что бы он и на следующий день зашел на сайт и с новыми силами сделал попытку, поэтому было решено обновлять позиции и лиги один раз в день.
Итого получилась такая вот не хитрая система. Принимайте участие и оставляйте фидбеки.
ru.brainexer.com/contests.html
Автор: dotneter