import Data.List
import Control.Applicative
data Piece
= King
| Queen
| Rook
| Bishop
| Knight
| Pawn
deriving(Eq,Enum,Show) data Actor
= Black Piece
| White Piece
deriving(Eq)
newtype Board = Board [Field]
instance Show Actor
where show (Black piece
) = toUpper
<$> show piece
show (White piece
) = toLower
<$> show piece
instance Show Board
where show (Board fields
) = display
$ split fields
where
split [] = []
split fields
= let (r
,o
)=splitAt 8 fields
in r:split o
fenPiece
:: Char -> Piece
readFEN
:: [Char] -> [Field
]
fenPiece 'r' = Rook
fenPiece 'b' = Bishop
fenPiece 'n' = Knight
fenPiece 'q' = Queen
fenPiece 'k' = King
fenPiece 'p' = Pawn
readFEN (code:remain)
| code `
elem`
"rbnqkp" = (Just
. White
. fenPiece
$ code
) : readFEN remain
| code `
elem`
"RBNQKP" = (Just
. Black
. fenPiece
$ (toLower code
)) : readFEN remain
| code `
elem`
['1'..'8'] = replicate
(read [code
]) Nothing
++ readFEN remain
| code == '/' = readFEN remain
readFEN [] = []
main = do
putStrLn . show . Board
$ readFEN
"4r3/pp4k1/7p/n1p1p1p1/NbPpP2n/1P1P1r2/P1QB4/R4RK1"
aW1wb3J0IERhdGEuTWF5YmUKaW1wb3J0IERhdGEuQ2hhcgppbXBvcnQgRGF0YS5MaXN0CmltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCgpkYXRhIFBpZWNlID0gS2luZyAgfCBRdWVlbiB8IFJvb2sgfCBCaXNob3AgfCBLbmlnaHQgfCBQYXduIGRlcml2aW5nKEVxLEVudW0sU2hvdykKZGF0YSBBY3RvciA9IEJsYWNrIFBpZWNlIHwgV2hpdGUgUGllY2UgZGVyaXZpbmcoRXEpCnR5cGUgRmllbGQgPSBNYXliZSBBY3RvcgoKbmV3dHlwZSBCb2FyZCA9IEJvYXJkIFtGaWVsZF0KCmluc3RhbmNlIFNob3cgQWN0b3Igd2hlcmUKICAgIHNob3cgKEJsYWNrIHBpZWNlKSA9IHRvVXBwZXIgPCQ+IHNob3cgcGllY2UKICAgIHNob3cgKFdoaXRlIHBpZWNlKSA9IHRvTG93ZXIgPCQ+IHNob3cgcGllY2UKCmluc3RhbmNlIFNob3cgQm9hcmQgd2hlcmUKICAgIHNob3cgKEJvYXJkIGZpZWxkcykgPSBkaXNwbGF5ICQgc3BsaXQgZmllbGRzCiAgICAgICAgd2hlcmUKICAgICAgICAgICAgZGlzcGxheSAgICAgID0gY29uY2F0IC4gaW50ZXJzcGVyc2UgIlxuIiAuIGZtYXAgcmFuayAuIHJldmVyc2UKICAgICAgICAgICAgcmFuayAgICAgICAgID0gY29uY2F0IC4gaW50ZXJzcGVyc2UgIlx0IiAuIGZtYXAgKG1heWJlICIuIiBzaG93KQogICAgICAgICAgICBzcGxpdCBbXSAgICAgPSBbXQogICAgICAgICAgICBzcGxpdCBmaWVsZHMgPSBsZXQgKHIsbyk9c3BsaXRBdCA4IGZpZWxkcyBpbiByOnNwbGl0IG8KCmZlblBpZWNlIDo6IENoYXIgICAtPiBQaWVjZQpyZWFkRkVOICA6OiBbQ2hhcl0gLT4gW0ZpZWxkXQoKZmVuUGllY2UgJ3InID0gUm9vawpmZW5QaWVjZSAnYicgPSBCaXNob3AKZmVuUGllY2UgJ24nID0gS25pZ2h0CmZlblBpZWNlICdxJyA9IFF1ZWVuCmZlblBpZWNlICdrJyA9IEtpbmcKZmVuUGllY2UgJ3AnID0gUGF3bgoKcmVhZEZFTiAoY29kZTpyZW1haW4pCiAgICB8IGNvZGUgYGVsZW1gICJyYm5xa3AiICAgPSAoSnVzdCAuIFdoaXRlIC4gZmVuUGllY2UgJCBjb2RlKSAgICAgICAgICAgOiByZWFkRkVOIHJlbWFpbgogICAgfCBjb2RlIGBlbGVtYCAiUkJOUUtQIiAgID0gKEp1c3QgLiBCbGFjayAuIGZlblBpZWNlICQgKHRvTG93ZXIgY29kZSkpIDogcmVhZEZFTiByZW1haW4KICAgIHwgY29kZSBgZWxlbWAgWycxJy4uJzgnXSA9IHJlcGxpY2F0ZSAocmVhZCBbY29kZV0pIE5vdGhpbmcgKysgcmVhZEZFTiByZW1haW4KICAgIHwgY29kZSA9PSAnLycgPSByZWFkRkVOIHJlbWFpbgpyZWFkRkVOIFtdID0gW10KCm1haW4gPSBkbwogICBwdXRTdHJMbiAuIHNob3cgLiBCb2FyZCAkIHJlYWRGRU4gIjRyMy9wcDRrMS83cC9uMXAxcDFwMS9OYlBwUDJuLzFQMVAxcjIvUDFRQjQvUjRSSzEiCg==