На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Оставь надежду всяк сюда входящий
1) На раздел распространяются все правила форума.
2) Ответы на головоломки необходимо давать только в теге SPOILER. Сообщения в обход этого правила будут удаляться. Постоянное
нарушение данного пункта правил, повлечет за собой наказание.
3) Автор темы должен указать, известно ли ему решения задачи и сроки в которые он опубликует решение.Рекомендуется вести список отгадавших в первом сообщении.
4) При создании новой темы, в описании или в самом названии четко укажите разновидность задачи.
5) Полная версия правил раздела, находится в теме правила раздела.
Модераторы: Братец Лис
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Игра по Конвею, для программистов
    Правила были изменены и теперь являются окончательными и больше меняться не будут. В случае, если в этих правилах обнаружатся существенные недостатки, то данная игра будет закрыта. И, может быть, будет открыта новая, с доработанными правилами.

    ===

    Статья Программируем жизнь с хабра, в которой есть и правила Конвея и немного слов об оригинальной игре.

    Игра по Конвею
    для программистов

    1. Цель:
    - бить рекорды по количеству живых клеток.

    2. Ограничения:
    - начальное ограничение N = 5.

    Цитата
    Что означает ограничение N=5:

    Популяция, численностью ровно 5 живых клеток задаётся на поле 5х5; её развитие обсчитывается только в пределах этого поля; развитие продолжается ровно 5 ходов (от заданного состояния t(0) до конечного t(5)), после чего подсчитываем количество живых клеток.


    3. Каждый ход заключается в размещении новой конфигурации, которая бьёт рекорд по численности популяции при текущих ограничениях. После чего ограничение N увеличивается на 1. Так же, допустимы комментарии.

    4. Первый ход делает ведущий(я), размещая свою конфигурацию и указывая достигнутую численность популяции.

    P.S.
    ВАЖНО помнить: после каждого хода ограничение N увеличивается на 1.

    То есть, вторым ходом участник должен разместить популяцию, численностью ровно 6 живых клеток, на поле 6х6; её развитие обсчитывается только в пределах этого поля; развитие продолжается ровно 6 ходов (от заданного состояния t(0) до конечного t(6)), после чего подсчитываем количество живых клеток, которое должно побить старый рекорд.
    Сообщение отредактировано: ya2500 -
      Первый ход(N=5):

      .....
      o....
      .o...
      .oo..
      ...o.

      на пятом шаге(а на самом деле устаканивается раньше), имеем 7 живых клеточек:

      .....
      .o...
      o.o..
      o..o.
      .oo..

      то есть, текущий рекорд R=7, его нужно побить, уже при новых ограничениях(N=6).

      Цитата
      а для рисунков рекомендую хороший хостинг: http://piccy.info/

      user posted image
      Сообщение отредактировано: ya2500 -
        Поле тороидальное, как я понимаю?
        Долог путь в бессмертие... я еще вернусь.
        Профильный скилл "Телепатия" 8%
        ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
        Прошу потестить игру.
          Цитата Vesper @


          Нет. Просто обычное квадратное поле.
            Тогда надо определить окрестность в сторонах и углах. Либо брать обычную, но считать, что снаружи ничего нет и там ничего не может появиться. По мне, где-то на 10м ходу станет неинтересно.
            Долог путь в бессмертие... я еще вернусь.
            Профильный скилл "Телепатия" 8%
            ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
            Прошу потестить игру.
              Цитата Vesper @
              Тогда надо определить окрестность в сторонах и углах. Либо брать обычную, но считать, что снаружи ничего нет и там ничего не может появиться.


              ну да - за пределами поля ничего нет(этого я не указал) и ничего не может появиться(а вот про это - написал):

              Цитата ya2500 @
              развитие обсчитывается только в пределах этого поля


              Цитата Vesper @
              По мне, где-то на 10м ходу станет неинтересно.


              Vesper, ну, не знаю. Пока что, похоже, что народу уже на 2-м ходу неинтересно) старая добрая игра про уменьшение 1000 по единичке была более популярна ))
                Не очень понял. Следующий ход должен быть на поле 6*6, то есть мы принимаем на веру, что предложенный ход 5*5 оптимален? А вдруг найдётся ход, дающий 8 в итоге?
                  Цитата Mikle @
                  Не очень понял. Следующий ход должен быть на поле 6*6, то есть мы принимаем на веру, что предложенный ход 5*5 оптимален? А вдруг найдётся ход, дающий 8 в итоге?


                  Вот, изначальная идея была в том, чтобы на поле 5х5 находить максимум, потом - на поле 6х6 и так далее... Но те правила были плохо продуманы. Например, [условный]максимум предполагался найденным, если в течении недели никто не побил старый рекорд. Но вполне вероятно, что на первых ходах максимум будет находиться очень быстро, тогда игра будет состоять, в-основном, из ожидания, что нехорошо. А если участники будут ходить слишком редко, то уровни будут наращиваться вхолостую(например, кто-то предложит ход для N=6, а в течении недели никто не предложит хода лучше).

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

                  Vesper, по поводу тора: если поле замкнуть, то в нём станет возможным протянуть непрерывную линию, которая ведёт себя практически одинаково, не зависимо от своей длины. Это не есть хорошо.
                  Сообщение отредактировано: ya2500 -
                    Цитата ya2500 @
                    если поле замкнуть, то в нём станет возможным протянуть непрерывную линию, которая ведёт себя практически одинаково, не зависимо от своей длины. Это не есть хорошо.

                    В самом деле. Если диагональная линия просто будет в этом случае неизменной, то прямая начнет плодиться в стороны, порождая тривиальные решения, причем некислые по мощности. Правда, при N=5 прямая схлопнется в ноль на пятом ходу, так что не так уж и тривиально её поведение - но задачу можно свести до одномерной в этом случае, а это скучно.

                    Лин, считать не на чем :(
                    Долог путь в бессмертие... я еще вернусь.
                    Профильный скилл "Телепатия" 8%
                    ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
                    Прошу потестить игру.
                      Цитата
                      Лин, считать не на чем

                      Дык:
                      ExpandedWrap disabled
                        <!DOCTYPE html>
                        <html>
                        <head>
                        <meta charset="UTF-8">
                        <style>
                        #field { padding: 0; }
                        #field>div { padding: 0; margin: 0; }
                        #field>div>div { display: inline-block; padding: 0; margin: 0 2px; border-radius: 25%; box-sizing: border-box; border: 1px solid; }
                        .alive { background: #333; }
                        </style>
                        </head>
                        <body>
                        <div>
                        Размер поля: <input type="number" value="5" min="5" onchange="game.resize(Number(this.value), Number(this.value))"> клеток,
                        число ходов: <input type="number" value="5" min="5" onchange="game.maxStep = Number(this.value)">,
                        живых клеток: <span id="alive-cnt">0</span>
                        ход:<span id="step-cnt">0</span>
                        <br>
                        <input type="button" value="Пуск/Стоп" onclick="game.runStop()">
                        <input type="button" value="Сброс" onclick="game.reset()">
                        </div>
                        <br>
                        <div id="field"></div>
                         
                        <script>
                         
                        var game = {
                          field: [null, null, null],
                          width: 5,
                          height: 5,
                         
                          currentField: 0,
                          running: false,
                          stepDelay: 100,
                          currentStep: 0,
                          maxStep: 5,
                          cells: null,
                         
                          resize: function (w, h) {
                            this.running = false
                            this.width = w
                            this.height = h
                         
                            for (var i = 0; i < 3; i++) {
                              this.field[i] = new Array(h)
                              for (var j = 0; j < h; j++) {
                                this.field[i][j] = new Array(w)
                              }
                            }
                         
                            this.cells = new Array(h)
                            for (j = 0; j < h; j++) {
                              this.cells[j] = new Array(w)
                            }
                         
                            var cellSize = Math.min(Math.floor(500 / w - 4), 40)
                            var cell = document.createElement('div')
                            cell.setAttribute('style', 'width:' + cellSize + 'px;height:' + cellSize + 'px')
                            cell.setAttribute('onclick', 'game.toggleCell(this.dataset.x, this.dataset.y)')
                         
                            var field = document.getElementById('field')
                            field.innerHTML = ''
                            for (i = 0; i < h; i++) {
                              var row = document.createElement('div')
                              for (j = 0; j < w; j++) {
                                var c = cell.cloneNode()
                                c.dataset.x = j
                                c.dataset.y = i
                                row.appendChild(c)
                                this.cells[i][j] = c
                              }
                              field.appendChild(row)
                            }
                          },
                         
                          reset: function () {
                            this.running = false
                            this.currentStep = 0
                            this.currentField = 0
                            for (var i = 0; i < this.height; i++) {
                              for (var j = 0; j < this.width; j++) {
                                this.field[0][i][j] = this.field[2][i][j]
                              }
                            }
                         
                            this.draw()
                          },
                         
                          runStop: function () {
                            this.running = !this.running
                            if (!this.running) {
                              return
                            }
                         
                            if (!this.currentStep) {
                              for (var i = 0; i < this.height; i++) {
                                for (var j = 0; j < this.width; j++) {
                                  this.field[2][i][j] = this.field[this.currentField][i][j]
                                }
                              }
                            }
                         
                            this.step()
                          },
                         
                          step: function () {
                            if (!this.running || this.currentStep >= this.maxStep) {
                              return
                            }
                         
                            this.currentStep++
                            setTimeout(this.step.bind(this), this.stepDelay)
                         
                            var oldField = this.field[this.currentField]
                            var newField = this.field[1 - this.currentField]
                         
                            for (var i = 0; i < this.height; i++) {
                              for (var j = 0; j < this.width; j++) {
                                var alive = 0
                                for (var di = i - 1; di <= i + 1; di++) {
                                  for (var dj = j - 1; dj <= j + 1; dj++) {
                                    if (di >= 0 && di < this.height && dj >= 0 && dj < this.width && oldField[di][dj]) {
                                      alive++
                                    }
                                  }
                                }
                                if (oldField[i][j]) {
                                  newField[i][j] = (alive >= 3 && alive <= 4)
                                } else {
                                  newField[i][j] = (alive == 3)
                                }
                              }
                            }
                         
                            this.currentField = 1 - this.currentField
                            this.draw()
                          },
                         
                          draw: function () {
                            var alive = 0
                            var field = this.field[this.currentField]
                            for (var i = 0; i < this.height; i++) {
                              for (var j = 0; j < this.width; j++) {
                                if (field[i][j]) {
                                  alive++
                                }
                                this.cells[i][j].className = (field[i][j] ? 'alive' : '')
                              }
                            }
                            document.getElementById('alive-cnt').innerText = alive
                            document.getElementById('step-cnt').innerText = this.currentStep
                          },
                         
                          toggleCell: function (x, y) {
                            var field = this.field[this.currentField]
                            flag = !field[y][x]
                            field[y][x] = flag
                            this.cells[y][x].className = (flag ? 'alive' : '')
                          }
                        }
                         
                        game.resize(5, 5)
                         
                        </script>
                        </body>
                        </html>
                      Сообщение отредактировано: AVA12 -
                        Ну и для поддержания беседы: N = 6, R = 10, позиции (исходная/конечная):
                        ExpandedWrap disabled
                          ------  -***--
                          --**--  *---*-
                          --*---  ------
                          --*---  ------
                          --**--  *---*-
                          ------  -***--
                          Цитата Vesper @
                          Лин, считать не на чем


                          Ну так, эта игра - не для всех, а для программистов)

                          user posted image

                          Цитата AVA12 @
                          Ну и для поддержания беседы: N = 6, R = 10, позиции (исходная/конечная):


                          AVA12, надо было остановиться на шаг раньше. То есть, начальная расстановка - нулевой шаг. Тогда, на шестом шаге развития:

                          user posted image

                          - получаем новый рекорд R=16, его нужно побить, уже при новых ограничениях(N=7).

                          Добавлено
                          ===

                          AVA12, в твоей проге ввёл обычную мигалку (три клетки в ряд) и ввёл один ход. Её прокрутило в исходную позицию. То есть, было сделано два хода, а не один.

                          Добавлено
                          ===

                          И, да - я уже нашёл возможный следующий ход, но, будучи ведущим игры, дам его в следующи

                          Добавлено
                          й вторник(19-го).

                          Добавлено
                          Если никто не сделает ход раньше.
                            Ну, а если кто-то сделает ход раньше, то - получит заслуженную +1 в репу
                              Цитата ya2500 @
                              AVA12, в твоей проге ввёл обычную мигалку (три клетки в ряд) и ввёл один ход. Её прокрутило в исходную позицию. То есть, было сделано два хода, а не один.

                              Ошибка в условии останова, currentStep считается с нуля, а условие "больше", надо ставить
                              ExpandedWrap disabled
                                if (!this.running || this.currentStep >= this.maxStep)
                              Долог путь в бессмертие... я еще вернусь.
                              Профильный скилл "Телепатия" 8%
                              ТРОЛЛЬ - Троян Разрушительный Опасный, Лучше ЛинятЬ (с) Freezing Spell
                              Прошу потестить игру.
                                Действительно, лажанул. Уже исправил.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1408 ]   [ 14 queries used ]   [ Generated: 9.12.19, 16:43 GMT ]