QBasic, 309 Bytes
Warnung: Die Golf-Version ist nicht benutzerfreundlich: Sie verfügt über eine seltsame Eingabemethode, wird als Endlosschleife ausgeführt und hat keine Verzögerung (läuft daher auf einigen Systemen zu schnell). Führen Sie es nur aus, wenn Sie wissen, wie Sie ein Programm in Ihrer QBasic-Umgebung beenden. Die ungolfed Version wird empfohlen (siehe unten).
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
Geben Sie zum Ausführen an der Eingabeaufforderung die Breite w
und Höhe Ihrer Konfiguration an h
. 1 Geben Sie dann w*h
einstellige Codes für die Zellen ein (von links nach rechts, dann von oben nach unten), und drücken Sie
0
= leer
6
= Draht
7
= Signalkopf
1
= Signalschwanz
Sobald Sie alle Zellen eingegeben haben, beginnt die Simulation (und wird für immer fortgesetzt, bis Sie das Programm beenden).
Ungolfed
Eine benutzerfreundlichere Version. Ändern Sie zum Ändern des Layouts die DATA
Anweisungen am Ende.
Der Code nutzt die POINT
Funktion, die den Farbwert eines Pixels vom Bildschirm liest. Dies bedeutet, dass wir die Zellen nicht separat als Array speichern müssen. Um sicherzustellen, dass alle Zellen gleichzeitig aktualisiert werden, führen wir die Aktualisierungen auf einer zweiten "Seite" durch. Wir können die aktive Seite mit einer Version der SCREEN
Anweisung umschalten und den Inhalt einer Seite mit der PCOPY
Anweisung in eine andere kopieren .
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 Die Maximalwerte für Breite und Höhe hängen davon ab, welcher Bildschirmmodus verwendet wird. In SCREEN 9
kann die Breite bis zu 638 und die Höhe bis zu 348 SCREEN 7
betragen. Hat eine kleinere Auflösung (maximale Konfigurationsgröße 318 mal 198), aber die Pixel sind größer und daher leichter zu erkennen (auf DOS QBasic oder dem DOSBox-Emulator - leider nur auf QB64) ergibt ein kleineres Fenster).
Beispiellauf
Ungolfed-Version auf archive.org , mit Bildschirmmodus 7: