Symuluj model 1D Game-of-Life-ish

12

To pytanie właśnie zyskało popularność podczas recenzowania kodu i pomyślałem, że może ci się spodobać dostosowanie do gry w codegolf:

Otrzymujesz niepustą listę x domów reprezentowanych jako booleany. Każdego dnia domy konkurują z sąsiednimi. 1 oznacza „aktywny” dom, a 0 oznacza „nieaktywny” dom. Jeśli sąsiedzi po obu stronach danego domu są albo aktywni, albo obaj nieaktywni, dom ten staje się nieaktywny następnego dnia. W przeciwnym razie staje się aktywny.

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

Na przykład, gdybyśmy mieli grupę sąsiadów [0, 1, 0], wówczas dom w [1] stałby się 0, ponieważ zarówno dom po lewej, jak i po prawej są nieaktywne. Komórki na obu końcach sprawdzają również przeciwną stronę, więc sąsiedzi o indeksie 0 znajdują się w indeksie length-1i indeksie 1 i odwrotnie. Nawet po zaktualizowaniu komórki należy wziąć pod uwagę jej poprzedni stan podczas aktualizacji innych, aby informacje o stanie każdej komórki były aktualizowane jednocześnie.

Funkcja przyjmuje tablicę stanów i liczbę kroków i powinna wyświetlać stan domów po określonej liczbie kroków.

    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]

Wykonaj listę i wykonaj dowolne kroki i wyślij wynikową listę za pomocą domyślnych operacji we / wy . Standardowe luki są zabronione. To jest codegolf, wygrywa najkrótsza odpowiedź w bajtach!

jaaq
źródło
8
+1 za automaty komórkowe. Czy to nie jest reguła 90?
HighlyRadioactive
2
Czy pierwszy przypadek testowy nie powinien dać rezultatu [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld
4
@jaaq Mam na myśli elementarną regułę automatów komórkowych (transformacji między każdym krokiem lub pokoleniami) # 90. Wpisz „Reguła 90” w Wolfram | Alpha.
HighlyRadioactive
12
wyświetl wynikową listę za pomocą STDOUT : wysoce zalecane jest, aby polegać tylko na naszych domyślnych metodach We / Wy .
Arnauld,
5
@jaaq Nie tyle zbieg okoliczności, co reguła # dla każdego standardowego automatu komórkowego 1D. Wynika to z faktu, że 3 bity mają 8 możliwych stanów (lewy sąsiad, jaźń, prawy sąsiad), a jeśli powiesz, że dla każdego z tych stanów dany dom będzie włączony lub wyłączony, to będzie to 8 wartości prawda / fałsz, które idealnie odwzorowują bajt. Zatem Reguła # 0-255 może być użyta jako skrót do opisania dowolnego z tych zestawów reguł, przyjmując wyrażenie binarne jako wynikowy stan włączenia / wyłączenia house w każdej z 8 sytuacji na podstawie pozycji w bajcie. Niektóre zasady są uważane za godne uwagi, takie jak 90, a zatem uznanie :)
Lunin

Odpowiedzi:

8

05AB1E , 14 13 10 9 6 bajtów

Oparty na rozwiązaniu Shaggy's Japt

F©Á®À^

Wypróbuj online!

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

Niepotrzebnie sprytne rozwiązanie 9-bajtowe:

F¥DO.øü+É

Wypróbuj online!

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])
Ponury
źródło
5

Python 2 , 72 bajty

f=lambda s,n:n and f([a^b for a,b in zip(s[-1:]+s,s[1:]+s[:1])],n-1)or s

Wypróbuj online!

TFeld
źródło
2

JavaScript (ES6), 57 bajtów

Pobiera dane wejściowe jako (steps)(array).

s=>g=a=>s--?g(a.map(_=>a[~-i++%l]^a[i%l],i=l=a.length)):a

Wypróbuj online!

Arnauld
źródło
2

Japt -mh , 11 10 9 bajtów

We / Wy stanów jako pojedyncze tablice 2D.

VÇí^Zé2)é

Spróbuj

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
Kudłaty
źródło
2

Siatkówka , 51 bajtów

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

Wypróbuj online! Wykonuje szereg działań na pierwszej linii i ciąg 0S i 1S na drugiej linii. Wyjaśnienie:

1A`

Usuń liczbę kroków z danych wejściowych.

"$+"{

Powtórz tę liczbę razy.

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

Skopiuj cyfry końcowe na drugie końce, aby zasymulować zawijanie.

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

Wykonaj operację XOR.

Neil
źródło
2

APL (Dyalog Extended) , 12 bajtów SBCS

Pełny program Monituje stdin o tablicę stanów, a następnie o liczbę kroków. Drukuje na standardowe wyjście.

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

Wypróbuj online!

pobierz dane wejściowe z konsoli (tablica stanów)

 w tej sprawie zastosuj ...

1()⍣⎕ Następująca ukryta funkcja, wprowadzająca liczbę razy, za każdym razem z 1lewym argumentem:

⌽⍢⌽ obróć prawy argument 1 krok w lewo, gdy jest odwrócony (tj. obróć jeden krok w prawo)

⌽≠ XOR z argumentem obróconym o 1 krok w lewo

Adám
źródło
2

Python 2 , 71 bajtów

f=lambda a,n:n and f([a[i-1]^(a+a)[i+1]for i in range(len(a))],n-1)or a

Wypróbuj online!

Chas Brown
źródło
1

Pyth , 24 bajty

AQVH=Gmxhded.:+eG+GhG3;G

Wypróbuj online!

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
źródło