RosettaCodeData/Task/Langtons-ant/Whitespace/langtons-ant-2.ws
Ingy döt Net d066446780 langs a-z
2013-04-10 22:43:41 -07:00

37 lines
1.2 KiB
Text

; For easier access, the direction vector is stored at the end of the heap.
push 10003 dup push 100 store
push 1 sub dup push -1 store
push 1 sub dup push -100 store
push 1 sub dup push 1 store
0: ; Initialize the grid.
push 1 sub dup push 0 store
dup push 0 swap sub jn 0
push 5050 ; Start the ant at the center.
1: ; Make sure the ant's in bounds.
dup push 100 mod jn 2
dup push 100 div jn 2
push 100 copy 1 copy 1 mod sub jz 2
push 100 copy 1 copy 1 div sub jz 2
swap copy 1 load ; Get current cell state.
push 1 add push 2 mod ; Invert it.
copy 2 copy 1 store ; Then store it back.
push 2 mul push 5 add add push 4 mod ; Determine new direction.
swap copy 1 push 10000 add load add ; Update position accordingly.
jump 1
2: ; Initialize a counter and flow into the printer.
pop dup sub
3: ; Iterate over the cells.
dup load push 32 add ochr ; Print ' ' for off, '!' for on.
push 1 add dup ; Increment the counter.
push 100 mod jz 5 ; Branch at the end of a row.
4:
dup push 10000 sub jn 3 ; Go again unless counter is 10000.
pop exit ; All done, exit clean.
5: ; Print a newline and jump back to the counter check.
push 10 ochr jump 4