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 = []