Wednesday, December 22, 2010

Sudoku Solver in F#


open System

let input =
Array.map (fun _ -> Console.ReadLine().Split [| ' ' |]) [| 0 .. 8 |]
|> Array.map (fun b -> Array.map (fun x -> Convert.ToInt32 (x:string)) b )

let display x =
x |> Array.iter (fun b ->
Array.iter (fun x -> printf "%d " x) b;
printfn "";
)


let verify1 (grid:int[][]) x y c =
[0 .. 8] |> List.forall (fun i -> grid.[i].[y] <> c && grid.[x].[i]<> c)

let verify2 (grid:int[][]) x y c =
let xs = (x/3)*3 in
let ys = (y/3)*3 in
[xs .. (xs+2)] |> List.forall (fun i ->
[ys .. (ys+2)] |> List.forall (fun j -> (grid.[i].[j] <> c)))

let verify grid x y c =
if (verify1 grid x y c) then (verify2 grid x y c) else false


let rec solve x y (grid:int[][]) =
if grid.[x].[y] <> 0 then
if (x = 8) && ( y = 8) then
display grid
else
solve ((x+1) % 9) (if x = 8 then (y+1) else y) grid
else
[1..9] |> List.iter (fun c ->
if (verify grid x y c) then
Array.set grid.[x] y c;
solve x y grid;
else
()
Array.set grid.[x] y 0;
)

solve 0 0 input

No comments: