На главную
ПРАВИЛА 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,1362 ]   [ 19 queries used ]   [ Generated: 6.12.19, 19:09 GMT ]