Simula un modello 1D Game-of-Life-ish


12

Questa domanda è appena passata alla revisione del codice e ho pensato che ti potrebbe piacere adattarsi come una sfida di codegolf:

Ti viene dato un elenco non vuoto di x case rappresentate come booleane. Ogni giorno, le case competono con quelle adiacenti. 1 rappresenta una casa "attiva" e 0 rappresenta una casa "inattiva". Se i vicini su entrambi i lati di una determinata casa sono entrambi attivi o entrambi inattivi, quella casa diventa inattiva il giorno successivo. Altrimenti diventa attivo.

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

Ad esempio, se avessimo un gruppo di vicini [0, 1, 0], la casa in [1] diventerebbe 0 poiché entrambe le case alla sua sinistra e alla destra sono entrambe inattive. Le celle su entrambe le estremità controllano anche il lato opposto, quindi i vicini all'indice 0 sono all'indice length-1e indexn1 e viceversa. Anche dopo aver aggiornato la cella, è necessario considerare il suo stato precedente quando si aggiornano le altre in modo che le informazioni sullo stato di ciascuna cella vengano aggiornate contemporaneamente.

La funzione accetta la matrice di stati e un numero di passaggi e dovrebbe generare lo stato delle case dopo il dato numero di passaggi.

    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]

Prendi l'elenco e i passaggi che preferisci e visualizza l'elenco risultante tramite l' I / O predefinito . Sono vietate le scappatoie standard. Questo è codegolf, vince la risposta più breve in byte!


8
+1 per automi cellulari. Non è questa la regola 90, però?
Altamente radioattivo,

2
Il primo caso di test non dovrebbe comportare [0, 1, 0, 0, 1, 0, 1, 1]?
TFeld,

4
@jaaq Mi riferisco alla regola elementare degli automi cellulari (di trasformazione tra ogni passaggio o generazioni) n. 90. Digita "Regola 90" in Wolfram | Alpha.
Altamente radioattivo,

12
produce l'elenco risultante tramite STDOUT : si consiglia vivamente di fare affidamento solo sui nostri metodi I / O predefiniti .
Arnauld,

5
@jaaq Non è una coincidenza tanta quanto c'è una regola # per ogni automa cellulare 1D standard. Questo perché 3 bit ha 8 possibili stati (vicino di sinistra, sé, vicino di destra) e se dici per ciascuno di quegli stati una data casa sarà attivata o disattivata, ovvero 8 valori vero / falso che si associano perfettamente a un byte. Pertanto la Regola # 0-255 può essere usata come scorciatoia per descrivere uno di questi set di regole prendendo l'espressione binaria come lo stato on / off della risultante in ciascuna delle 8 situazioni in base alla posizione nel byte. Alcune regole sono considerate notevoli come 90, quindi il riconoscimento :)
Lunin,

Risposte:


8

05AB1E , 14 13 10 9 6 byte

Basato sulla soluzione Japt di Shaggy

F©Á®À^

Provalo online!

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

Soluzione a 9 byte inutilmente intelligente:

F¥DO.øü+É

Provalo 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

JavaScript (ES6), 57 byte

Accetta input come (steps)(array).

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

Provalo online!


2

Japt -mh , 11 10 9 byte

I / O degli stati come array 2D singleton.

VÇí^Zé2)é

Provalo

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 byte

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

Provalo online! Prende il numero di passi sulla prima linea e una serie di 0s e 1s sulla seconda riga. Spiegazione:

1A`

Elimina il numero di passaggi dall'input.

"$+"{

Ripeti quel numero di volte.

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

Copia le cifre finali alle altre estremità per simulare il wrapping.

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

Eseguire l'operazione XOR.


2

APL (Dyalog Extended) , 12 byte SBCS

Programma completo. Richiede stdin per array di stati e quindi per numero di passaggi. Stampa su stdout.

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

Provalo online!

ottenere input valutati dalla console (array di stati)

 su questo, applicare ...

1(... )⍣⎕ la seguente funzione tacita, inserisci il numero di volte, ogni volta con 1l'argomento sinistro:

⌽⍢⌽ ruota l'argomento destro di 1 passo a sinistra mentre è invertito (cioè ruota di un passo a destra)

⌽≠ XOR con l'argomento ruotato di 1 passo a sinistra




1

Pyth , 24 byte

AQVH=Gmxhded.:+eG+GhG3;G

Provalo 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.