QBasic, 309 bayt
Uyarı: golflü versiyon kullanıcı dostu değildir: tuhaf bir giriş metoduna sahiptir, sonsuz bir döngü olarak çalışır ve herhangi bir gecikme yoktur (bu nedenle, bazı sistemlerde çok hızlı çalışır). QBasic ortamınızdaki bir programı nasıl sonlandıracağınızı biliyorsanız sadece çalıştırın. Ungolfed versiyonu tavsiye edilir (aşağıya bakınız).
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
Çalıştırmak için, giriş isteminde yapılandırmanızın genişliğini w
ve yüksekliğini belirtin h
. 1 Ardından w*h
, hücreler için tek basamaklı kodlar yazın (önce soldan sağa, sonra yukarıdan aşağıya hareket)
0
= boş
6
= tel
7
= sinyal kafası
1
= sinyal kuyruğu
Tüm hücrelere girdikten sonra, simülasyon başlayacaktır (ve programı öldürene kadar sonsuza kadar devam edecektir).
Ungolfed
Daha kullanıcı dostu bir versiyon. Düzeni değiştirmek için DATA
, sonunda ifadeleri değiştirin .
Kod POINT
, bir pikselin renk değerini ekrandan okuyan işlevden yararlanır . Bu, hücreleri ayrı ayrı dizi olarak saklamamız gerekmediği anlamına gelir. Tüm hücrelerin eşzamanlı olarak güncelleştirildiğinden emin olmak için güncellemeleri ikinci bir "sayfada" yaparız. İfadenin bir sürümünü kullanarak etkin sayfayı değiştirebilir ve SCREEN
ifadeyi kullanarak bir sayfanın içeriğini diğerine kopyalayabiliriz PCOPY
.
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 Genişlik ve yükseklik için maksimum değerler, hangi ekran modunun kullanıldığına bağlıdır. İçinde SCREEN 9
, genişlik 638'e kadar olabilir ve 348'e kadar yükseklik olabilir. SCREEN 7
Daha küçük bir çözünürlüğe sahiptir (maksimum 1988'e göre yapılandırma boyutu 318), ancak pikseller daha büyük ve böylece daha kolay görünür (DOS QBasic veya DOSBox emülatöründe - ne yazık ki sadece QB64 daha küçük bir pencere verir).
Örnek çalışma
Archive.org'daki , Ungolfed versiyon, ekran modu 7: