Langton's ant: Difference between revisions
Content added Content deleted
No edit summary |
(Added Forth version) |
||
Line 2,855: | Line 2,855: | ||
Finished in 11669 iterations |
Finished in 11669 iterations |
||
</pre> |
</pre> |
||
=={{header|Forth}}== |
|||
{{works with|GNU Forth|0.7.0}} |
|||
All array manipulations were taken form Rosetta Code example. |
|||
<lang forth> |
|||
1 0 0 0 \ pushes orientation of the ant to the stack. |
|||
100 CONSTANT border \ lenght of the side of the grid |
|||
border border * constant size \ size of the grid |
|||
variable antpos \ for storing position of the ant |
|||
size 2 / border 2 / + antpos ! \ positions ant in the middle of the grid |
|||
create Grid size cells allot |
|||
here constant GridEnd \ creates an array to hold the grid |
|||
: turn.left |
|||
>r rot r> SWAP ; \ rotates ant anti-clockwise |
|||
: turn.right |
|||
turn.left turn.left turn.left ; \ rotates ant clockwise |
|||
: stop.ant |
|||
antpos @ DUP 0< SWAP size > + ; \ checks if ant not out of bounds |
|||
: call.pos |
|||
Grid antpos @ cells + @ ; \ pushes ant position to the stack |
|||
: grid.add |
|||
Grid antpos @ cells + @ -1 + Grid antpos @ cells + ! ; \ pushes -1 to the current position of the ant on the grid |
|||
: swap.pos |
|||
call.pos dup * Grid antpos @ cells + ! ; \ multiplies current grid cell by itself to turn -1 into 1 |
|||
: swap.col |
|||
grid.add swap.pos ; \ changes current grid cell color |
|||
: go.ant \ moves ant one step in the direction taken from the stack |
|||
2over 2over \ copies stack for testing |
|||
1 = IF antpos @ border + antpos ! 2DROP DROP ELSE \ if true moves ant one cell up, drops unused numbers from stack |
|||
1 = IF antpos @ 1 + antpos ! 2DROP ELSE \ same, but moves to the right |
|||
1 = IF antpos @ border - antpos ! DROP ELSE \ here to the left |
|||
1 = IF antpos @ 1 - antpos ! ELSE \ and down |
|||
THEN THEN THEN THEN ; |
|||
: step.ant \ preforms one full step. |
|||
call.pos 1 = IF turn.left swap.col ELSE |
|||
turn.right swap.col |
|||
THEN go.ant ; |
|||
: run.ant \ runs the ant until it leaves the grid |
|||
BEGIN |
|||
step.ant |
|||
stop.ant UNTIL ; |
|||
: square.draw \ draws an "*" if grid cell is one or " " if zero |
|||
1 = IF 42 EMIT ELSE 32 EMIT THEN ; |
|||
: draw.grid \ draws grid on screen |
|||
PAGE \ clear sreen |
|||
size 0 DO I |
|||
I border MOD 0= IF CR THEN \ breaks the grid into lines |
|||
Grid I cells + @ square.draw DROP |
|||
LOOP ; |
|||
: langton.ant run.ant draw.grid ; \ launches the ant, outputs the result |
|||
</lang> |
|||
{{out}} |
|||
<pre style="height:60ex;overflow:scroll"> |
|||
** |
|||
** |
|||
** ** *** ** * |
|||
* ** *** **** * * |
|||
* ** * ** ** * * |
|||
** * * ******* *** ** |
|||
* * * ** * * ***** * * |
|||
*** * **** ** *** * ** |
|||
** * * ** * * ** **** ****** |
|||
* * * * ** ** * * ***** * |
|||
*** ** * * * ***** * ** * *** |
|||
** ** *** ** *** ** **** * * |
|||
*** *** * * * *** * * ** |
|||
* * ********* ***** **** |
|||
*** *** ** * * * ** * |
|||
***** ***** ** ***** * * * |
|||
** * ******* *** ****** ***** * *** |
|||
* ** ** *** * * * * * * |
|||
*** *** * ** ** * * ** * |
|||
* * * * * ***** * * ** |
|||
** *** * * ** ** * * * |
|||
* * * * * * ** * * *** ** * |
|||
* *** * * * * **** ** ** **** |
|||
* ** *** ** * * * **** * ** |
|||
* ** *** * **** *** ** ** |
|||
* *** *** *** ** * * |
|||
* * * * **** **** ** ** |
|||
* ** *** ** * ** **** *** * * |
|||
* * * ***** * * *** *** |
|||
* **** * *** ** *** * * * |
|||
* * ** ** ** **** ** ** **** |
|||
* * ** ** * ******* |
|||
*** ** ** * *** * ** * * |
|||
*** ** ****** * * **** * |
|||
* ** * ** ** **** * ** **** * |
|||
* ******* ****** * ** * * * |
|||
* * ** * * ** ****** * * |
|||
* ** *** * * ******* * ** |
|||
** * ** * * * ** * ** *** |
|||
****** ** ***** * |
|||
* * ***** * * * |
|||
** * * ** * * |
|||
** * ** * ** * *** |
|||
* ** * * * * *** |
|||
* **** ** * * * |
|||
*** * * *** **** |
|||
* ** ** ** * |
|||
** ** * *** |
|||
** * ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * *** |
|||
* ** ** * |
|||
** * ***** |
|||
* * **** |
|||
** *** * |
|||
* * ** ok |
|||
</pre> |
|||
=={{header|Fortran}}== |
=={{header|Fortran}}== |