Имитация модели 1D Game-of-Life-ish

12

Этот вопрос только что пересмотрен в ходе анализа кода, и я подумал, что вам может понравиться его адаптация в качестве задачи для Codegolf:

Вам дан непустой список x домов, представленных как логические значения. Каждый день дома конкурируют с соседними. 1 представляет «активный» дом, а 0 представляет «неактивный» дом. Если соседи по обе стороны данного дома либо активны, либо оба неактивны, то этот дом становится неактивным на следующий день. В противном случае он становится активным.

def get_state_as_pos(thelist, pos):
    if thelist[pos-1] == thelist[pos+1]:
        return 0
    else:
        return 1

Например, если бы у нас была группа соседей [0, 1, 0], то дом в [1] стал бы 0, так как оба дома слева и справа оба неактивны. Ячейки на обоих концах также проверяют противоположную сторону, поэтому соседи по индексу 0 находятся по индексу length-1и по индексу n1, и наоборот. Даже после обновления ячейки вы должны учитывать ее предыдущее состояние при обновлении других, чтобы информация о состоянии каждой ячейки обновлялась одновременно.

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

    input: states = [1, 0, 0, 0, 0, 1, 0, 0], steps = 1
   output should be [0, 1, 0, 0, 1, 0, 1, 1]

    input: states = [1, 1, 1, 0, 1, 1, 1, 1], steps = 2
intermediate state= [0, 0, 1, 0, 1, 0, 0, 0]
   output should be [0, 1, 0, 0, 0, 1, 0, 0]


    input: states = [1], steps=1
    output: states= [0]

Возьмите список и шаги, как вам нравится, и выведите итоговый список через ввод / вывод по умолчанию . Стандартные лазейки запрещены. Это Codegolf, кратчайший ответ в байтах выигрывает!

jaaq
источник
8
+1 для сотовых автоматов. Разве это не правило 90, правда?
ВысокоРадиоактивный
2
Не должен ли первый контрольный пример привести [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld
4
@jaaq Я имею в виду правило элементарных клеточных автоматов (преобразования между каждым шагом или поколением) # 90. Тип "Правило 90" в Вольфраме | Альфа.
СильноРадиоактивный,
12
выводить результирующий список через STDOUT : настоятельно рекомендуется просто полагаться на наши методы ввода / вывода по умолчанию .
Арно
5
@jaaq Не так много совпадений, как правило для каждого стандартного 1D сотового автомата. Это связано с тем, что 3 бита имеют 8 возможных состояний (левый сосед, «я», правый сосед), и если вы говорите, что для каждого из этих состояний данный дом будет включен или выключен, то это 8 значений «истина / ложь», которые идеально отображаются в байт. Таким образом, правило № 0-255 можно использовать в качестве сокращения для описания любого из этих наборов правил, принимая двоичное выражение в качестве результирующего состояния включения / выключения дома в каждой из 8 ситуаций на основе положения в байте. Некоторые правила считаются известными, например, 90, таким образом, признание :)
Лунин

Ответы:

8

05AB1E , 14 13 10 9 6 байтов

На основе решения Shaggy's Japt

F©Á®À^

Попробуйте онлайн!

F                  # repeat n times:
 ©Á                #  the list, rotated right
   ®À              #  the list, rotated left
     ^             #  xor (vectorizes)

Неоправданно умное 9-байтовое решение:

F¥DO.øü+É

Попробуйте онлайн!

F                  # repeat n times:
                   #  (examples given for the initial state [0, 1, 1, 0, 1])
 ¥                 #  deltas of the list ([1, 0, -1, 1])
  D                #  duplicate
   O               #  sum (1)
    .ø             #  surround ([1, 1, 0, -1, 1, 1])
      ü+           #  pairwise addition ([2, 1, -1, 0, 2])
        É          #  modulo 2 ([0, 1, 1, 0, 0])
Grimmy
источник
2

Japt -mh , 11 10 9 байт

Ввод / вывод состояний в виде одноэлементных двумерных массивов.

VÇí^Zé2)é

Попробуй это

VÇí^Zé2)é     :Implicit input of integer U=steps & array V=[states]
VÇ            :Modify the last element Z in V
  í           :Interleave with
    Zé2       :  Z rotated right twice and
   ^          :  Reduce each pair by XOR
       )      :End interleave
        é     :Rotate right once
              :Repeat U times and implicitly output V
мохнатый
источник
2

Сетчатка , 51 байт

1A`
"$+"{`(.).*(.)
$2$&$1
(.)(?=.(\1|(.)))?
$#2*$#3

Попробуйте онлайн! Принимает количество шагов в первой строке и строку 0s и 1s во второй строке. Объяснение:

1A`

Удалите количество шагов из ввода.

"$+"{

Повторите это число раз.

`(.).*(.)
$2$&$1

Скопируйте конечные цифры на другие концы, чтобы имитировать перенос.

(.)(?=.(\1|(.)))?
$#2*$#3

Выполните операцию XOR.

Нил
источник
2

APL (Dyalog Extended) , 12 байтов SBCS

Полная программа. Запрашивает stdin для массива состояний, а затем для количества шагов. Печать на стандартный вывод.

1(⌽≠⌽⍢⌽)⍣⎕⊢⎕

Попробуйте онлайн!

получить оцененный ввод из консоли (массив состояний)

 на что, применить ...

1()⍣⎕ Следующая молчаливая функция, введите число раз, каждый раз в 1качестве левого аргумента:

⌽⍢⌽ повернуть правый аргумент на 1 шаг влево при обращении назад (т.е. повернуть на один шаг вправо)

⌽≠ XOR с аргументом повернутым на 1 шаг влево

Адам
источник
1

Pyth , 24 байта

AQVH=Gmxhded.:+eG+GhG3;G

Попробуйте онлайн!

AQ                        # G, H = Q[0], Q[1] # Q = input in the form [[states],steps]
  VH                      # for i in range(H):
    =G                    # G = 
      m                   #     map(lambda d:                              )
       xhded              #                   d[0] ^ d[-1],
            .:       3    #         substrings(                 , length=3)
              +eG+GhG     #                     G[-1] + G + G[0]
                      ;   # (end for loop)
                       G  # print G
ar4093
источник