Q 기본, 309 바이트
경고 : 골프 버전은 사용자에게 친숙하지 않습니다. 이상한 입력 방법이 있고 무한 루프로 실행되며 지연이 없습니다 (따라서 일부 시스템에서는 너무 빠르게 실행 됨). QBasic 환경에서 프로그램을 종료하는 방법을 알고있는 경우에만 실행하십시오. ungolfed 버전이 권장됩니다 (아래 참조).
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
실행하려면 입력 프롬프트에서 구성의 width w
및 height를 지정하십시오 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
DOS QBASIC 또는 도스 박스 에뮬레이터 (참조하는 것이 용이 작은 해상도 (최대 설정 크기 198 318)를 가지고 있지만, 화소는 더 큰 및 - 불행히도 QB64 그냥 더 작은 창을 제공합니다).
예제 실행
화면 모드가 7 인 archive.org의 ungolfed 버전 :
