Обновленный Codebattle: игра для программистов

Привет, Хабр!

3d8dd97e407b486fa46e8ee7c96dc52e.jpg

Три недели назад мы (дружная команда образовательного проекта Хекслет) опубликовали пост про наш новый проект — игру для программистов Codebattle. Напомню, идея игры очень простая: вам и сопернику дается задача, вы решаете ее на выбранном вами языке. Вы видите код соперника в реальном времени, результаты запуска тестов и можете общаться с ним и зрителями в чате. Кто первый решит задачу (удовлетворит тестам) — тот победил.

После публикации статьи у нас был веселый день :) Легли под хабраэффектом и обнаружили несколько багов. Когда буря успокоилась, на арене снова закипела жизнь. В течение следующих двух недель мы решали три главные проблемы: производительность, борьба с читерством и возможность быстрого добавления новых языков. И решили их!

Встречайте — обновленный Codebattle! Вкратце:

  1. Хабраэффект нам по страшен (тьфу-тьфу-тьфу)
  2. Читерить больше не получится (нельзя подогнать решение под тесты)
  3. Добавлять языки стало проще (сейчас уже есть clojure, ruby, js, python, php, java, erlang)


Подробности под катом →

Почему лежали и как решили


Мы работали через поллинг, что генерировало тысячи запросов в минуту. Теперь все переписали через websockets. Еще нашелся баг в библиотеке nkdocker.

Читерство и языки


В предыдущей версии была такая система:

  1. Пишем задание и тесты на Clojure
  2. Транслируем на целевые языки нашей библиотекой multicode.
  3. Показываем сгенерированные тесты игроку


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

В обновленной версии другая схема: мы просто работаем через стандартные потоки ввода/вывода stdin/stdout, и не привязываемся к конкретному языку. Теперь мы генерируем тесты при проверке и не показываем их игроку. Система стала намного проще: мы просто подаем в вашу программу сгенерированные данные и смотрим на stdout. Это же позволило упростить добавление новых языков, мы успели добавить Clojure, Java и Erlang.

Из мелочей: добавили кучку новых заданий, обновили описание во всех заданиях, обновили расширение для Хрома.

Как добавить новое задание
Хотите добавить новое задание в базу и прокачаться в Clojure? ;-) В нашем репозитории с задачами есть подробное README и наглядные примеры.

В нашем Слак-чате есть специальный канал #codebattle, где можно обсудить игры, проблемы и идеи.

© Habrahabr.ru