56 lines
1.6 KiB
Ada
56 lines
1.6 KiB
Ada
with Ada.Text_IO;
|
|
|
|
procedure Langtons_Ant is
|
|
|
|
Size: constant Positive := 100; -- change this to extend the playground
|
|
|
|
subtype Step is Integer range -1 .. +1;
|
|
|
|
procedure Right(N, W: in out Step) is
|
|
Tmp: Step := W;
|
|
begin
|
|
W := - N;
|
|
N := Tmp;
|
|
end Right;
|
|
|
|
procedure Left(N, W: in out Step) is
|
|
begin
|
|
for I in 1 .. 3 loop
|
|
Right(N, W);
|
|
end loop;
|
|
end Left;
|
|
|
|
Color_Character: array(Boolean) of Character :=
|
|
(False => ' ', True => '#');
|
|
|
|
Is_Black: array (1 .. Size, 1 .. Size) of Boolean :=
|
|
(others => (others => False)); -- initially, the world is white;
|
|
|
|
Ant_X, Ant_Y: Natural := Size/2; -- Position of Ant;
|
|
Ant_North: Step := 1; Ant_West: Step := 0; -- initially, Ant looks northward
|
|
|
|
Iteration: Positive := 1;
|
|
|
|
begin
|
|
loop -- iterate the loop until an exception is raised
|
|
if Is_Black(Ant_X, Ant_Y) then
|
|
Left(Ant_North, Ant_West);
|
|
else
|
|
Right(Ant_North, Ant_West);
|
|
end if;
|
|
Is_Black(Ant_X, Ant_Y) := not Is_Black(Ant_X, Ant_Y);
|
|
Ant_X := Ant_X - Ant_North; -- this may raise an exception
|
|
Ant_Y := Ant_Y - Ant_West; -- this may raise an exception
|
|
Iteration := Iteration + 1;
|
|
end loop;
|
|
|
|
exception
|
|
when Constraint_Error => -- Ant has left its playground ... now output
|
|
for X in 1 .. Size loop
|
|
for Y in 1 .. Size loop
|
|
Ada.Text_IO.Put(Color_Character(Is_Black(X, Y)));
|
|
end loop;
|
|
Ada.Text_IO.New_Line;
|
|
end loop;
|
|
Ada.Text_IO.Put_Line("# Iteration:" & Integer'Image(Iteration));
|
|
end Langtons_Ant;
|