QBasic, 309 byte
Peringatan: versi golf tidak ramah-pengguna: ia memiliki metode input yang aneh, berjalan sebagai loop tak terbatas, dan tidak memiliki penundaan (dengan demikian, berjalan terlalu cepat pada beberapa sistem). Jalankan saja jika Anda tahu cara menghentikan program di lingkungan QBasic Anda. Versi ungolfed direkomendasikan (lihat di bawah).
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
Untuk menjalankan, tentukan di input prompt lebar w
dan tinggi konfigurasi Anda h
. 1 Kemudian ketikkan w*h
kode satu digit untuk sel (bergerak dari kiri ke kanan, lalu dari atas ke bawah), dengan
0
= kosong
6
= kawat
7
= kepala sinyal
1
= sinyal ekor
Setelah Anda memasukkan semua sel, simulasi akan dimulai (dan berlanjut selamanya, sampai Anda mematikan program).
Tidak disatukan
Versi yang lebih ramah pengguna. Untuk memodifikasi tata letak, ubah DATA
pernyataan di bagian akhir.
Kode mengambil keuntungan dari POINT
fungsi, yang membaca nilai warna piksel dari layar. Ini berarti kita tidak perlu menyimpan sel secara terpisah sebagai array. Untuk memastikan bahwa semua sel memperbarui secara bersamaan, kami melakukan pembaruan pada "halaman" kedua. Kita dapat beralih halaman aktif menggunakan versi SCREEN
pernyataan, dan menyalin konten satu halaman ke yang lain menggunakan PCOPY
pernyataan itu.
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 Nilai maksimum untuk lebar dan tinggi tergantung pada mode layar mana yang digunakan. Dalam SCREEN 9
, lebar bisa hingga 638 dan tinggi hingga 348. SCREEN 7
memiliki resolusi lebih kecil (ukuran konfigurasi maks 318 kali 198), tetapi pikselnya lebih besar dan karenanya lebih mudah dilihat (pada DOS QBasic atau emulator DOSBox - sayangnya QB64 hanya memberikan jendela yang lebih kecil).
Contoh dijalankan
Versi ungolfed di archive.org , dengan mode layar 7: