Langton's ant: Difference between revisions

Added Algol 68
(Added Algol 68)
Line 213:
return 0;
}</lang>
 
=={{header|ALGOL 68}}==
<lang algol68>BEGIN
# size of board for Langton's ant #
INT max board = 100;
[ 1 : max board, 1 : max board ]CHAR board;
# start with the board all white #
CHAR white = " ", black = "#";
FOR r TO 1 UPB board DO FOR c TO 2 UPB board DO board[ r, c ] := white OD OD;
# possible ant directions #
INT head left = 0, head up = 1, head right = 2, head down = 3;
# returns the new direction if we turn left from curr direction #
OP LEFT = ( INT curr direction )INT:
IF curr direction = head left THEN head down
ELIF curr direction = head down THEN head right
ELIF curr direction = head right THEN head up
ELSE head left
FI ; # LEFT #
# returns the new direction if we turn right from curr direction #
OP RIGHT = ( INT curr direction )INT:
IF curr direction = head left THEN head up
ELIF curr direction = head up THEN head right
ELIF curr direction = head right THEN head down
ELSE head left
FI ; # RIGHT #
# move the ant until it leaves the board #
INT ant row := max board OVER 2;
INT ant col := max board OVER 2;
INT ant direction := head up;
INT max row := 1;
INT max col := 1;
INT min row := max board;
INT min col := max board;
INT moves := 0;
WHILE ant row >= 1 LWB board AND ant row <= 1 UPB board
AND ant col >= 2 LWB board AND ant col <= 2 UPB board
DO
moves +:= 1;
IF ant row > max row THEN max row := ant row FI;
IF ant col > max col THEN max col := ant col FI;
IF ant row < min row THEN min row := ant row FI;
IF ant col < min col THEN min col := ant col FI;
IF board[ ant row, ant col ] = white THEN
# ant turns right on a white square #
ant direction := RIGHT ant direction;
board[ ant row, ant col ] := black
ELSE
# ant turns left on a black square #
ant direction := LEFT ant direction;
board[ ant row, ant col ] := white
FI;
# move the ant #
IF ant direction = head up THEN ant row -:= 1
ELIF ant direction = head down THEN ant row +:= 1
ELIF ant direction = head left THEN ant col -:= 1
ELSE # ant direction = head right # ant col +:= 1
FI
OD;
# show resultant position #
print( ( "After ", whole( moves, 0 ), " moves."
, " Showing rows ", whole( min row,0 ), " to ", whole( max row, 0 )
, " columns ", whole( min col,0 ), " to ", whole( max col, 0 )
, newline
)
);
FOR r FROM min row TO max row DO
print( ( board[ r, min col : max col ], newline ) )
OD
END</lang>
{{out}}
<pre>
After 11655 moves. Showing rows 28 to 78 columns 1 to 79
## ############ ##
# #### # ##
### ## ## #
# # # # # #
## ## # # ### #
### # # # # ## ## ###
# # ### ## #### ## # # # ## ##
# ### ## # ## ### # # ### ###
# # ##### # # #### # ### # # #
### ## # #### ## ## ###### # ### # #
# ### # ## # # ## ## ## # ##### ### ##
# # # ## ### # # # #### # ##
# # ## ## # ## ## # ##
### # # ## ### # ## # ### ## ## #
# ### ## ## ## ### # # ## #### #
### # # # # # #### ## # ## ### # #
# ### # ## # # ### # ### ## # # ##
### # # ## # ## ## ##### #### #### ## #
# ### # # # # ### # # ## ## # # # # #
### # ## ### ## # ## #### #### # #
# ### # # # ## ########### # #### # # #
### # ## # #### ## ######### # ## # ##
# ### # # ## # ## ## ## ### ### # # ## #### #
### # ## # # ###### ## # ## # # ### ### ## #
# ### # # # ##### # ##### # # ## # ## #
### # ## # # ## ##### ## # # # # ## # # #
# ### # # # # #### # ##### ## ########## ##
### # ## # ## ## # # #### # ## #### ##
# ### # # ##### # ## ## # # # # # # # #
### # ## ## ## # # # ## ## # # ## # ## ##
# ### # # # # # ######## # # ## #### #
### # ## # # # ## ## # # ## #
# ### # # # # # # ## ## ## ####
### # ## ## # ## ## # # ###
# ### # # # ## #### #### ### ####
### # ## ## #### ## # ## # # #
# ### # # ## ## ## ### ## #####
### # ## # ## # ####
# ### # # ## ## ##
### # ## ##
# ### # # # ## #### #
### # ## # # ### ###
# ### # # # ## # # #
### # ## ## ##
## # # ##
## # ##
# # # #
#### ##
# ## #
####
##
</pre>
 
=={{header|AutoHotkey}}==
3,044

edits