Ants
Gram's blog has been pretty fun to follow. Like with Project Euler, I constantly want to implement each thing he talks about (e.g. Monadic Coconuts, Towers of Hanoi).
Here now is "The Wondering Ant":
open System.Drawing
open System.Windows.Forms
let rec ant (x, y) (dx, dy) g i =
let g' = Array2D.mapi (fun x' y' c -> if x = x' && y = y' then not c else c) g
let turn d l r = if d <> 0 then 0 else if g.[x, y] then l else r
let dx' = turn dx dy -dy
let dy' = turn dy -dx dx
if i = 0 then g' else ant (x + dx', y + dy') (dx', dy') g' (i - 1)
let w = 200
let h = 200
let grid = ant (100, 100) (-1, 0) (Array2D.create w h false) 11000
let form = new Form(Text = "Ant", ClientSize = new Size(w, h), Visible = true)
form.Paint.Add(fun a ->
let b = new Bitmap(w, h)
Array2D.iteri (fun x y c -> if c then b.SetPixel(x, y, Color.Black)) grid
a.Graphics.DrawImage(b, 0, 0))
Application.Run(form)