Bons estudos à todos e ótima prova na sexta 11/10/2013
-- Resolucao da Prova
--Dados necessarios para questao
type BancoDeDados = [Onibus]
type Onibus = (Codigo, Origem, Destino, Horario, [Passageiro])
type Codigo = Int
type Origem = String
type Destino = String
type Horario = String
type Passageiro = String
exemplo :: BancoDeDados
exemplo = [ (1, "salvador", "vitoria da conquista", "8:00", ["carlos", "maria", "rita"]),
(2, "salvador", "vitoria da conquista", "12:30", []),
(3, "vitoria da conquista", "Ilheus","9:00", ["ana", "joana", "rita"]),
(4, "salvador", "Ilheus", "22:00", ["fabio", "jose","carlos", "maria", "rita"])]
-- Questao 01
-- _ eh uma variavel anonima, utilizo quando esta variavel é irrelevante para o resultado da minha funcao
-- orig = oriigem recebida
-- ori = origem da tupla definida no BD
-- Letra a
quantOnibus :: BancoDeDados -> Origem -> Int
quantOnibus [ ] _ = 0
quantOnibus (( cod, ori, des, hor, pas) : cauda) orig
|ori == orig = 1 + quantOnibus cauda orig
| otherwise = quantOnibus cauda orig
-- Letra b
obterHorario :: BancoDeDados -> Origem -> [Horario]
obterHorario [ ] _ = [ ]
obterHorario ((_, ori, _, hor, _) : cauda) orig
| ori == orig = hor : obterHorario cauda orig
| otherwise = obterHorario cauda orig
-- Letra c
obterHorario2 :: BancoDeDados -> Origem -> [Horario]
obterHorario2 bd orig = [ h | (_, ori, _, h, _) <- bd, ori == orig]
-- Letra d
incluir :: BancoDeDados -> Codigo -> Passageiro -> BancoDeDados
incluir [ ] _ _ = [ ]
incluir ((cod, ori, des, hor, pas) : cauda) codi pass
| cod == codi = (cod, ori, des, hor, pass: pas) : cauda
| otherwise = (cod, ori, des, hor, pas) : incluir cauda codi pass
-- Questao 02
-- Letra a
remove :: [Int] -> [Int]
remove [ ] = [ ]
remove [n] = [n]
remove (a : b : c)
| a == b = remove(b : c)
| otherwise = a : remove (b : c)
-- Letra b
intercalar :: [Int] -> [Int] -> [Int]
intercalar [ ] lista = lista
intercalar (a : b) lista = inserir a (intercalar b lista)
inserir :: Int -> [Int] -> [Int]
inserir n [ ] = [n]
inserir n (a : b)
| n <= a = n : a : b
| otherwise = a : inserir n b
-- Outra forma para letra b da questao 02
intercalar2 :: [Int] -> [Int] -> [Int]
intercalar2 [ ] l = l
intercalar2 l [ ] = l
intercalar2 (a:b) (c:d)
|a <= c = a : intercalar2 b (c:d)
|otherwise = c : intercalar2 (a:b) d
Com a ajuda de Jaime Freire
-- Resolucao da Prova
--Dados necessarios para questao
type BancoDeDados = [Onibus]
type Onibus = (Codigo, Origem, Destino, Horario, [Passageiro])
type Codigo = Int
type Origem = String
type Destino = String
type Horario = String
type Passageiro = String
exemplo :: BancoDeDados
exemplo = [ (1, "salvador", "vitoria da conquista", "8:00", ["carlos", "maria", "rita"]),
(2, "salvador", "vitoria da conquista", "12:30", []),
(3, "vitoria da conquista", "Ilheus","9:00", ["ana", "joana", "rita"]),
(4, "salvador", "Ilheus", "22:00", ["fabio", "jose","carlos", "maria", "rita"])]
-- Questao 01
-- _ eh uma variavel anonima, utilizo quando esta variavel é irrelevante para o resultado da minha funcao
-- orig = oriigem recebida
-- ori = origem da tupla definida no BD
-- Letra a
quantOnibus :: BancoDeDados -> Origem -> Int
quantOnibus [ ] _ = 0
quantOnibus (( cod, ori, des, hor, pas) : cauda) orig
|ori == orig = 1 + quantOnibus cauda orig
| otherwise = quantOnibus cauda orig
-- Letra b
obterHorario :: BancoDeDados -> Origem -> [Horario]
obterHorario [ ] _ = [ ]
obterHorario ((_, ori, _, hor, _) : cauda) orig
| ori == orig = hor : obterHorario cauda orig
| otherwise = obterHorario cauda orig
-- Letra c
obterHorario2 :: BancoDeDados -> Origem -> [Horario]
obterHorario2 bd orig = [ h | (_, ori, _, h, _) <- bd, ori == orig]
-- Letra d
incluir :: BancoDeDados -> Codigo -> Passageiro -> BancoDeDados
incluir [ ] _ _ = [ ]
incluir ((cod, ori, des, hor, pas) : cauda) codi pass
| cod == codi = (cod, ori, des, hor, pass: pas) : cauda
| otherwise = (cod, ori, des, hor, pas) : incluir cauda codi pass
-- Questao 02
-- Letra a
remove :: [Int] -> [Int]
remove [ ] = [ ]
remove [n] = [n]
remove (a : b : c)
| a == b = remove(b : c)
| otherwise = a : remove (b : c)
-- Letra b
intercalar :: [Int] -> [Int] -> [Int]
intercalar [ ] lista = lista
intercalar (a : b) lista = inserir a (intercalar b lista)
inserir :: Int -> [Int] -> [Int]
inserir n [ ] = [n]
inserir n (a : b)
| n <= a = n : a : b
| otherwise = a : inserir n b
-- Outra forma para letra b da questao 02
intercalar2 :: [Int] -> [Int] -> [Int]
intercalar2 [ ] l = l
intercalar2 l [ ] = l
intercalar2 (a:b) (c:d)
|a <= c = a : intercalar2 b (c:d)
|otherwise = c : intercalar2 (a:b) d
Com a ajuda de Jaime Freire