never executed always true always false
    1 module Tarefa1_2017li1g183 where
    2 
    3 import LI11718
    4 
    5 --------------- from Nuno
    6 testesT1 :: [Caminho]
    7 testesT1 = [c_ex1,c_ex1',c_ex2,c_ex4,c_ex5,c_ex6
    8            ,c_exOP,c_exDM,c_exOL,c_exHM,c_exR,c_exE]
    9 
   10            -- ,m_ex1,m_ex2,m_ex3
   11            -- ,m_exPI,m_exLV,m_exEX,m_exLH]
   12 
   13 c_ex1 :: Caminho
   14 c_ex1 = [Avanca,CurvaEsq,Avanca,CurvaDir,Avanca,CurvaDir,Desce,Avanca,CurvaEsq,CurvaDir
   15       ,CurvaEsq,CurvaDir,CurvaDir,CurvaEsq,CurvaDir,CurvaEsq,CurvaEsq,Avanca,Avanca
   16       ,Desce,CurvaDir,CurvaDir,Avanca,Avanca,Desce,CurvaEsq,CurvaDir,Sobe,CurvaDir
   17       ,CurvaEsq,CurvaDir,CurvaEsq,Avanca,CurvaDir,Sobe,Sobe,Avanca,Avanca,CurvaDir,Avanca]
   18 
   19 c_ex1' :: Caminho
   20 c_ex1' = [Avanca,CurvaEsq,Avanca,CurvaDir,Avanca,CurvaDir,Sobe,Avanca,CurvaEsq,CurvaDir
   21       ,CurvaEsq,CurvaDir,CurvaDir,CurvaEsq,CurvaDir,CurvaEsq,CurvaEsq,Avanca,Avanca
   22       ,Sobe,CurvaDir,CurvaDir,Avanca,Avanca,Sobe,CurvaEsq,CurvaDir,Desce,CurvaDir
   23       ,CurvaEsq,CurvaDir,CurvaEsq,Avanca,CurvaDir,Desce,Desce,Avanca,Avanca,CurvaDir,Avanca]
   24 
   25 c_ex2 :: Caminho
   26 c_ex2 = [Avanca,CurvaEsq,CurvaEsq,Avanca,CurvaEsq,CurvaEsq]
   27 
   28 -- mapa sobreposto, altura /= da inicial
   29 c_ex3 :: Caminho
   30 c_ex3 = [Desce,CurvaEsq,CurvaEsq,Desce,CurvaEsq,CurvaEsq
   31         ,Avanca,CurvaEsq,CurvaEsq,Avanca,CurvaEsq,CurvaEsq]
   32 
   33 -- caminho em 8, cruza
   34 c_ex4 :: Caminho
   35 c_ex4 = [Avanca,CurvaDir,Avanca,Avanca,Avanca,CurvaEsq,Avanca,CurvaEsq,Avanca
   36         ,CurvaEsq,Avanca,Avanca,Avanca,CurvaDir,Avanca,CurvaDir]
   37 
   38 -- caminho minimo vĂ¡lido
   39 c_ex5 :: Caminho
   40 c_ex5 = [CurvaDir,CurvaDir,CurvaDir,CurvaDir]
   41       
   42 -- caminho minimo sem vizinhos
   43 c_ex6 :: Caminho
   44 c_ex6 = [Avanca,CurvaDir,Avanca,CurvaDir,Avanca,CurvaDir,Avanca,CurvaDir]
   45 
   46 -- mapa nao geravel por caminhos, lava extra a volta
   47 m_ex1 = Mapa ((2,1),Este) [[Peca Lava 2, Peca Lava 2, Peca Lava 2, Peca Lava 2]
   48                           ,[Peca Lava 2, Peca (Curva Norte) 2,Peca (Curva Este) 2, Peca Lava 2]
   49                           ,[Peca Lava 2, Peca (Curva Oeste) 2,Peca (Curva Sul) 2, Peca Lava 2]
   50                           ,[Peca Lava 2, Peca Lava 2, Peca Lava 2, Peca Lava 2]]
   51 
   52 -- mapa nao geravel por caminhos, altura /= inicial sem possibilidade de rampas
   53 m_ex2 = Mapa ((1,0),Este) [[Peca (Curva Norte) 5,Peca (Curva Este) 5],[Peca (Curva Oeste) 5,Peca (Curva Sul) 5]]
   54 
   55 -- mapa minimo sem vizinhos
   56 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]]
   57 
   58 
   59 -- testes invalidos
   60 -- aberto
   61 c_exOP :: Caminho
   62 c_exOP = [Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaEsq,Avanca,CurvaDir,CurvaDir
   63          ,Avanca,Avanca,Avanca,CurvaDir,CurvaEsq,Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaDir,Avanca]      
   64 
   65 -- fecha mas direcao errada
   66 c_exDM :: Caminho
   67 c_exDM = [Sobe,CurvaEsq,CurvaEsq,Sobe,CurvaEsq,CurvaEsq
   68          ,Avanca,CurvaEsq,CurvaEsq,Avanca,CurvaEsq,Avanca]
   69 
   70 -- overlaps, aberto
   71 c_exOL :: Caminho
   72 c_exOL = [Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaEsq,Avanca,CurvaDir,CurvaDir
   73          ,Avanca,CurvaDir,Avanca,CurvaDir,CurvaEsq,Avanca,CurvaDir,Avanca,Avanca,CurvaDir,Avanca]              
   74 
   75 -- height mismatch
   76 c_exHM :: Caminho
   77 c_exHM = [Avanca,Avanca,CurvaDir,Avanca,Avanca,CurvaEsq,Avanca,CurvaDir,CurvaDir
   78          ,Avanca,Sobe,Avanca,CurvaDir,CurvaEsq,Avanca,CurvaDir,Avanca,Avanca,CurvaDir,Avanca]
   79 
   80 -- cruza com alturas invalidas
   81 c_exR :: Caminho
   82 c_exR = [Avanca,CurvaDir,Avanca,Avanca,Avanca,CurvaEsq,Sobe,CurvaEsq,Avanca
   83         ,CurvaEsq,Avanca,Avanca,Avanca,CurvaDir,Desce,CurvaDir]
   84 
   85 {-
   86 let map = constroi c_exR
   87 printHeight map
   88 -}
   89 
   90 -- caminho vazio
   91 c_exE :: Caminho
   92 c_exE = []
   93 
   94 constroi :: Caminho -> Mapa
   95 constroi c = Mapa (partida c,dirInit) tab
   96   where Mapa (finishPos,finishDir) tab =
   97           constroiAux (Mapa (partida c,dirInit) (initTab c)) altInit c
   98 
   99 initTab :: Caminho -> Tabuleiro
  100 initTab c = replicate y $ replicate x  $ Peca Lava altLava
  101   where (x,y) = dimensao c 
  102 
  103 constroiAux :: Mapa -> Altura -> Caminho -> Mapa
  104 constroiAux m _ [] = m
  105 constroiAux (Mapa (pos,dir) tab) a (i:is) =
  106   constroiAux (Mapa (p',d') novoMapa) a' is
  107   where
  108     (p',d',a',novoMapa) = insere i pos dir a tab
  109 
  110 insere Avanca   pos dir a tab = (go pos dir, dir, a,   coloca (Peca Recta               a) pos tab)
  111 insere Sobe     pos dir a tab = (go pos dir, dir, a+1, coloca (Peca (Rampa dir)         a) pos tab)
  112 insere Desce    pos dir a tab = (go pos dir, dir, a-1, coloca (Peca (Rampa (swap dir)) (a-1)) pos tab)
  113 -- insere CurvaEsq pos dir a tab = (go pos des, des, a,   coloca (Peca (Curva (tr dir))    a) pos tab)
  114 insere CurvaEsq pos dir a tab = (go pos des, des, a,   coloca (Peca (Curva (dir))    a) pos tab)
  115   where des = tr.tr.tr$dir
  116 insere CurvaDir pos dir a tab = (go pos ddi, ddi, a,   coloca (Peca (Curva dir)         a) pos tab)
  117   where ddi = tr dir
  118 
  119 swap = tr.tr
  120 
  121 coloca :: a -> Posicao -> [[a]] -> [[a]]
  122 coloca peca (0,0) ((_:l):ls) = (peca:l):ls
  123 coloca p (x,0) ((h:t):ls) = let (a2:b2) = coloca p (x-1,0) (t:ls)
  124                             in (h:a2):b2
  125 coloca p (x,y) (l:ls) = l : (coloca p (x,y-1) ls)
  126 
  127 go (x,y) Norte = (x,y-1)
  128 go (x,y) Sul   = (x,y+1)
  129 go (x,y) Este  = (x+1,y)
  130 go (x,y) Oeste = (x-1,y)
  131 
  132 tr Norte = Este
  133 tr Este  = Sul
  134 tr Sul   = Oeste
  135 tr Oeste = Norte