never executed always true always false
    1 module Tarefa2_2017li1g180 where
    2 
    3 import LI11718
    4 import Data.List
    5 import Data.Maybe
    6 import Safe
    7 
    8 import Tarefa1_2017li1g180
    9 
   10 testesT2 :: [Tabuleiro]
   11 testesT2 = tabs
   12 
   13 validaPos :: Posicao -> Tabuleiro -> Bool
   14 -- hpacheco: mudei para incluir parede
   15 validaPos (x,y) t = x <= maybe 0 length (headMay t) && y <= length t
   16 
   17 ponto2Pos :: Ponto -> Posicao
   18 ponto2Pos (x,y) = (i,j)
   19     where x' = floor x
   20           y' = floor y
   21           i = x'
   22           j = y'
   23 
   24 validaPonto :: Ponto -> Tabuleiro -> Bool
   25 -- hpacheco: mudei para incluir parede
   26 validaPonto (a,b) t = x <= maybe 0 length (headMay t) && y <= length t && x >= 0 && y >= 0
   27   where (x,y) = ponto2Pos (a,b)
   28 
   29 valida :: Mapa -> Bool
   30 valida (Mapa _ []) = False
   31 valida (Mapa (p,d) m) | not (validaTabuleiro m) = False
   32                       | c == [] = False
   33                       | otherwise = validaPos p m && (daVolta c) && (naoDesperdica c t) && (sequencial c a)
   34   where c = percorre [] m p d
   35         (Peca t0 x,_,_) = head c
   36         a = if t0 == Rampa (roda (roda d True) True) then (x+1) else x
   37         t = todoPiso (0,0) m
   38 
   39 validaTabuleiro :: Tabuleiro -> Bool
   40 validaTabuleiro m | length (nub (map length m)) > 1 = False
   41                   | not (bordaLava m) = False
   42                   | otherwise = True
   43 
   44 bordaLava :: Tabuleiro -> Bool
   45 bordaLava t = head t == h && last t == h && map head t == v && map last t == v
   46   where h = replicate (length (head t)) (Peca Lava altLava)
   47         v = replicate (length t) (Peca Lava altLava)
   48 
   49 percorre :: [(Peca,Posicao,Orientacao)] -> Tabuleiro -> Posicao -> Orientacao -> [(Peca,Posicao,Orientacao)]
   50 percorre vs m (i,j) d | i < 0 || j < 0 || i >= length (head m) || j >= length m = vs
   51                       | d' == Nothing = vs
   52                       | v `elem` vs = vs++[v]
   53                       | otherwise = percorre (vs++[v]) m (mexe (i,j) (fromJust d')) (fromJust d')
   54   where v = (atNote2 "percorre" m j i,(i,j),d)
   55         d' = curva d (atNote2 "percorre" m j i)
   56 
   57 
   58 lookMap :: Tabuleiro -> Int -> Int -> Peca
   59 lookMap xs j i | j < length xs && i < maybe 0 length (headMay xs) = atNote "lookMap" (atNote "lookMap" xs j) i 
   60 lookMap xs j i = error $ "lookMap " ++ show xs ++ " " ++ show j ++ " " ++ show i
   61 
   62 todoPiso :: Posicao -> [[Peca]] -> [Posicao]
   63 todoPiso (i,j) m | j >= length m = []
   64                  | i >= length (head m) = todoPiso (0,j+1) m
   65                  | lookMap m j i == Peca Lava altLava = todoPiso (i+1,j) m
   66                  | otherwise = (i,j) : todoPiso (i+1,j) m
   67 
   68 daVolta :: [(Peca,Posicao,Orientacao)] -> Bool
   69 daVolta [] = False
   70 daVolta [_] = False
   71 daVolta p = (head p) == (last p)
   72 
   73 sequencial :: [(Peca,Posicao,Orientacao)] -> Altura -> Bool
   74 sequencial [] _ = True
   75 sequencial ((Peca (Rampa d') a',_,d):c) a = maybe False (sequencial c) a''
   76   where a'' = subir (a,d) (a',d')            
   77 sequencial ((Peca _ a',_,_):c) a | a /= a' = False
   78                                  | otherwise = sequencial c a
   79 
   80 subir :: (Altura,Orientacao) -> (Altura,Orientacao) -> Maybe Altura
   81 subir (a,d) (a',d') | d == d' && a == a' = Just (a+1)
   82                     | d == roda (roda d' True) True && a == a' + 1 = Just a'
   83                     | otherwise = Nothing
   84 
   85 naoDesperdica :: [(Peca,Posicao,Orientacao)] -> [Posicao] -> Bool
   86 naoDesperdica c p = length (nub (map (\(_,x,_) -> x) c)) == length (nub p)
   87 
   88 curva :: Orientacao -> Peca -> Maybe Orientacao
   89 curva o (Peca (Curva c) _) | o == c = Just $ roda o True
   90                            | o == (roda c False) = Just $ roda o False
   91                            | otherwise = Nothing
   92 curva _ (Peca Lava _) = Nothing
   93 curva o _ = Just o
   94 
   95 
   96 tabs = [mm_ex1,mm_ex2,mm_ex3,mm_exPI,mm_exLV,mm_exEX,mm_exLH,mm_why,mm_NSq,mm_Rec,mm_Rec']
   97 
   98 -- mapa nao geravel por caminhos, lava extra a volta
   99 mm_ex1 = [[Peca Lava 2, Peca Lava 2, Peca Lava 2, Peca Lava 2]
  100         ,[Peca Lava 2, Peca (Curva Norte) 2,Peca (Curva Este) 2, Peca Lava 2]
  101         ,[Peca Lava 2, Peca (Curva Oeste) 2,Peca (Curva Sul) 2, Peca Lava 2]
  102         ,[Peca Lava 2, Peca Lava 2, Peca Lava 2, Peca Lava 2]]
  103 
  104 -- mapa nao geravel por caminhos, altura /= inicial sem possibilidade de rampas
  105 mm_ex2 = [[Peca (Curva Norte) 5,Peca (Curva Este) 5],[Peca (Curva Oeste) 5,Peca (Curva Sul) 5]]
  106 
  107 -- mapa minimo sem vizinhos
  108 mm_ex3 = [[Peca (Curva Norte) 2,Peca Recta 2,Peca (Curva Este) 2],[Peca Recta 2,Peca Lava 2,Peca Recta 2],[Peca (Curva Oeste) 2,Peca Recta 2,Peca (Curva Sul) 2]]
  109 
  110 
  111 -- posicao inicial invalida
  112 mm_exPI = [[Peca (Curva Norte) 2,Peca (Curva Este) 2],[Peca (Curva Oeste) 2,Peca (Curva Sul) 2]]
  113 
  114 -- mapa so lava
  115 mm_exLV = theFloorIsLava (5,10)
  116 
  117 -- mapa com caminho extra
  118 mm_exEX = [[Peca (Curva Norte) 2,Peca Recta 2,Peca (Curva Este) 2],[Peca Recta 2,Peca Recta 2,Peca Recta 2],[Peca (Curva Oeste) 2,Peca Recta 2,Peca (Curva Sul) 2]]
  119 
  120 -- altura da lava invalida
  121 mm_exLH = [[Peca (Curva Norte) 2,Peca Recta 2,Peca (Curva Este) 2],[Peca Recta 2,Peca Lava 2,Peca Recta 2],[Peca (Curva Oeste) 2,Peca Recta 2,Peca (Curva Sul) 2]]
  122 
  123 mm_why = [[Peca (Curva Norte) 2,Peca Recta 2,Peca (Curva Este) 2],[Peca Recta 2,Peca Recta 2,Peca Recta 2],[Peca (Curva Oeste) 2,Peca Recta 2,Peca (Curva Sul) 2]]
  124 
  125 mm_NSq = [[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
  126         ,[Peca Lava altLava, Peca (Curva Norte) 5,Peca (Curva Este) 5, Peca Lava altLava, Peca Lava altLava]
  127         ,[Peca Lava altLava, Peca (Curva Oeste) 5,Peca (Curva Sul) 5, Peca Lava altLava]
  128         ,[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
  129         ]
  130 
  131 mm_Rec = [[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
  132         ,[Peca Lava altLava, Peca Recta 5,Peca Lava altLava]
  133         ,[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
  134         ]                          
  135 
  136 mm_Rec' = [[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
  137          ,[Peca Recta 5, Peca Recta 5,Peca Recta 5]
  138          ,[Peca Lava altLava, Peca Lava altLava, Peca Lava altLava]
  139          ]