QBasic、309バイト
警告:ゴルフバージョンはユーザーフレンドリーではありません:奇妙な入力メソッドを持ち、無限ループとして実行され、遅延がありません(したがって、一部のシステムでは実行速度が速すぎます)。QBasic環境でプログラムを終了する方法を知っている場合にのみ実行してください。無償版が推奨されます(以下を参照)。
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
実行するには、入力プロンプトで構成の幅w
と高さを指定しますh
。1次にw*h
、セルに1桁のコードを入力します(左から右、上から下に移動)。
0
=空
6
=ワイヤー
7
=信号ヘッド
1
=シグナルテール
すべてのセルを入力すると、シミュレーションが開始されます(プログラムを強制終了するまで永久に続行されます)。
非ゴルフ
よりユーザーフレンドリーなバージョン。レイアウトを変更するにはDATA
、最後にステートメントを変更します。
コードはPOINT
、画面からピクセルの色の値を読み取る関数を利用します。これは、セルを配列として個別に保存する必要がないことを意味します。すべてのセルが同時に更新されるように、2番目の「ページ」で更新を実行します。SCREEN
ステートメントのバージョンを使用してアクティブなページを切り替え、ステートメントを使用してあるページのコンテンツを別のページにコピーできます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幅と高さの最大値は、使用する画面モードによって異なります。ではSCREEN 9
、幅は最大638、高さは最大348です。SCREEN 7
解像度は小さくなります(最大構成サイズ318 x 198)が、ピクセルが大きくなり、見やすくなります(DOS QBasicまたはDOSBoxエミュレーター-残念ながらQB64のみ)より小さなウィンドウを提供します)。
実行例
画面モード7のarchive.orgのゴルフバージョン: