never executed always true always false
1 module Tarefa1_2017li1g180 where
2
3 import LI11718
4
5 import Data.Typeable
6
7 import GHC.Generics (Generic, Generic1)
8 import Control.DeepSeq -- package "deepseq"
9
10 import Text.PrettyPrint -- package "pretty"
11 import Text.PrettyPrint.GenericPretty -- package "GenericPretty"
12
13 import Safe
14
15 constroi :: Caminho -> Mapa
16 constroi c = Mapa (partida c,dirInit) $ processa c dirInit altInit (partida c) (theFloorIsLava (dimensao c))
17
18 --------------
19 -- == T1: Solução
20 --------------
21
22 --mexe :: (Int,Int) -> Orientacao -> (Int,Int)
23 --mexe (x,y) Este = (x+1,y)
24 --mexe (x,y) Sul = (x,y+1)
25 --mexe (x,y) Oeste = (x-1,y)
26 --mexe (x,y) Norte = (x,y-1)
27 --
28 --roda :: Orientacao -> Bool -> Orientacao
29 --roda Este True = Sul
30 --roda Sul True = Oeste
31 --roda Oeste True = Norte
32 --roda Norte True = Este
33 --roda d False = roda (roda (roda d True) True) True
34
35 theFloorIsLava :: Dimensao -> [[Peca]]
36 theFloorIsLava (n,m) = replicate m (replicate n (Peca Lava altLava))
37
38 processa :: Caminho -> Orientacao -> Altura -> (Int,Int) -> [[Peca]] -> [[Peca]]
39 processa [] _ _ _ m = m
40 processa (CurvaDir:c) d a (x,y) m = processa c d' a (mexe (x,y) d') m'
41 where m' = replace m (x,y) (blocoCurvo d d' a)
42 d' = roda d True
43 processa (CurvaEsq:c) d a (x,y) m = processa c d' a (mexe (x,y) d') m'
44 where m' = replace m (x,y) (blocoCurvo d d' a)
45 d' = roda d False
46 processa (Avanca:c) d a (x,y) m = processa c d a (mexe (x,y) d) m'
47 where m' = replace m (x,y) (Peca Recta a)
48 processa (s:c) d a (x,y) m = processa c d a' (mexe (x,y) d) m'
49 where m' = replace m (x,y) p'
50 a' = adapta s a
51 p' = (blocoRampa s d) (min a a')
52
53 replace :: [[a]] -> (Int,Int) -> a -> [[a]]
54 replace m (x,y) e = (take y m) ++ [l] ++ (drop (y+1) m)
55 where l = (take x (atNote "replace1" m y)) ++ [e] ++ (drop (x+1) (atNote "replace2" m y))
56
57 blocoCurvo :: Orientacao -> Orientacao -> Altura -> Peca
58 blocoCurvo Norte Este = Peca (Curva Norte)
59 blocoCurvo Este Sul = Peca (Curva Este)
60 blocoCurvo Sul Oeste = Peca (Curva Sul)
61 blocoCurvo Oeste Norte = Peca (Curva Oeste)
62 blocoCurvo m n = blocoCurvo (roda (roda n True) True) (roda (roda m True) True)
63 -- Este Norte == Sul Oeste
64 -- Sul Este == Oeste Norte
65
66 adapta :: Passo -> Altura -> Altura
67 adapta Sobe a = a+1
68 adapta Desce a = a-1
69 adapta _ a = a
70
71 blocoRampa :: Passo -> Orientacao -> (Altura -> Peca)
72 blocoRampa Sobe Norte = Peca (Rampa Norte)
73 blocoRampa Sobe Oeste = Peca (Rampa Oeste)
74 blocoRampa Sobe Sul = Peca (Rampa Sul)
75 blocoRampa Sobe Este = Peca (Rampa Este)
76 blocoRampa Desce d = blocoRampa Sobe (roda (roda d True) True)
77
78 mexe :: (Int,Int) -> Orientacao -> (Int,Int)
79 mexe (x,y) Este = (x+1,y)
80 mexe (x,y) Sul = (x,y+1)
81 mexe (x,y) Oeste = (x-1,y)
82 mexe (x,y) Norte = (x,y-1)
83
84
85 roda :: Orientacao -> Bool -> Orientacao
86 roda Este True = Sul
87 roda Sul True = Oeste
88 roda Oeste True = Norte
89 roda Norte True = Este
90 roda d False = roda (roda (roda d True) True) True
91
92
93 atNote2 str xys x y = atNote str (atNote str xys x) y
94
95
96 --------------- from Nuno
97 testesT1 :: [Caminho]
98 testesT1 = [c_ex1,c_ex1',c_ex2,c_ex4,c_ex5,c_ex6
99 ,c_exOP,c_exDM,c_exOL,c_exHM,c_exR,c_exE]
100
101 -- ,m_ex1,m_ex2,m_ex3
102 -- ,m_exPI,m_exLV,m_exEX,m_exLH]
103
104 c_ex1 :: Caminho
105 c_ex1 = [Avanca,CurvaEsq,Avanca,CurvaDir,Avanca,CurvaDir,Desce,Avanca,CurvaEsq,CurvaDir
106 ,CurvaEsq,CurvaDir,CurvaDir,CurvaEsq,CurvaDir,CurvaEsq,CurvaEsq,Avanca,Avanca
107 ,Desce,CurvaDir,CurvaDir,Avanca,Avanca,Desce,CurvaEsq,CurvaDir,Sobe,CurvaDir
108 ,CurvaEsq,CurvaDir,CurvaEsq,Avanca,CurvaDir,Sobe,Sobe,Avanca,Avanca,CurvaDir,Avanca]
109
110 c_ex1' :: Caminho
111 c_ex1' = [Avanca,CurvaEsq,Avanca,CurvaDir,Avanca,CurvaDir,Sobe,Avanca,CurvaEsq,CurvaDir
112 ,CurvaEsq,CurvaDir,CurvaDir,CurvaEsq,CurvaDir,CurvaEsq,CurvaEsq,Avanca,Avanca
113 ,Sobe,CurvaDir,CurvaDir,Avanca,Avanca,Sobe,CurvaEsq,CurvaDir,Desce,CurvaDir
114 ,CurvaEsq,CurvaDir,CurvaEsq,Avanca,CurvaDir,Desce,Desce,Avanca,Avanca,CurvaDir,Avanca]
115
116 c_ex2 :: Caminho
117 c_ex2 = [Avanca,CurvaEsq,CurvaEsq,Avanca,CurvaEsq,CurvaEsq]
118
119 -- mapa sobreposto, altura /= da inicial
120 c_ex3 :: Caminho
121 c_ex3 = [Desce,CurvaEsq,CurvaEsq,Desce,CurvaEsq,CurvaEsq
122 ,Avanca,CurvaEsq,CurvaEsq,Avanca,CurvaEsq,CurvaEsq]
123
124 -- caminho em 8, cruza
125 c_ex4 :: Caminho
126 c_ex4 = [Avanca,CurvaDir,Avanca,Avanca,Avanca,CurvaEsq,Avanca,CurvaEsq,Avanca
127 ,CurvaEsq,Avanca,Avanca,Avanca,CurvaDir,Avanca,CurvaDir]
128
129 -- caminho minimo válido
130 c_ex5 :: Caminho
131 c_ex5 = [CurvaDir,CurvaDir,CurvaDir,CurvaDir]
132
133 -- caminho minimo sem vizinhos
134 c_ex6 :: Caminho
135 c_ex6 = [Avanca,CurvaDir,Avanca,CurvaDir,Avanca,CurvaDir,Avanca,CurvaDir]
136
137 -- mapa nao geravel por caminhos, lava extra a volta
138 m_ex1 = Mapa ((2,1),Este) [[Peca Lava 2, Peca Lava 2, Peca Lava 2, Peca Lava 2]
139 ,[Peca Lava 2, Peca (Curva Norte) 2,Peca (Curva Este) 2, Peca Lava 2]
140 ,[Peca Lava 2, Peca (Curva Oeste) 2,Peca (Curva Sul) 2, Peca Lava 2]
141 ,[Peca Lava 2, Peca Lava 2, Peca Lava 2, Peca Lava 2]]
142
143 -- mapa nao geravel por caminhos, altura /= inicial sem possibilidade de rampas
144 m_ex2 = Mapa ((1,0),Este) [[Peca (Curva Norte) 5,Peca (Curva Este) 5],[Peca (Curva Oeste) 5,Peca (Curva Sul) 5]]
145
146 -- mapa minimo sem vizinhos
147 m_ex3 = Mapa ((1,0),Este) [[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]]
148
149
150 -- testes invalidos
151 -- aberto
152 c_exOP :: Caminho
153 c_exOP = [Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaEsq,Avanca,CurvaDir,CurvaDir
154 ,Avanca,Avanca,Avanca,CurvaDir,CurvaEsq,Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaDir,Avanca]
155
156 -- fecha mas direcao errada
157 c_exDM :: Caminho
158 c_exDM = [Sobe,CurvaEsq,CurvaEsq,Sobe,CurvaEsq,CurvaEsq
159 ,Avanca,CurvaEsq,CurvaEsq,Avanca,CurvaEsq,Avanca]
160
161 -- overlaps, aberto
162 c_exOL :: Caminho
163 c_exOL = [Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaEsq,Avanca,CurvaDir,CurvaDir
164 ,Avanca,CurvaDir,Avanca,CurvaDir,CurvaEsq,Avanca,CurvaDir,Avanca,Avanca,CurvaDir,Avanca]
165
166 -- height mismatch
167 c_exHM :: Caminho
168 c_exHM = [Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaEsq,Avanca,CurvaDir,CurvaDir
169 ,Avanca,Sobe,Avanca,CurvaDir,CurvaEsq,Avanca,CurvaDir,Avanca,Avanca,CurvaDir,Avanca]
170
171 -- cruza com alturas invalidas
172 c_exR :: Caminho
173 c_exR = [Avanca,CurvaDir,Avanca,Avanca,Avanca,CurvaEsq,Sobe,CurvaEsq,Avanca
174 ,CurvaEsq,Avanca,Avanca,Avanca,CurvaDir,Desce,CurvaDir]
175
176 {-
177 let map = constroi c_exR
178 printHeight map
179 -}
180
181 -- caminho vazio
182 c_exE :: Caminho
183 c_exE = []