QBasic, 309 byte
Attenzione: la versione golfata non è intuitiva: ha uno strano metodo di input, funziona come un ciclo infinito e non ha alcun ritardo (quindi, funziona troppo velocemente su alcuni sistemi). Eseguilo solo se sai come terminare un programma nel tuo ambiente QBasic. Si consiglia la versione non golfata (vedi sotto).
INPUT w,h
SCREEN 9
FOR y=1TO h
FOR x=1TO w
PSET(x,y),VAL(INPUT$(1))
NEXT
NEXT
DO
FOR y=1TO h
FOR x=1TO w
SCREEN,,0
c=POINT(x,y)
d=c
IF c=7THEN d=1
IF c=1THEN d=6
IF c=6THEN
n=0
FOR v=y-1TO y+1
FOR u=x-1TO x+1
n=n-(POINT(u,v)=7)
NEXT
NEXT
d=7+(n=0OR n>2)
END IF
SCREEN,,1,0
PSET(x,y),d
NEXT
NEXT
PCOPY 1,0
LOOP
Per eseguire, specificare al prompt di input la larghezza w
e l'altezza della configurazione h
. 1 Quindi digitare i w*h
codici a una cifra per le celle (spostandosi da sinistra a destra, quindi dall'alto verso il basso), con
0
= vuoto
6
= filo
7
= testa del segnale
1
= coda del segnale
Dopo aver inserito tutte le celle, la simulazione avrà inizio (e continuerà per sempre, fino a quando non si uccide il programma).
Ungolfed
Una versione più user-friendly. Per modificare il layout, modificare le DATA
istruzioni alla fine.
Il codice sfrutta la POINT
funzione, che legge il valore di colore di un pixel dallo schermo. Ciò significa che non è necessario archiviare le celle separatamente come matrice. Per assicurarci che tutte le celle si aggiornino contemporaneamente, eseguiamo gli aggiornamenti su una seconda "pagina". È possibile attivare o disattivare la pagina attiva utilizzando una versione SCREEN
dell'istruzione e copiare il contenuto di una pagina in un'altra utilizzando l' PCOPY
istruzione.
SCREEN 9
EMPTY = 0 ' Black
HEAD = 7 ' Light gray
TAIL = 1 ' Blue
WIRE = 6 ' Brown/orange
' First two data values are the width and height
READ w, h
' The rest are the initial configuration, row by row
' Read them and plot the appropriately colored pixels
FOR y = 1 TO h
FOR x = 1 TO w
READ state$
IF state$ = "" THEN value = EMPTY
IF state$ = "H" THEN value = HEAD
IF state$ = "T" THEN value = TAIL
IF state$ = "W" THEN value = WIRE
PSET (x, y), value
NEXT x
NEXT y
' Loop the simulation until user presses a key
DO UNTIL INKEY$ <> ""
' Store current time for delay purposes
t# = TIMER
FOR y = 1 TO h
FOR x = 1 TO w
' Active page = display page = 0
SCREEN , , 0
' Get the color value of the pixel at x,y
oldVal = POINT(x, y)
IF oldVal = EMPTY THEN
newVal = EMPTY
ELSEIF oldVal = HEAD THEN
newVal = TAIL
ELSEIF oldVal = TAIL THEN
newVal = WIRE
ELSEIF oldVal = WIRE THEN
neighbors = 0
FOR ny = y - 1 TO y + 1
FOR nx = x - 1 TO x + 1
IF POINT(nx, ny) = HEAD THEN neighbors = neighbors + 1
NEXT nx
NEXT ny
IF neighbors = 1 OR neighbors = 2 THEN
newVal = HEAD
ELSE
newVal = WIRE
END IF
END IF
' Active page = 1, display page = 0
SCREEN , , 1, 0
' Plot the new value on page 1
PSET (x, y), newVal
NEXT x
NEXT y
' Copy page 1 to page 0
PCOPY 1, 0
' Delay
WHILE TIMER >= t# AND t# + 0.2 > TIMER
WEND
LOOP
DATA 8,5
DATA T,H,W,W,W,W,W,W
DATA W, , , ,W, , ,
DATA , , ,W,W,W, ,
DATA W, , , ,W, , ,
DATA H,T,W,W, ,W,W,W
1 I valori massimi per larghezza e altezza dipendono dalla modalità schermo utilizzata. In SCREEN 9
, la larghezza può essere fino a 638 e l'altezza fino a 348. SCREEN 7
ha una risoluzione più piccola (dimensione massima della configurazione 318 per 198), ma i pixel sono più grandi e quindi più facili da vedere (su DOS QBasic o l'emulatore DOSBox - purtroppo QB64 solo dà una finestra più piccola).
Esempio di esecuzione
Versione non golfata su archive.org , con modalità schermo 7: