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+IHNob3cgcGllY2UKCmluc3RhbmNlIFNob3cgQm9hcmQgd2hlcmUKICAgIHNob3cgKEJvYXJkIGZpZWxkcykgPSBkaXNwbGF5ICQgc3BsaXQgZmllbGRzCiAgICAgICAgd2hlcmUKICAgICAgICAgICAgZGlzcGxheSAgICAgID0gY29uY2F0IC4gaW50ZXJzcGVyc2UgIlxuIiAuIChyYW5rIDwkPikuIHJldmVyc2UKICAgICAgICAgICAgcmFuayAgICAgICAgID0gY29uY2F0IC4gaW50ZXJzcGVyc2UgIlx0IiAuIChtYXliZSAiLiIgc2hvdyA8JD4pCiAgICAgICAgICAgIHNwbGl0IFtdICAgICA9IFtdCiAgICAgICAgICAgIHNwbGl0IGZpZWxkcyA9IGxldCAocixvKT1zcGxpdEF0IDggZmllbGRzIGluIHI6c3BsaXQgbwoKZmVuUGllY2UgOjogQ2hhciAgIC0+IFBpZWNlCnJlYWRGRU4gIDo6IFtDaGFyXSAtPiBbRmllbGRdCgpmZW5QaWVjZSAncicgPSBSb29rCmZlblBpZWNlICdiJyA9IEJpc2hvcApmZW5QaWVjZSAnbicgPSBLbmlnaHQKZmVuUGllY2UgJ3EnID0gUXVlZW4KZmVuUGllY2UgJ2snID0gS2luZwpmZW5QaWVjZSAncCcgPSBQYXduCgpyZWFkRkVOIChjb2RlOnJlbWFpbikKICAgIHwgY29kZSBgZWxlbWAgInJibnFrcCIgICA9IChKdXN0IC4gV2hpdGUgLiBmZW5QaWVjZSAkIGNvZGUpICAgICAgICAgICA6IHJlYWRGRU4gcmVtYWluCiAgICB8IGNvZGUgYGVsZW1gICJSQk5RS1AiICAgPSAoSnVzdCAuIEJsYWNrIC4gZmVuUGllY2UgJCAodG9Mb3dlciBjb2RlKSkgOiByZWFkRkVOIHJlbWFpbgogICAgfCBjb2RlIGBlbGVtYCBbJzEnLi4nOCddID0gcmVwbGljYXRlIChyZWFkIFtjb2RlXSkgTm90aGluZyArKyByZWFkRkVOIHJlbWFpbgogICAgfCBjb2RlID09ICcvJyA9IHJlYWRGRU4gcmVtYWluCnJlYWRGRU4gW10gPSBbXQoKbWFpbiA9IGRvCiAgIHB1dFN0ckxuIC4gc2hvdyAuIEJvYXJkICQgcmVhZEZFTiAiNHIzL3BwNGsxLzdwL24xcDFwMXAxL05iUHBQMm4vMVAxUDFyMi9QMVFCNC9SNFJLMSIK