domingo, 6 de outubro de 2013

Listas em Haskell

Resolução da Lista 02

-- Funcao base para as questoes
nove,cinco,um,dois,tres,quatro,seis,sete,oito,zero :: [Int]
zero  = [4,1,2,1,2,1,4]
um = [0,2,1,2,1,2,1,2,1,2,1]
dois = [3,2,5,2,3]
tres = [3,2,4,2,4]
quatro = [1,1,2,1,4,2,1,2,1]
cinco = [4,2,3,2,4]
seis = [4,2,4,1,4]
sete = [3,2,1,2,1,2,1,2,1]
oito = [4,1,5,1,4]
nove = [4,1,4,2,1,2,1]

--Questao 01
-- recebe um dos numeros por extenso e devolve a lista considerando que posicao 0 quantidade de asteriscos, porsicao 1 espacos e vai alternando entre asterisco e espacos
toString :: [Int] -> String
toString [ ] = [ ] -- nao necessita
toString [n] = impAsterisco n
toString (a : b : c) = impAsterisco a ++ impEspaco b ++ toString c -- c eh cauda, b eh segundo elemento e a eh o primeiro elemento

-- auxilia na impressao dos asteriscos
impAsterisco :: Int -> String
impAsterisco  0 = [ ]
impAsterisco qtd = "*" ++ impAsterisco (qtd - 1)

-- auxilia nos espacos
impEspaco :: Int -> String
impEspaco 0 = [ ]
impEspaco qtd = ' ' : impEspaco (qtd - 1) --aspas simples porque eh para concatenar com uma lista

-- Questao 02

type Linha = String

toLinhas :: String -> [Linha]
toLinhas [ ] = [ ]
toLinhas (a : b : c : d) = ([a] ++ [b] ++ [c] ) : toLinhas d -- a, b e c representa cada elemento ou seja cada "*" e d eh o resto dos astericos e espacos

--para testar coloque no terminal toLinhas (toString nove) nove pode ser qualquer um dos outros numeros de zer - nove

-- Questao 03
--imprime os \n a cada tres caracteres

showLinhas :: [Linha] -> String
showLinhas [n] = n
showLinhas (a : b) = a ++ "\n" ++ showLinhas b ++ "\n"

-- Questao 04
-- recebe duas listas que podem ser numeros e concatena numa so lista

juntaLinhas :: [Linha] -> [Linha] -> [Linha]   
juntaLinhas [ ] [ ] = [ ]
juntaLinhas (a1 : b1) (a2 : b2) = (a1 ++ " " ++ a2) : juntaLinhas b1 b2

-- Questao 05
-- [ ] !! int  concatena com a lista com o int
-- recebe numeros de ate tres digitos

toLcd :: Int -> String
toLcd n = showLinhas (toLcd2 n)

toLcd1 :: Int -> IO( )
toLcd1 n = putStr (showLinhas (toLcd2 n))

toLcd2 :: Int -> [Linha]
toLcd2 n
        | n <= 9 = toLcdAux n
        | n <= 99 = juntaLinhas (toLcd2 (div n 10)) (toLcd2 (mod n 10))
        | n <= 999 = juntaLinhas (toLcd2 (div n 100)) (toLcd2 (mod n 100))
        | otherwise = error "Garotinho so eh permitido numeros de tres digitos"

toLcdAux :: Int -> [Linha]
toLcdAux n = toLinhas (toString (numeros !! n))       
       
numeros :: [[Int]]
numeros = [zero,um,dois,tres,quatro,cinco,seis,sete,oito,nove]

-- Questao 06

--toCompact :: String -> [Int]
--toCompact numero

Pelo monitor Jaime Freire

Falta a questão 06 que ainda tentarei fazer.

0 comentários:

Postar um comentário