langton_s_ant.sf 636 B

123456789101112131415161718192021222324252627
  1. #!/usr/bin/ruby
  2. define dirs = [[1,0], [0,-1], [-1,0], [0,1]];
  3. define size = 13;
  4. enum |White, Black|;
  5. var plane = size.of { size.of (White) };
  6. var (x, y) = @|([size/2 -> int]*2);
  7. var dir = dirs.len.irand;
  8. var moves = 0;
  9. loop {
  10. (x >= 0) && (y >= 0) && (x < size) && (y < size) || break;
  11. given(plane[x][y]) {
  12. when (White) { dir--; plane[x][y] = Black }
  13. when (Black) { dir++; plane[x][y] = White }
  14. }
  15. ++moves;
  16. [[\x, \y], dirs[dir %= dirs.len]].zip {|a,b| *a += b }
  17. }
  18. say "Out of bounds after #{moves} moves at (#{x}, #{y})";
  19. plane.map{.map {|square| square == Black ? '#' : '.' }}.each{.join.say};