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 ]