algoalgo-world
algoalgo-world/ant
ant/default

Langton's Ant

kind
Turing machine on a 2D tape
neighborhood
the cell it stands on
rule
whatever the slider is set to

pick a language to open the code

DX = (0, 1, 0, -1)
DY = (-1, 0, 1, 0)


def step(cells, w, h, x, y, facing):
    i = y * w + x
    if cells[i] == 1:
        cells[i] = 0
        facing = (facing + 3) % 4
    else:
        cells[i] = 1
        facing = (facing + 1) % 4
    x = (x + DX[facing]) % w
    y = (y + DY[facing]) % h
    return x, y, facing
const DX = [0, 1, 0, -1];
const DY = [-1, 0, 1, 0];

function step(cells, w, h, ant) {
  const i = ant.y * w + ant.x;
  if (cells[i] === 1) {
    cells[i] = 0;
    ant.facing = (ant.facing + 3) % 4;
  } else {
    cells[i] = 1;
    ant.facing = (ant.facing + 1) % 4;
  }
  ant.x = (ant.x + DX[ant.facing] + w) % w;
  ant.y = (ant.y + DY[ant.facing] + h) % h;
}
static const int DX[4] = {0, 1, 0, -1};
static const int DY[4] = {-1, 0, 1, 0};

typedef struct { int x, y, facing; } Ant;

void step(char cells[], int w, int h, Ant* ant) {
    int i = ant->y * w + ant->x;
    if (cells[i] == 1) {
        cells[i] = 0;
        ant->facing = (ant->facing + 3) % 4;
    } else {
        cells[i] = 1;
        ant->facing = (ant->facing + 1) % 4;
    }
    ant->x = (ant->x + DX[ant->facing] + w) % w;
    ant->y = (ant->y + DY[ant->facing] + h) % h;
}
constexpr int DX[4] = {0, 1, 0, -1};
constexpr int DY[4] = {-1, 0, 1, 0};

struct Ant {
    int x;
    int y;
    int facing;
};

void step(std::vector<char>& cells, int w, int h, Ant& ant) {
    int i = ant.y * w + ant.x;
    if (cells[i] == 1) {
        cells[i] = 0;
        ant.facing = (ant.facing + 3) % 4;
    } else {
        cells[i] = 1;
        ant.facing = (ant.facing + 1) % 4;
    }
    ant.x = (ant.x + DX[ant.facing] + w) % w;
    ant.y = (ant.y + DY[ant.facing] + h) % h;
}
static readonly int[] DX = { 0, 1, 0, -1 };
static readonly int[] DY = { -1, 0, 1, 0 };

record struct Ant(int X, int Y, int Facing);

static Ant Step(byte[] cells, int w, int h, Ant ant) {
    int i = ant.Y * w + ant.X;
    if (cells[i] == 1) {
        cells[i] = 0;
        ant.Facing = (ant.Facing + 3) % 4;
    } else {
        cells[i] = 1;
        ant.Facing = (ant.Facing + 1) % 4;
    }
    ant.X = (ant.X + DX[ant.Facing] + w) % w;
    ant.Y = (ant.Y + DY[ant.Facing] + h) % h;
    return ant;
}
static final int[] DX = {0, 1, 0, -1};
static final int[] DY = {-1, 0, 1, 0};

static void step(byte[] cells, int w, int h, int[] ant) {
    int i = ant[1] * w + ant[0];
    if (cells[i] == 1) {
        cells[i] = 0;
        ant[2] = (ant[2] + 3) % 4;
    } else {
        cells[i] = 1;
        ant[2] = (ant[2] + 1) % 4;
    }
    ant[0] = (ant[0] + DX[ant[2]] + w) % w;
    ant[1] = (ant[1] + DY[ant[2]] + h) % h;
}
watch it run, then read it