1ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professor: Fernando Castor
Monitores: Agay Borges (abn), Cleivson Siqueira (csa3),
Dennis Silveira (dwas), Eduardo Rocha (ejfrf),
Lívia Vilaça (lcjbv), Lucas Inojosa (licf), Luís Gabriel Lima (lgnfl),
Walter Ferreira (wflf), Wellington Oliveira (woj)
CIn-UFPE – 2011.1 Disponível desde: 10/03/2011
Entrega: 29/03/2011
A lista deverá ser respondida em dupla. A falha em entregar a lista até a data estipulada implicará na perda de 0,25 ponto na média da disciplina para os membros da dupla. Considera-se que uma lista na qual menos que 37%(7 questões) das respostas estão corretas não foi entregue. A entrega da lista com pelo menos 80%(15 questões) das questões corretamente respondidas implica em um acréscimo de 0,125 ponto na média da disciplina para os membros da dupla. Se qualquer situação de cópia de respostas for identificada, os membros de todas as duplas envolvidas perderão 0,5 ponto na média da disciplina. O mesmo vale para respostas obtidas a partir da Internet. As respostas deverão ser entregues exclusivamente em formato texto ASCII (nada de .pdf, .doc, .docx ou .odt) e deverão ser enviadas para o monitor responsável por sua dupla, sem cópia para o professor. Tanto podem ser organizadas em arquivos separados, um por questão (e, neste caso, deverão ser zipadas), quanto em um único arquivo texto onde a resposta de cada questão está devidamente identificada e é auto-contida (uma parte da resposta de uma questão que seja útil para responder uma outra deve estar duplicada neste última). Para definir qual será o monitor responsável por corrigir a sua lista, vá até o endereço http://sites.google.com/a/cin.ufpe.br/monitoria-plc/ e inclua (a página é editável) os nomes dos dois membros da sua dupla, junto com os logins, embaixo do nome do monitor que tiver menos duplas e com base na ordem em que os nomes dos monitores aparecem na página.
1) Defina uma função ehPalindromo :: [t] -> Bool, que recebe uma Lista de elementos e retorna True se for palíndromo e False em caso contrário.
- Exemplo:
Prelude> ehPalindromo "arara" True
Prelude>
2) Defina uma função changeCase :: [Char] -> [Char], que inverte as letras de uma String de entrada, de maiuscula para minuscula e vice-versa.
- Exemplo:
Prelude> changeCase ‚Isto eh Um TEStE‛ ‚iSTO EH uM tesTe‛
Prelude>
- Exemplo:
Prelude> montar ['t','e','s','t','e'] "testes" False
Prelude> montar ['a','b','c','l','e','f','h','l','k','s'] "haskell" True
Prelude>
4)
Escreva uma função primeFibonacci :: Int -> [Int], que recebe um inteiro e retorna a lista de números primos contidos na sequência de fibonacci para esse número n.- Exemplo:
Prelude> primeFibonacci 5 [2,3,5]
Prelude>
5) Defina uma função group :: [(String, Int)] -> [(String, [Int])]. Essa função vai receber uma lista de tuplas que representam (chave, valor), onde pode existir mais de uma tupla com a mesma chave. A função group deve retornar uma nova lista de tuplas que represente uma
hashtable (ou seja, não pode existir mais de um par para uma determinada chave). Para isso a
função deve agrupar todos os valores das tuplas com mesma chave em uma lista de valores e retornar uma lista com elementos do tipo (chave, [valores]).
- Exemplo:
Prelude> group [("k1", 1), ("k2", 2), ("k1", 3), ("k1", 4), ("k3", 5), ("k2", 6)] [("k1",[1,3,4]),("k2",[2,6]),("k3",[5])]
Prelude>
6) Você está escrevendo uma aplicação em Haskell que se comunica com o Twitter. Dado a limitação de 140 caracteres por tweet é interessante utilizar recursos de encurtamento de url para quando for necessário colocar links nos tweets.
Escreva uma função shorten :: String -> String que encurta links do YouTube.
Obs: A string passada como entrada para função será sempre uma url de vídeo válida do YouTube (incluindo http:// e www) onde o primeiro parâmetro da requisição GET será sempre o
parâmetro “v”.
- Exemplo:
Prelude> shorten ‚http://www.youtube.com/watch?v=Sa0C5Uxpd3c‛ "http://youtu.be/Sa0C5Uxpd3c"
Prelude> shorten ‚http://www.youtube.com/watch?v=ZiCSBH-uPxI&feature=youtu.be‛ ‚http://youtu.be/ZiCSBH-uPxI‛
Prelude>
7) Escreva uma função insertSeparator :: [String] -> String -> String, que recebe uma lista de strings e um separador e retorna a string resultado da concatenação entre as strings passadas, intercaladas pelo separador.
Obs: Não colocar o separador no final.
- Exemplo:
8) Defina a função maxMin :: [(Int,Int)] → ((Int,Int),(Int,Int)) que recebe uma lista de tuplas de dois inteiros e retorna a tupla que contém o maior inteiro e a tupla que contem o menor inteiro.
- Exemplo:
Prelude> maxMin [(6,4),(1,8),(3,6),(7,9)] ((7,9),(1,8))
Prelude> maxMin [] ((0,0),(0,0)) Prelude>
9) Construa uma função partition :: [Int] -> Int -> ([Int], [Int]) para particionar uma lista de inteiros em duas novas listas a partir de um valor k.
- Exemplo:
Prelude> partition [7,1,2,3,6,2,0,5,2,6,3,4,6,8] 3 ([7,1,2],[3,6,2,0,5,2,6,3,4,6,8])
Prelude>
10) Defina uma função separarEMultiplicarNumeros :: [Int] -> Int -> ([Int], [Int]), a qual recebe uma lista de números inteiros, e retorna uma tupla com 2 listas: a da esquerda com os números pares da lista da entrada, e a da direita os números ímpares da lista de entrada multiplicados pelo número passado como segundo argumento. Os números devem estar na mesma ordem da lista original.
- Exemplo:
Prelude> separarEMultiplicarNumeros [2, 93, 7, 29, 62, 49, 47, 31, 94] 3 ([2, 62, 94], [279, 21, 87, 147, 141, 93])
Prelude>
11) Defina uma função calcularMMCeMDC :: [Int] -> (Int,Int), que recebe uma lista de inteiros, e retorna uma tupla, cujo primeiro valor é o Mínimo Múltiplo Comum (MMC) e o segundo valor é o Máximo Divisor Comum (MDC) dos elementos da lista.
- Exemplo:
Prelude> calcularMMCeMDC [15,24,60] (120,3)
Prelude>
12) Defina uma função eliminaMaiusculas :: String -> String que recebe uma string qualquer e retorna uma string sem as letras maiúsculas contidas na string de entrada.
- Exemplo:
Prelude> eliminaMaiusculas "ZaQpAYno" "apno"
Prelude>
- Exemplo:
Prelude> busca "Maracatu" ["Samba","Maracatu Rural","Frevo","Maracatu Nação","Cavalo Marinho"]
["Maracatu Rural","Maracatu Nação"] Prelude>
14) Construa uma função que recebe uma lista de nomes e retorna uma tupla com o nome e a quantidade de ocorrencias deste nome nesta lista.
- Exemplo:
Prelude> occurrences ["macaco", "macaco", "girafa", "zebra", "zebra", "zebra", "macaco", "girafa"]
[("macaco",3),("girafa",2),("zebra",3)] Prelude>
15) Defina uma função polimórfica eliminarPadrao :: Eq w => [[w]] -> [w] -> [[w]], a qual recebe uma lista de listas, e uma lista, ambas contendo elementos do mesmo tipo. essa função deverá procurar o padrão da segunda lista recebida nas primeiras listas, inclusive algum que comece numa lista e termine na próxima. E o retorno será a nova lista de listas com os padrões retirados.
Para esclarecer, um exemplo:
Prelude> eliminarPadrao ["oitudobom","blzcomovaitu","dootimocara"] "tudo"
O padrão "tudo" está contido duas vezes nesta lista de listas, uma dentro da primeira das 3 listas (uma String é uma lista, lembrem!), e o outro começa na segunda lista e acaba na terceira. O algoritmo deve retirar esses padrões e retornar uma nova lista de listas, que ficará assim:
["oibom","blzcomovai","otimocara"]
- Exemplo:
Prelude> eliminarPadrao ["abcde","abcdefgabc","defghij"] "abcde" ["","fg","fghij"]
Prelude> eliminarPadrao [[1,2,3],[4,5,6],[3,4]] [3,4] [[1,2],[5,6],[]]
Prelude>
16) Defina uma função inverterSubstr :: String -> String -> String, que recebe uma cadeia de caracteres e um elemento, que será considerado como um delimitador das substrings. Ela deve retornar uma nova cadeia de caracteres, com a ordem dos caracteres de cada substring invertida. A ordem das substrings na cadeia deve mantida e as substrings devem ser separadas pelos elementos delimitadores, deixando-os em suas posições originais. Caso o elemento delimitador não se encontrar na cadeia, então inverta os caracteres da cadeia original.
- Exemplo :
Prelude> inverterSubstr "Meu nome eh Fulano" " "
"ueM emon he onaluF" --OBS: As substrings são as próprias palavras separadas por " " Prelude> inverterSubstr "Meu nome eh Fulano" "e"
"Memon ue eonaluF h" --OBS: As substrings são "M", "u nom", " ", "h Fulano" Prelude> inverterSubstr "Meu nome eh Fulano" "a"
"luF he emon ueMaon" --OBS: As substrings são "Meu nome eh Ful", "no" Prelude> inverterSubstr "Meu nome eh Fulano" "z"
"onaluF he emon ueM" --OBS: Como não encontra-se o elemento separador, então inverte-se toda a cadeia
17) Defina uma função batalhaNaval :: [(Char,Int,Bool)] -> Int -> [(Char,Int)] -> String onde [(Char,Int,Bool)] representa um tabuleiro com por exemplo (‘A’, 2, True) representando uma casa do tabuleiro com um navio presente, Int representa a quantidade de navios no tabuleiro, [(Char,Int)] representa as jogadas do adversário. A função deve devolver ‚vitória‛ se as jogadas conseguirem destruir todos os navios ou ‚derrota‛ se as jogadas não conseguirem destruir todos os navios.
- Exemplo:
Prelude> batalhaNaval [('A',1,False), ('A',2,False), ('A',3,True), ('B',1,True), ('B',2,True), ('B',3,False), ('C',1,False), ('C',2,False), ('C',3,False)] 3 [('A',1), ('B',1), ('B',2), ('C',2), ('A',3)]
"vitoria"
Prelude> batalhaNaval [('A',1,True), ('A',2,False), ('A',3,True), ('B',1,False), ('B',2,True), ('B',3,False), ('C',1,False), ('C',2,False), ('C',3,True)] 4 [('A',1), ('A',2), ('C',1), ('C',2), ('A',3)]
"derrota" Prelude>
18) Faca a função ordenar :: [String] -> [String] que ordena uma lista de strings da que tem menos caracteres para a que tem mais. Caso seja encontrado duas strings com o mesmo tamanho elas devem ficar em ordem lexicográfica.
- Exemplo :
Prelude> ordenar ["ac","a","addd","aab","add","ad","adde","ade","af"] ["a","ac","ad","af","aab","add","ade","addd","adde"]
Prelude>
19) Defina uma função avaliadorEBF :: String -> Bool, que recebe uma expressão como parâmetro e retorna um valor booleano indicando se ela é uma expressão bem-formada (EBF).
Considere as regras de construção das EBF’s. Os caracteres utilizados serão:
- ‘0’ como False e ‘1’ como True; - ‘x’ e ‘y’ como variáveis;
- ‘+’ como OR, ‘.’ como AND, ‘-‘ como NOT, ‘>’ como implicação e ‘^’ como XOR; - ‘(’ e ‘)‘ são os parênteses para separar os operadores.
Obs: Note que para cada operação, deve haver um par de parênteses associados.
- Exemplo:
Prelude> avaliadorEBF "((x+y)+(0.1))" True
Prelude> avaliadorEBF "((x.x)+(-y))" True
Prelude> avaliadorEBF "((x+y)+(0.1()" False