Langton's ant: Difference between revisions

Content added Content deleted
(Go solution)
(Putting in the C# version)
Line 211: Line 211:
}</lang>
}</lang>


=={{header|C Sharp|C#}}==
<lang C#>using System;

namespace LangtonAnt
{
public struct Point
{
public int X;
public int Y;

public Point(int x, int y)
{
X = x;
Y = y;
}
}

enum Direction
{
North, East, West, South
}

public class Langton
{
public readonly bool [,] IsBlack;
private Point _origin;
private Point _antPosition = new Point(0, 0);
public bool OutOfBounds { get; set;}

// I don't see any mention of what direction the ant is supposed to start out in
private Direction _antDirection = Direction.East;

private readonly Direction[] _leftTurn = new[] { Direction.West, Direction.North, Direction.South, Direction.East };
private readonly Direction[] _rightTurn = new[] { Direction.East, Direction.South, Direction.North, Direction.West };
private readonly int[] _xInc = new[] {0, 1, -1, 0};
private readonly int[] _yInc = new[] {1, 0, 0, -1};

public Langton(int width, int height, Point origin)
{
_origin = origin;
IsBlack = new bool[width, height];
OutOfBounds = false;
}

public Langton(int width, int height) : this(width, height, new Point(width / 2, height / 2)) {}

private void MoveAnt()
{
_antPosition.X += _xInc[(int)_antDirection];
_antPosition.Y += _yInc[(int)_antDirection];
}

public Point Step()
{
if (OutOfBounds)
{
throw new InvalidOperationException("Trying to step after ant is out of bounds");
}
Point ptCur = new Point(_antPosition.X + _origin.X, _antPosition.Y + _origin.Y);
bool leftTurn = IsBlack[ptCur.X, ptCur.Y];
int iDirection = (int) _antDirection;
_antDirection = leftTurn ? _leftTurn[iDirection] : _rightTurn[iDirection];
IsBlack[ptCur.X, ptCur.Y] = !IsBlack[ptCur.X, ptCur.Y];
MoveAnt();
ptCur = new Point(_antPosition.X + _origin.X, _antPosition.Y + _origin.Y);
OutOfBounds =
ptCur.X < 0 ||
ptCur.X >= IsBlack.GetUpperBound(0) ||
ptCur.Y < 0 ||
ptCur.Y >= IsBlack.GetUpperBound(1);
return _antPosition;
}
}
class Program
{
static void Main()
{
Langton ant = new Langton(100, 100);

while (!ant.OutOfBounds) ant.Step();

for (int iRow = 0; iRow < 100; iRow++)
{
for (int iCol = 0; iCol < 100; iCol++)
{
Console.Write(ant.IsBlack[iCol, iRow] ? "#" : " ");
}
Console.WriteLine();
}

Console.ReadKey();
}
}
}
</lang>
Output:
<pre>









































##

##

# ## ### ## ##

# # #### ### ## #

# # ## ## # ## #

## ### ####### # # ##

# # ##### # # ## # # #

## # ### ## #### # ###

###### #### ## # # ## # # ##

# ##### # # ## ## # # # #

### # ## # ##### # # # ## ###

# # #### ## ### ## ### ## ##

## # # ### # # # ### ###

#### ##### ######### # #

# ## # # # ## ### ###

# # # ##### ## ##### #####

### # ##### ###### ### ####### # ##

# # # # # # ### ## ## #

# ## # # ## ## # ### ###

## # # ##### # # # # #

# # # ## ## # # ### ##

# ## ### # # ## # # # # # #

#### ## ## #### # # # # ### #

## # #### # # # ## ### ## #

## ## ### #### # ### ## #

# # ## ### ### ### #

## ## #### #### # # # #

# # ### #### ## # ## ### ## #

### ### # # ##### # # #

# # # ### ## ### # #### #

#### ## ## #### ## ## ## # #

####### # ## ## # #

# # ## # ### # ## ## ###

# #### # # ###### ## ###

# #### ## # #### ## ## # ## #

# # # ## # ###### ####### #

# # ###### ## # # ## # #

## # ####### # # ### ## #

### ## # ## # # # ## # ##

# ##### ## ######

# # # ##### # #

# # ## # # ##

### # ## # ## # ##

### # # # # ## #

# # # ## #### #

#### ### # # ###

# ## ## ## #

### # ## ##

# ## ## # ##

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

### # ##

# ## ## #

##### # ##

#### ### #

# ### ##

## # #

# #

</pre>
=={{header|D}}==
=={{header|D}}==
A basic textual version.
A basic textual version.