import System(getArgs) import List import qualified Data.Set as Set main = do args <- getArgs let n = read (args !! 0); m = read (args !! 1) let ref = Set.fromAscList $ map (spread n) [0..(n*m-1)] putStr $ (show n)++" by "++(show m)++"\n" let oh_layouts = concatMap (\ohs -> generate ohs (n*m)) [((n*m)`div`4)..(n*m)] let best = head $ filter (valid' n ref) $ map (map (spread n)) oh_layouts putStr $ (show (length (best)))++" empty cells: \n" putStr $ chunk n $ show_garden n m best spread n x = x + n*(x `div` n) show_garden n m ohs = [if (spread n x) `within` ohs then 'O' else 'X' | x <- [0..(n*m-1)]] within val ohs = any (==val) ohs valid' n ref curr_garden = ref `Set.isSubsetOf` visible where visible = Set.fromList $ concatMap (\x ->[x-2*n,x-1,x,x+1,x+2*n]) curr_garden chunk n [] = ['\n'] chunk n xs = first ++ "\n" ++ chunk n rest where (first, rest) = splitAt n xs generate sub total = gen total $ reverse $ take sub [0..] where gen total [] = [] gen total xss@(x:xs) | x (1+(head ns)):ns) r in gen total $ top p top [] = [] top (x:xs) = x incHead [] = [] incHead (x:xs) = (x+1):xs