packages feed

fay-0.24.2.0: examples/nqueens.hs


-- !!! count the number of solutions to the "n queens" problem.

module NQueens where

import Prelude
import FFI

main :: Fay ()
main = benchmark $ print (nsoln 11)

listLength :: [a] -> Int -> Int
listLength [] acc = acc
listLength (_:l) acc = listLength l (1 + acc)

listFilter :: (a -> Bool) -> [a] -> [a]
listFilter f [] = []
listFilter f  (a : l)
    | f a       = a : (listFilter f l)
    | otherwise = listFilter f l

nsoln :: Int -> Int
nsoln nq = listLength (gen nq) 0
 where
    safe :: Int -> Int -> [Int] -> Bool
    safe x d []        = True
    safe x d ( q : l) = (x /= q) && (x /= (q+d)) && (x /= (q-d)) && safe x (d+1) l

    gen :: Int -> [[Int]]
    gen 0 =  [] : []
    gen n = concat $ map (\bs -> map (\q ->  q : bs) $ listFilter (\q -> safe q 1 bs) ([1..nq])) (gen (n-1))

benchmark m = do
  start <- getSeconds
  m
  end <- getSeconds
  printS (show (end-start) ++ "ms")

printS :: String -> Fay ()
printS = ffi "console.log(%1)"

getSeconds :: Fay Double
getSeconds = ffi "new Date()"