> let queens size =
- // the row numbers *and* the column numbers
- let range = [1..size]
- let queens' columns =
- columns |> Seq.fold (fun answers column ->
- let positions = [for row in range -> (column, row)]
- [for p in positions for a in answers when all_safe p a -> a@[p]])
- [[]]
- queens' range;;
val queens : int -> (int * int) list list
> queens 4;;
val it : (int * int) list list
= [[(1, 3); (2, 1); (3, 4); (4, 2)]; [(1, 2); (2, 4); (3, 1); (4, 3)]]
>
Tuesday, January 15, 2008
Eight Queens, and an End
Once again I was led astray by having done too much imperative programming. I hate nesting loops to create collections, but I didn't go all the way. If the columns and rows of the chessboard are represented as a range—the same range—then all the positions are produced by taking the Cartesian product of that range with itself. Then I can iterate across the columns, and, for each one, take the Cartesian product of the rows in that column and the answers so far, and fold the new answers into a collection that was empty to start with. Ah, fold, delight of all functional programmers. To wit:
Subscribe to:
Post Comments (Atom)
2 comments:
curry 5
yeezy shoes
adidas tubular
nike sneakers for men
balenciaga trainers
nike air force 1
bape hoodie
moncler
yeezy boost 350 v2
air max 270
replica designer bags CLOW replica wholesale handbags FFTX replica designer bags FFRX
Post a Comment