1 module Problem(readProblem) where 2 3 import Char(isUpper,toLower) 4 import Board 5 6 readProblem :: String -> (Board, (Colour, Int)) 7 readProblem = parseProblem . lines 8 9 comment s = (s == [] || take 2 s == "--") 10 11 parseProblem :: [String] -> (Board, (Colour, Int)) 12 parseProblem s = (bd, gl) 13 where 14 bd = parseBoard bdtxt 15 gl = parseGoal gltxt 16 (bdtxt, gltxt) = splitAt 8 (filter (not . comment) s) 17 18 parseBoard :: [String] -> Board 19 parseBoard = convert . concat . zipWith parseRank (reverse [1..8]) 20 where 21 convert = foldr addPiece emptyBoard 22 addPiece (p,sq) = putPieceAt sq p 23 24 parseRank r = concat . zipWith (parseSquare r) [1..8] . filter (/= ' ') 25 26 parseSquare r f '-' = [] 27 parseSquare r f c = 28 [((clr,kin), (f,r))] 29 where 30 clr = if isUpper c then Black else White 31 kin = case toLower c of 32 'k' -> King 33 'q' -> Queen 34 'r' -> Rook 35 'b' -> Bishop 36 'n' -> Knight 37 'p' -> Pawn 38 39 parseGoal :: [String] -> (Colour, Int) 40 parseGoal [gltxt] = (c, n) 41 where 42 ws = words gltxt 43 c = read (head ws) 44 n = read (last ws)