Объявления для участников конкурса по программированию.

Порядок окончательного тестирования


Изначально мы стремились к тому, чтобы провести турнир по принципу «каждый с каждым». Однако несколько участников заявили о своём намерении подать на конкурс множество слабых решений-«спойлеров», против которых основное решение участника хорошо играет, или же высказали опасения, что так поступят другие. Такие действия явно запрещены правилами, но даже если правила так или иначе обойти, это противоречит духу конкурса. Это соревнование о том, кто лучше напишет одну программу, а не кто прогнёт под себя «ландшафт», закачав больше «спойлеров».


Хотя мы можем и будем применять различные методы для выявления и дисквалификации «спойлеров», всегда остаётся вероятность, что мы чего-то не выявим. Нам хотелось бы, чтобы призёрами конкурса стали те, кто лучше придумывает и программирует алгоритмы, а не те, кто изобретательнее обходит правила.

Поэтому мы приняли решение проводить окончательное тестирование в два этапа. На квалификационном этапе для N случайно выбранных затравочных значений (seeds) будет проведён турнир «каждый с каждым», причём пара (A, B) считается отличной от (B, A). Таким образом, каждая пара (и в каждом порядке) будет запущена на каждом затравочном значении. Итогом квалификационного этапа станет список участников, расположенных по убыванию суммы набранных очков (именно суммы очков, а не числа «побед»).

Затем K лучших участников из списка выйдут в финал, где между ними будет проведён дополнительный турнир на M других случайно выбранных затравочных значениях. Финальные позиции между этими K участниками будут определены исключительно суммой очков, набранных ими в сеансах на N+M затравочных значениях между собой, без учёта сеансов с участием решений, не прошедших в финал.

С одной стороны, это позволит более тщательно протестировать узкий круг решений, претендующих на призовые места, а с другой — лишит поддержки «спойлеров» решения, рассчитывающие на неё.

Конкретные значения N, M и K будут объявлены позже, так как они зависят от числа решений, которые отправят нам участники.

Арены для онлайн-переговоров


Мы создали несколько новых арен: standard_1s подобна standard, но следит за соблюдением лимита в 1 секунду на ход (эта арена в точности соответствует условиям окончательного тестирования); large и large_1s — арены с «увеличенными» настройками на случай, если кто-нибудь захочет попробовать на них свои силы.

Смотрите список арен на странице проекта на GitHub.

Для каждой арены теперь доступна «живая» статистика по каждому выступавшему на ней решению (ссылки в первом столбце таблицы). Статистика приведена в машинно-читаемом формате JSON, из которого участникам конкурса не составит труда получить то представление данных, которое их интересует. Ключом в этих данных является хэш идентификатора клиента, указанного с помощью параметра --id. Этот хэш тестовая система показывает вам при каждом подключении к серверу. Для каждого участника приводятся общее число завершённых сеансов (sessions), число достигнутых соглашений (agreements) и сумма набранных очков (score) за всё время (all) и за каждые отдельные сутки (UTC).

Обновления тестовой системы


Следите за историей обновлений на GitHub: мы регулярно исправляем найденные участниками недостатки в тестовой системе. Регулярно делайте git pull!

Официальный чат


Для обсуждения конкурса создан канал в Telegram: @hola_challenge_haggling.

Комментарии (10)


  1. FlameStorm
    27.06.2018 18:22
    +1

    Вопрос по работе арены — для готового к торгу участника каким образом арена выбирает пару? Любой из свободных на данный момент? Что происходит, если в данный момент нет других свободных участников?

    Или арена выбирает произвольного участника из всех (кроме этого участника кому ищет пару) независимо от их текущей занятости, ставит «торг-пару» в очередь и первый участник ждёт пока второй освободится?

    Просто в первом случае организации торгов велик шанс, что ввиду не очень большого числа участников освободившись после торгов друг с другом пара скриптов опять же найдёт друг друга же и будет снова торговать между собой, а не с иными участниками.

    Или это как-то иначе решается на арене? Например рандомной и разной небольшой задержкой для обоих скриптов-участников после окончания их торга и отдачей предпочтения (если возможных свободных на данный момент соперников более 1) не тому же с кем был предыдущий торг?


    1. feldgendler Автор
      27.06.2018 18:26

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

      Сейчас на арене standard каждую секунду в среднем завершается 2.5 сеансов, что достаточно много для «перемешивания» пар.


    1. riky
      27.06.2018 19:07

      лучше самому добавить рандомную задержку между запусками.


      1. FlameStorm
        27.06.2018 22:52

        В той самой предложенной UNIX shell команде которой,

        while true; do node haggle.js --id me@example.com:1234abcd myscript.js wss://hola.org/challenges/haggling/arena/standard; done

        можно например так:
        while true; do node haggle.js --id me@example.com:1234abcd myscript.js wss://hola.org/challenges/haggling/arena/standard; seq 0.05 .001 0.5 | shuf | head -n1 | xargs sleep; done


        Или под виндой такой батничек `client.bat` получился,
        @echo off
        set cnt=0
        echo "start trading"
        :loop
        node haggle.js --id me@example.com:1234abcd myscript.js wss://hola.org/challenges/haggling/arena/standard
        seq 0.05 .001 0.5 | shuf | head -n1 | xargs sleep
        set /a cnt+=1
        set /a cntb = cnt%%100
        if %cntb% equ 0 echo "trades count %cnt%"
        goto loop

        (сообщающий что ещё живой через каждые 100 сделок)

        `0.05 .001 0.5` — рандомная задержка между торгами от 50 до 500 мс.


        1. FlameStorm
          28.06.2018 19:12

          Да, ещё стоит использовать параметр тихого запуска -q и т.о. запускать скрипт так:
          node haggle.js -q --id ...


  1. riky
    27.06.2018 19:08

    каков примерно будет процент участников «K» (второго этапа) от общего количества?


    1. feldgendler Автор
      27.06.2018 19:20

      Возможно, сделаем не по проценту, а по пороговому значению среднего исхода сеанса. Ну и на решения посмотрим. Там же наверняка треть окажутся копиями example.js, как это бывает в каждом конкурсе.


      1. FlameStorm
        27.06.2018 23:12

        Гипотетически, если example.js окажутся лучшими и займут топ, ведь не будет дискриминации по алгополовому признаку, и именно они пройдут во второй тур и возможно выиграют? ;)

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

        Да, и ещё такая ремарка — там где есть рандом, всегда может выстрелить и не самая удачная стратегия, возможности, кондиции. Футбол сегодняшний хороший пример — чемпионы немцы (уже экс) прекрасные заслуженные результаты показывали, но вот наступил чемпионат-2018 и в раскладах ног, мяча и векторов $10 за все шляпы и книги забрала себе команда Южной Кореи. (не только Старкрафтом единым, молодцы, ага)
        Так что а вдруг, и example.js окажется в тройке или даже победителем! Фантастический опыт тоже опыт.


        1. feldgendler Автор
          27.06.2018 23:19

          Будем перебирать достаточно много сидов, чтобы случай не решал, кто победит.


  1. BingoBongo
    29.06.2018 22:18

    Беда
    «Added proof-of-work anti-spam measure (older clients may be asked to upgrade)»
    Я первоначальную версию под себя переписал, теперь снова адаптировать.