QBasic ขนาด 309 ไบต์
คำเตือน:เวอร์ชัน golfed นั้นไม่ได้ใช้งานง่าย: มันมีวิธีป้อนข้อมูลแปลก ๆ , ทำงานเป็นวนรอบไม่สิ้นสุดและไม่มีความล่าช้าใด ๆ (ดังนั้นจะทำงานเร็วเกินไปในบางระบบ) รันเฉพาะเมื่อคุณรู้วิธียกเลิกโปรแกรมในสภาพแวดล้อม 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
= wire
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: