Конкурс по программированию: JSDash (промежуточные результаты 3)

    Спасибо всем, кто уже принял участие в нашем конкурсе по программированию! Мы получили 60 решений от 34 уникальных участников. До конца конкурса осталась одна неделя (до 17 августа 2017, 23:59:59 UTC), и мы публикуем последние предварительные результаты.

    Пока что вместо имён участников — идентификаторы решений. Ваш идентификатор — в автоматическом письме, которое Вы получили после отправки решения. Не возбраняется в комментариях к этому посту раскрывать, что такое-то решение — Ваше.

    На этот раз в качестве затравочных значений (seeds) мы взяли номера ранних моделей микропроцессоров Intel. В финальном тестировании, результаты которого определят победителей, числа будут другими, поэтому нет смысла вручную затачивать решения конкретно под эти уровни.

    Результаты промежуточного тестирования опубликованы на GitHub. В таблицах приведены суммарные результаты, а также отдельные показатели для каждого из уровней. Как и в прошлый раз, мы подготовили также таблицы с числом собранных алмазов, убитых бабочек, цепочек (streaks) и максимальной длиной цепочки. В зачёт все эти показатели не пойдут — победитель будет определён исключительно по сумме набранных очков.

    Мы публикуем также способ, который обещаем использовать для выбора затравочных значений для финального тестирования. Этот способ должен быть однозначным и легко проверяемым, но непредсказуемым. Итак, мы возьмём первый твит из этого Твиттера, который появится там после наступления дедлайна. Согласитесь, что влиять на его твиты мы не можем. Из твита берём только текст, без картинок и видео. Если в твите нет текста, а только картинка, то берём следующий твит. Ретвиты считаются. Имя ретвитнутого аккаунта не берётся.

    Из текста твита мы получим затравочные значения так:

    const random_js = require('random-js');
    const text = 'The tweet goes here';
    const bytes = Array.from(new Buffer(text));
    const random = new random_js(random_js.engines.mt19937().seedWithArray(bytes));
    for (let i = 0; i<20; i++)
        console.log(random.uint32());
    

    (Если будет нужно, то сгенерируем и более 20 чисел.)

    Присылайте свои решения! Осталась неделя, чтобы обойти нынешних лидеров.
    Hola 54,85
    Компания
    Поделиться публикацией
    Комментарии 33
    • +1
      Как! Как вы набираете столько очков? Как убиваете всех бабочек?
      • +1
        Исходники всех решений будут опубликованы.
      • +1
        Вроде кое как охотится
        image


        К сожалению поиск пути не заработал с первого раза, пришлось сделать хитрость, но в тупиках много времени теряет, особенно в режиме агра на бабочку, почти нет рандома. Допилю поиск пути, охоту и отправлю.
        • +1
          Хоть и не доделал до конца, но все равно отправил.
          Есть тупики и никак не отслеживаются падение камней и бабочек
          Если успею попытаюсь добавить боту чувство безопасности от бабочек.
          В любом случае интересно мозги потренировать.
          Спасибо
          • 0
            Ещё есть время до конца завтрашнего дня.
            • 0
              падает камень
              // падает камень, может убить
              if (
              	(screen.at(to) == ' ' && screen.is('falling', to.u(1)))
              	|| ( screen.is('falling', to.u(2)) && screen.at(to.u(1)) == 'A' )	// шаг вниз под камнем
              	|| ( screen.is('falling', to.u(2)) && screen.at(to.u(1)) == ' ' )
              	
              	// камень может упасть в бок
              	|| ( screen.is('sidefall', to.l())
              		&& screen.is('falling', to.l().u())
              		&& screen.at(to.u()) == ' '
              	)
              	|| ( screen.is('sidefall', to.r())
              		&& screen.is('falling', to.r().u())
              		&& screen.at(to.u()) == ' '
              	)
              ) {
              	weight -= 200;
              }
              
              // to = объект координат в которых окажется игрок применив ход, u d l r его методы, которые создают новые координаты (как в jquery .parent().find()).
              // weight = ценность или рейтинг хода.
              


              Забавно, падение камня одно из первых что делал т.к. проваливался на первом же тесте. (--seed=1)
            • 0
              Бабочек решил защитить, пусть себе живут)
              image
              • 0
                Неплохо для миролюбивого. Ещё гифку под спойлер вынести и кусочек времени секунд на пять в конце добавить в ней, где просто смотрим статичный итог, (перед стартом пару секунд тоже можно) и следующий комментарий станет гораздо лучше. )
                • 0
                  гифку через сайт конвертировал там ограничения 30сек поэтому так получилось)))
              • +1
                Постараюсь тоже сегодня успеть и отправить. И тоже спасибо за конкурс, очень интересный формат писать бота для игры.
                • +1
                  Спасибо за конкурс! Участников в этот раз мало, но вы не сдавайтесь!
                  На мой вкус, гораздо прикольнее предыдущего (хотя и тот конкурс был неплох). Своё решение доделать не успел (поздно статью увидел), но залипнуть на этой задачке было приятно.
                  • 0
                    Ага, у самого ещё куча идей по допиливанию, главное хоть успеть отправить что есть.
                    • 0
                      Окончательное число участников еще не озвучивалось. Сам тянул до последнего дня. И думаю, что не я один такой.
                    • +1
                      Как мой бот видит мир
                      image

                      • 0
                        Хищник.
                        • +1
                          Как мой бот в сингл-процесс расправляется с картой.
                          1066


                          А с лайв запуском какая-то беда, такое ощущение что миллисекунд подумать даже и 50 нет.
                          • 0
                            На сколько ходов вперед думает?
                            • 0
                              Как получается, в районе 4-5, — там при достаточно развитой логике больше попробуй насчитай… тут и миллисекундные (без -p непредсказуемые) ограничения, и по оперативке раскидываться чревато.

                              Эх блин, как не хватает овертайма на денёк ещё. Эта странная синхронизация просто убивает, её бы ещё допобедить, такой азарт!
                              • 0

                                На компе с аналогом тестового проца получилось 9… Но на javascript пишу вообще в первый раз, адова нетленка получилась и где-то сидит баг… иногда дохнет зараза по-глупому. Но второй раз овертайм не дадут ;) (:

                                • 0
                                  На 9 ходов — это полный перебор? Или с какой-то эвристикой?
                                  У меня полный перебор получался на 6 ходов. Но это уже с риском пропустить ход. Полный перебор — это по 5 вариантов хода на каждом шаге — влево/вправо/вверх/вниз/стоять. Для глубины 6 уже получается 5+5^2+5^3+5^4+5^5+5^6=19530 узлов. Реально же получается меньше, так многие ходы ведут к смерти и эти ветки отсекаются, и много тупиков. Реально где-то до 5000. При охоте за бабочкой сделал глубину 7, но не совсем полный перебор. Перебирает уже до 10000 вариантов. И на каждом мне нужно было сделать копию мира и обновить ее.
                                  Так как там 9 ходов-то получилось? ))
                                  • 0
                                    Перебор только при охоте на бабочек, само собой смертельные ходы сокращают общий объем. Также предполагается, что для убийства каждую клетку нужно посетить не более 2 раз (сильно сокращает варианты топтания на месте). Но копию мира не делал, обошелся одним массивом мира и списком изменяемых клеток (кругляки и бабочки), изменения которых передаются на след. ход, а на возврате откатываются. Получилось быстрее копии мира на каждом ходу. Причем под конец в гонке забил на оптимизацию, можно было б сделать и больше.
                                    • 0
                                      Ох! А я даже не задумался о таком приеме. Сейчас попробовал, удалось увеличить глубину с 7 до 11. Печально ((
                                      • 0
                                        Имел ввиду прием про посещение каждой клетки не более двух раз. А мир я сделал массивом битовых состояний. Копирование делается почти мгновенно. Выделенные массивы храню в собственном кэше для переиспользования, т.ч. их выделение тоже мгновенно и сборщик мусора лишний раз не напрягать. А откат в прежнее состояние в этом случае вообще не требуется.
                                • 0
                                  Если бы дедлайн был на день позже, то всё то же самое происходило бы на день позже. Надо будет сделать график с числом решений, присланных по мере приближения к дедлайну. Собственно, все «проснулись» за два дня до него, а все полтора месяца почти ничего не происходило.
                                  • 0
                                    Программисту всегда одного дня не хватает ))
                                    «Ничего не происходило» — это лишь догадка. Наверняка многие как и я просто не выкладывали решение до последнего дня. Напишите тут хотя бы сколько всего решений прислано.
                                    • +1
                                      Это точно, ещё как происходило. Но пока разработка идёт (в свободное время), промежуточный результат в 90% непригоден к заливке, а в остальных 10% случаев выглядит недостаточно хорошим, можно кое что важное ещё допилить и всё такое.
                                    • +1
                                      Можно кстати сделать вторую серию соревнования в этой игре, добавив новых фишек.

                                      Например, ту же высказанную вами идею насчёт битвы сразу двух ботов разных авторов на карте, где за убийство или блокировку соперника давались бы свои очки.

                                      Или, например, как в супаплексе добавить объекты-бомбы (напомню, их там три типа: взрывающихся при падении, при активации игроком объекта-терминала, и управляемые, которые ставит сам игрок), объекты-туннели (одно и двустороннего прохода), и многое другое.

                                      Сложность и интерес конкурса ещё в разы повышается, и у прежних наработок есть новый шанс выстрелить в изменившемся соревновании.
                                      • +1
                                        Ещё такая мысль — чтоб в течение основного времени конкурса «тоже что-то происходило», на промежуточных итогах можно какие-нибудь микропоощрения промежуточным победителям сообразить, наверняка сработает. :)
                            • 0
                              Нельзя ли опубликовать свежие «промежуточные результаты»?
                              • 0
                                Как только тестирование закончится.
                              • +1
                                по итогам соревнования надо устроить слет участников )))
                                • 0
                                  И чтобы на слёте они пытались друг другу на голову скинуть булыжник? :-)
                                  • +1
                                    Или бегать как ошпаренные друг от друга, стараясь встать на место повыше ;)

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое