QBasic, 309 octets
Attention: la version golfée n'est pas conviviale: elle a une méthode de saisie bizarre, fonctionne comme une boucle infinie, et n'a pas de retard (donc, tourne trop vite sur certains systèmes). Exécutez-le uniquement si vous savez comment terminer un programme dans votre environnement QBasic. La version non golfée est recommandée (voir ci-dessous).
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
Pour exécuter, spécifiez à l'invite de saisie la largeur w
et la hauteur de votre configuration h
.1 saisissez Puis w*h
codes à un seul chiffre pour les cellules ( se déplaçant de gauche à droite, puis de haut en bas), avec
0
= vide
6
= fil
7
= tête de signal
1
= queue de signal
Une fois que vous avez entré toutes les cellules, la simulation commencera (et se poursuivra indéfiniment, jusqu'à ce que vous tuiez le programme).
Non golfé
Une version plus conviviale. Pour modifier la mise en page, modifiez les DATA
instructions à la fin.
Le code tire parti de la POINT
fonction, qui lit la valeur de couleur d'un pixel à l'écran. Cela signifie que nous n'avons pas à stocker les cellules séparément sous forme de tableau. Pour nous assurer que toutes les cellules sont mises à jour simultanément, nous effectuons les mises à jour sur une deuxième "page". Nous pouvons basculer la page active à l'aide d'une version de l' SCREEN
instruction et copier le contenu d'une page dans une autre à l'aide de l' PCOPY
instruction.
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 Les valeurs maximales de largeur et de hauteur dépendent du mode d'écran utilisé. Dans SCREEN 9
, la largeur peut aller jusqu'à 638 et la hauteur jusqu'à 348.SCREEN 7
a une résolution plus petite (taille de configuration maximale 318 par 198), mais les pixels sont plus grands et donc plus faciles à voir (sur DOS QBasic ou l'émulateur DOSBox - malheureusement QB64 juste donne une fenêtre plus petite).
Exemple d'exécution
Version non golfée sur archive.org , avec le mode écran 7: