fork download
  1. import Data.Maybe
  2. import Data.Char
  3. import Data.List
  4. import Control.Applicative
  5.  
  6. data Piece = King | Queen | Rook | Bishop | Knight | Pawn deriving(Eq,Enum,Show)
  7. data Actor = Black Piece | White Piece deriving(Eq)
  8. type Field = Maybe Actor
  9.  
  10. newtype Board = Board [Field]
  11.  
  12. instance Show Actor where
  13. show (Black piece) = toUpper <$> show piece
  14. show (White piece) = toLower <$> show piece
  15.  
  16. instance Show Board where
  17. show (Board fields) = display $ split fields
  18. where
  19. display = concat . intersperse "\n" . (rank <$>). reverse
  20. rank = concat . intersperse "\t" . (maybe "." show <$>)
  21. split [] = []
  22. split fields = let (r,o)=splitAt 8 fields in r:split o
  23.  
  24. fenPiece :: Char -> Piece
  25. readFEN :: [Char] -> [Field]
  26.  
  27. fenPiece 'r' = Rook
  28. fenPiece 'b' = Bishop
  29. fenPiece 'n' = Knight
  30. fenPiece 'q' = Queen
  31. fenPiece 'k' = King
  32. fenPiece 'p' = Pawn
  33.  
  34. readFEN (code:remain)
  35. | code `elem` "rbnqkp" = (Just . White . fenPiece $ code) : readFEN remain
  36. | code `elem` "RBNQKP" = (Just . Black . fenPiece $ (toLower code)) : readFEN remain
  37. | code `elem` ['1'..'8'] = replicate (read [code]) Nothing ++ readFEN remain
  38. | code == '/' = readFEN remain
  39. readFEN [] = []
  40.  
  41. main = do
  42. putStrLn . show . Board $ readFEN "4r3/pp4k1/7p/n1p1p1p1/NbPpP2n/1P1P1r2/P1QB4/R4RK1"
  43.  
Success #stdin #stdout 0s 6292KB
stdin
Standard input is empty
stdout
ROOK	.	.	.	.	ROOK	KING	.
PAWN	.	QUEEN	BISHOP	.	.	.	.
.	PAWN	.	PAWN	.	rook	.	.
KNIGHT	bishop	PAWN	pawn	PAWN	.	.	knight
knight	.	pawn	.	pawn	.	pawn	.
.	.	.	.	.	.	.	pawn
pawn	pawn	.	.	.	.	king	.
.	.	.	.	rook	.	.	.