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
= сигнальный хвост
Как только вы вошли во все ячейки, начнется симуляция (и будет продолжаться до тех пор, пока вы не убьете программу).
Ungolfed
Более удобная версия. Чтобы изменить макет, измените 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: