8-Queens in 8 Lines

Brushing up on “whiteboard coding” for internal interviews… Inspired by Hal Ableson’s streams-based solution to this old classic in the SICP lectures, here’s a pretty concise n-Queens solution:

 

let rec Solutions n board size = seq { // board is (x,y) tuple list of queens 

    let safe board (x,y) = // is particular square safe on given board
        List.forall (fun (a,b) -> (x<>a)&&(y<>b)&&(abs(x-a)<>abs(y-b))) board
    let squares size = seq { // all squares on size x size board
        for y in [0..size-1] do for x in [0..size-1] do yield (x,y) }
    if n <= 0 then yield board else // no more queens to add, solved!
        for p in Seq.filter (safe board) (squares size) do
            yield! Solutions (n-1) (p::board) size } // add queen & recurse

// 8 queens, starting from empty 8x8 board, first 10 solutions
Solutions 8 [] 8 |> Seq.take 10 |> Seq.iter (printfn "Solution: %A")