QBasic, 309 bytes
Advertencia: la versión de golf no es fácil de usar: tiene un método de entrada extraño, funciona como un bucle infinito y no tiene ningún retraso (por lo tanto, se ejecuta demasiado rápido en algunos sistemas). Solo ejecútelo si sabe cómo terminar un programa en su entorno QBasic. Se recomienda la versión sin golf (ver más abajo).
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 ejecutar, especifique en el indicador de entrada el ancho w
y alto de su configuración h
. 1 Luego escriba w*h
códigos de un solo dígito para las celdas (moviéndose de izquierda a derecha, luego de arriba a abajo), con
0
= vacío
6
= cable
7
= cabeza de señal
1
= cola de señal
Una vez que haya ingresado todas las celdas, comenzará la simulación (y continuará para siempre, hasta que elimine el programa).
Sin golf
Una versión más fácil de usar. Para modificar el diseño, modifique las DATA
declaraciones al final.
El código aprovecha la POINT
función, que lee el valor de color de un píxel de la pantalla. Esto significa que no tenemos que almacenar las celdas por separado como una matriz. Para asegurarnos de que todas las celdas se actualicen simultáneamente, realizamos las actualizaciones en una segunda "página". Podemos alternar la página activa usando una versión de la SCREEN
declaración, y copiar el contenido de una página a otra usando la PCOPY
declaración.
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 Los valores máximos para ancho y alto dependen del modo de pantalla utilizado. En SCREEN 9
, el ancho puede ser de hasta 638 y la altura de hasta 348.SCREEN 7
tiene una resolución más pequeña (tamaño de configuración máximo de 318 por 198), pero los píxeles son más grandes y, por lo tanto, más fáciles de ver (en DOS QBasic o el emulador DOSBox, desafortunadamente QB64 solo da una ventana más pequeña).
Ejecución de ejemplo
Versión sin golf en archive.org , con modo de pantalla 7: