- module Main where
- import Text.XML.Light
- import Data.Char
- main = do entrada <- getContents
- let Just doc = parseXMLDoc entrada
- tiles = findElements (unqual "tile" ) doc
- putStr ( unlines (map join (map junta ( drawfinal2 ( drawS2 doc)))))
- join :: [String] -> String
- join [a] = a
- join (l:ls) = l ++ "\n"++join ls
- listatiles :: Element -> [Element]
- listatiles doc = findElements (unqual "tile") doc
- retiratudo2 :: [Element] -> [(String,String,(String,String),(String,String))]
- retiratudo2 [] = []
- 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
- abc :: Maybe Element -> Maybe (String,String)
- abc Nothing = Nothing
- abc (Just l) = Just (tirajust (findAttr ( unqual "player" ) l) , tirajust(findAttr ( unqual "type") l))
- tirajust :: Maybe a -> a
- tirajust (Just x) = x
- tirajust2 :: Maybe (String,String) -> (String,String)
- tirajust2 (Just (x,y)) = (x,y)
- tirajust2 Nothing = ("","")
- rInt :: String -> Int
- rInt = read
- tab :: (Int, Int, Int, Int) -> [[(Int,Int)]]
- tab (xmi,ymi,xma,yma) = [ [ (x,y) | x <- [xmi .. xma] ]
- | y <- [yma, yma-1 .. ymi]]
- limite2 :: [(String,String,(String,String),(String,String))] -> (Int,Int,Int,Int)
- limite2 l =( rInt (minimum (map retirax l)),rInt (minimum (map retiray l)),rInt (maximum (map retirax l)),rInt (maximum (map retiray l)))
- retirax:: (String,String, (String,String),(String,String))-> String
- retirax (_,_,(x,_),(_,_)) = x
- retiray:: (String,String,(String,String),(String,String))-> String
- retiray (_,_,(_,y),(_,_)) = y
- searchTile2 :: [(String,String, (String,String),(String,String))] -> (Int,Int) -> (String,String,(String,String))
- searchTile2 [] _ = ("_","",("",""))
- searchTile2 ((c,d,(x,y),(w,z)):ts) (xs,ys) = if ((rInt x) == xs && (rInt y) == ys) then (c,d,(w,z))
- else searchTile2 ts (xs,ys)
- drawS2 :: Element -> [[(String,String,(String,String))]]
- drawS2 el = let info = retiratudo2 ( listatiles el)
- in if info == [] then []
- else let tabuleiro = tab (limite2 ( info ))
- in map (map (searchTile2 info)) tabuleiro
- type Funky = (String,String,(String,String))
- drawfinal2 l :: [[Funky]] -> [[[String]]]
- drawfinal2 l = map (map (transforma2)) l
- transforma2 :: Funky -> [String]
- transforma2 (p,o,(pl,mt)) |(p,o,("","")) == ("B","N",("","")) = [".....","..O..",".OOO.","..O..","....."]
- |(p,o,("","")) == ("E","E",("","")) = ["....*","...**","..***","...**","....*"]
- |(p,o,("","")) == ("E","W",("","")) = ["*....","**...","***..","**...","*...."]
- |(p,o,("","")) == ("_","",("","")) = [" "," "," "," "," "]
- junta :: [[String]] -> [String]
- junta x | head x == [] = []
- | otherwise = concat (map head x) : junta (map (tail) x)