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
одноцифрові коди для комірок (рухаючись ліворуч направо, потім зверху вниз), за допомогою
0
= порожній
6
= дріт
7
= сигнальна голова
1
= сигнальний хвіст
Після введення всіх комірок моделювання розпочнеться (і триватиме назавжди, поки ви не вб'єте програму).
Безумовно
Більш зручна версія. Щоб змінити макет, змініть DATA
оператори в кінці.
Код використовує перевагу POINT
функції, яка зчитує значення кольору пікселя з екрану. Це означає, що нам не потрібно зберігати комірки окремо як масив. Щоб переконатися, що всі осередки оновлюються одночасно, ми виконуємо оновлення на другій "сторінці". Ми можемо переключити активну сторінку за допомогою версії 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 на 198), але пікселі є більшими і тому їх легше бачити (на DOS QBasic або емуляторі DOSBox - на жаль QB64 просто дає менше вікно).
Приклад виконання
Невикористана версія на archive.org , у режимі екрану 7: