1. module Main where
  2. import Text.XML.Light
  3. import Data.Char
  4. main = do entrada <- getContents
  5. let Just doc = parseXMLDoc entrada
  6. tiles = findElements (unqual "tile" ) doc
  7. putStr ( unlines (map join (map junta ( drawfinal2 ( drawS2 doc)))))
  8. join :: [String] -> String
  9. join [a] = a
  10. join (l:ls) = l ++ "\n"++join ls
  11. listatiles :: Element -> [Element]
  12. listatiles doc = findElements (unqual "tile") doc
  13. retiratudo2 :: [Element] -> [(String,String,(String,String),(String,String))]
  14. retiratudo2 [] = []
  15. retiratudo2 (x:xs) = ( tirajust (findAttr ( unqual "type" ) x), tirajust (findAttr (unqual "orientation") x), (tirajust (findAttr ( unqual "x" ) x), tirajust (findAttr ( unqual "y") x)),tirajust2 (abc( findElement (unqual "follower" ) x)) ) : retiratudo2 xs
  16. abc :: Maybe Element -> Maybe (String,String)
  17. abc Nothing = Nothing
  18. abc (Just l) = Just (tirajust (findAttr ( unqual "player" ) l) , tirajust(findAttr ( unqual "type") l))
  19. tirajust :: Maybe a -> a
  20. tirajust (Just x) = x
  21. tirajust2 :: Maybe (String,String) -> (String,String)
  22. tirajust2 (Just (x,y)) = (x,y)
  23. tirajust2 Nothing = ("","")
  24. rInt :: String -> Int
  25. rInt = read
  26. tab :: (Int, Int, Int, Int) -> [[(Int,Int)]]
  27. tab (xmi,ymi,xma,yma) = [ [ (x,y) | x <- [xmi .. xma] ]
  28. | y <- [yma, yma-1 .. ymi]]
  29. limite2 :: [(String,String,(String,String),(String,String))] -> (Int,Int,Int,Int)
  30. limite2 l =( rInt (minimum (map retirax l)),rInt (minimum (map retiray l)),rInt (maximum (map retirax l)),rInt (maximum (map retiray l)))
  31. retirax:: (String,String, (String,String),(String,String))-> String
  32. retirax (_,_,(x,_),(_,_)) = x
  33. retiray:: (String,String,(String,String),(String,String))-> String
  34. retiray (_,_,(_,y),(_,_)) = y
  35. searchTile2 :: [(String,String, (String,String),(String,String))] -> (Int,Int) -> (String,String,(String,String))
  36. searchTile2 [] _ = ("_","",("",""))
  37. searchTile2 ((c,d,(x,y),(w,z)):ts) (xs,ys) = if ((rInt x) == xs && (rInt y) == ys) then (c,d,(w,z))
  38. else searchTile2 ts (xs,ys)
  39. drawS2 :: Element -> [[(String,String,(String,String))]]
  40. drawS2 el = let info = retiratudo2 ( listatiles el)
  41. in if info == [] then []
  42. else let tabuleiro = tab (limite2 ( info ))
  43. in map (map (searchTile2 info)) tabuleiro
  44. type Funky = (String,String,(String,String))
  45. drawfinal2 l :: [[Funky]] -> [[[String]]]
  46. drawfinal2 l = map (map (transforma2)) l
  47. transforma2 :: Funky -> [String]
  48. transforma2 (p,o,(pl,mt)) |(p,o,("","")) == ("B","N",("","")) = [".....","..O..",".OOO.","..O..","....."]
  49. |(p,o,("","")) == ("E","E",("","")) = ["....*","...**","..***","...**","....*"]
  50. |(p,o,("","")) == ("E","W",("","")) = ["*....","**...","***..","**...","*...."]
  51. |(p,o,("","")) == ("_","",("","")) = [" "," "," "," "," "]
  52. junta :: [[String]] -> [String]
  53. junta x | head x == [] = []
  54. | otherwise = concat (map head x) : junta (map (tail) x)