QBasic, 309 bytes
Aviso: a versão golfed não é fácil de usar: possui um método de entrada estranho, é executado como um loop infinito e não possui nenhum atraso (portanto, é executado muito rápido em alguns sistemas). Somente execute-o se você souber finalizar um programa no seu ambiente QBasic. A versão ungolfed é recomendada (veja abaixo).
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
Para executar, especifique no prompt de entrada a largura w
e a altura da sua configuração h
. 1 Em seguida, digite w*h
os códigos de um dígito para as células (movendo-se da esquerda para a direita e depois de cima para baixo), com
0
= vazio
6
= fio
7
= cabeça de sinal
1
= cauda do sinal
Depois de inserir todas as células, a simulação começará (e continuará para sempre, até você finalizar o programa).
Ungolfed
Uma versão mais amigável. Para modificar o layout, modifique oDATA
instruções no final.
O código tira proveito da POINT
função, que lê o valor da cor de um pixel na tela. Isso significa que não precisamos armazenar as células separadamente como uma matriz. Para garantir que todas as células sejam atualizadas simultaneamente, realizamos as atualizações em uma segunda "página". Podemos alternar a página ativa usando uma versão da SCREEN
declaração e copiar o conteúdo de uma página para outra usando a PCOPY
declaração.
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 Os valores máximos de largura e altura dependem de qual modo de tela é usado. EmSCREEN 9
, a largura pode ser de até 638 e a altura de 348. SCREEN 7
possui uma resolução menor (tamanho máximo de configuração 318 por 198), mas os pixels são maiores e, portanto, mais fáceis de ver (no DOS QBasic ou no emulador DOSBox - infelizmente, o QB64 apenas abre uma janela menor).
Exemplo de execução
Versão não destruída em archive.org , com modo de tela 7: