Simule um modelo de jogo da vida 1D


12

Esta questão acabou de rever a revisão de código e imaginei que você poderia adaptá-la como um desafio do codegolf:

Você recebe uma lista não vazia de x casas representadas como booleanos. A cada dia, as casas competem com as adjacentes. 1 representa uma casa "ativa" e 0 representa uma casa "inativa". Se os vizinhos de ambos os lados de uma determinada casa estiverem ativos ou inativos, essa casa ficará inativa no dia seguinte. Caso contrário, ele se torna ativo.

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

Por exemplo, se tivéssemos um grupo de vizinhos [0, 1, 0], a casa em [1] se tornaria 0, pois a casa à esquerda e à direita estão inativas. As células em ambas as extremidades também verificam o lado oposto; portanto, os vizinhos no índice 0 estão no índice length-1e no indexn1 e vice-versa. Mesmo após a atualização da célula, é necessário considerar seu estado anterior ao atualizar as demais, para que as informações de estado de cada célula sejam atualizadas simultaneamente.

A função pega a matriz de estados e várias etapas e deve gerar o estado das casas após o número especificado de etapas.

    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]

Siga a lista e as etapas da maneira que desejar e envie a lista resultante via E / S padrão . As brechas padrão são proibidas. Este é o codegolf, a resposta mais curta em bytes ganha!


8
+1 para autômatos celulares. Não é esta regra 90, no entanto?
HighlyRadioactive

2
O primeiro caso de teste não deve resultar [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld 17/09/19

4
@jaaq Estou me referindo à Regra Elementar de Autômatos Celulares (de transformação entre cada etapa ou gerações) # 90. Digite "Regra 90" em Wolfram | Alpha.
HighlyRadioactive

12
saída da lista resultante via STDOUT : é altamente recomendável confiar apenas em nossos métodos de E / S padrão .
Arnauld

5
@jaaq Não há muita coincidência, pois existe uma Regra # para todos os autômatos celulares 1D padrão. Isso ocorre porque 3 bits possui 8 estados possíveis (vizinho à esquerda, auto, vizinho à direita) e, se você disser para cada um desses estados, uma determinada casa estará ativada ou desativada com 8 valores verdadeiro / falso, que são mapeados perfeitamente para um byte. Assim, a Regra 0-255 pode ser usada como atalho para descrever qualquer um desses conjuntos de regras, considerando a expressão binária como o estado de ativação / desativação resultante em cada uma das 8 situações com base na posição no byte. Algumas regras são consideradas notáveis, como 90, portanto, o reconhecimento :) #
Lunin

Respostas:


8

05AB1E , 14 13 10 9 6 bytes

Baseado na solução Japt de Shaggy

F©Á®À^

Experimente online!

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

Solução de 9 bytes desnecessariamente inteligente:

F¥DO.øü+É

Experimente 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])




2

Japonês -mh , 11 10 9 bytes

E / S de estados como matrizes 2D singleton.

VÇí^Zé2)é

Tente

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

Retina , 51 bytes

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

Experimente online! Toma o número de passos na primeira linha e uma série de 0s e 1s na segunda linha. Explicação:

1A`

Exclua o número de etapas da entrada.

"$+"{

Repita esse número vezes.

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

Copie os dígitos finais para as outras extremidades para simular quebra automática.

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

Execute a operação XOR.


2

APL (Dyalog Extended) , SBCS de 12 bytes

Programa completo. Solicita ao stdin a matriz de estados e, em seguida, o número de etapas. Imprime em stdout.

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

Experimente online!

obtenha entrada avaliada do console (matriz de estados)

 nisso, aplique…

1(… A )⍣⎕ seguinte função tácita, insira o número de vezes, sempre com o 1argumento à esquerda:

⌽⍢⌽ gire o argumento da direita 1 passo à esquerda enquanto invertido (ou seja, gire um passo à direita)

⌽≠ XOR com o argumento girado 1 passo à esquerda




1

Pitão , 24 bytes

AQVH=Gmxhded.:+eG+GhG3;G

Experimente 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.