1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

(URGENTE) Haskell exercicio

Discussão em 'Programação' iniciada por carteirista, 9 de Janeiro de 2008. (Respostas: 5; Visualizações: 2235)

  1. boas pessoal, alguem m consegue resolver este exercicio sff!?!?!? Usando apenas funçoes d ordem superior, map foldr e filter!


    type Equipa = [Char]
    type Golos = Int
    type Pontuacao = ([Char], Int)
    type Campeonato = [Pontuacao]
    type Jogo = (Equipa, Golos, Equipa, Golos)

    liga = [ ("Boavista", 5), ("Porto", 18), ("Benfica", 12), ("Sporting", 10), ("Braga", 8)]

    1) Dado um campeonato, retorna o nome da equipa (só o nome da equipa) que vai em último lugar.

    2) No ambito do apito dourado foi decidido retirar 1 ponto a todos os clubes.
    Dado um campeonato, devolva um campeonato com menos 1 ponto em cada clube.

    3) Devolva a lista de equipas com mais de 10 pontos.

    4) Some todos os pontos do campeonato.
    Escreva duas funções com o mesmo resultado.

    4.1) Utilizando obrigatoriamente a função 'unzip'
    4.2) Sem a função 'unzip'.

    5) Dado um campeonato e a informação de um jogo, retorne um novo campeonato com a pontuação actualizada, utilizando 3 pontos para a equipa que vence, e 1 ponto para as duas equipas, caso empatem.
     
    Última edição: 9 de Janeiro de 2008
  2. Se disseres quais são as dúvidas que tens é mais fácil ajudar...
     
  3. As duvidas estao em resolver o exercicio todo!!!
    N consigo por nenhum a correr no ghc!!!
    Ja vou colar o k fiz ate agora!

    Module teste where

    type Equipa = [Char]
    type Golos = Int
    type Pontuacao = ([Char], Int)
    type Campeonato = [Pontuacao]
    type Jogo = (Equipa, Golos, Equipa, Golos)


    PERGUNTA 1


    liga = [("Boavista", 5), ("Porto", 18), ("Benfica", 12), ("Sporting", 10), ("Braga", 8)]

    retiraponto :: Campeonato -> Campeonato
    retiraponto [] = []
    retiraponto l x= map (\(a,b)->(a,(tira x b) 1
    where tira y 1


    PERGUNTA 2

    maisdedez :: Pontuação -> Equipa
    maisdedez [] = []
    maisdedez l y = filter (\(a,b)-> b >= y) 10


    Sabes de algum erro aqui? Obg.
     
    Última edição pelo moderador: 9 de Janeiro de 2008
  4. estive a ver as tuas funções

    na pergunta 2 a "Tira 1 Ponto"
    não era mais fácil fazer
    Código:
    tira :: Campeonato -> Campeonato
    tira x = map (\(a,b)->(a,b-1)) x
    
    na pergunta 3 a "Mais de 10 Pontos"
    Código:
    mais :: Campeonato -> Campeonato
    mais x = filter (\(a,b)->b>=10) x
    
    pelo que fizeste dá para ver que não percebeste bem o conceito de ordem superior,
    se fosse a ti revia os apontamentos sobre isso antes de tentar fazer mais alguma coisa :P

    alguma duvida é so perguntar, já te fiz duas para veres como é fácil as outras são do mesmo genero ( uma «cagada» ) mas para as fazeres tens de primeiro perceber o que é uma função de ordem superior e o que ela faz, neste caso elas vão tratar da recursividade por ti e mais "bla bla" que de certeza que esta nos apontamentos
     

  5. Lol obrigado pela ajuda... foi pena ter vindo 1 pouco tarde... tive d entregar o exercicio a 13:30... thanks anyway
    Vou ter d ver melhor esta cena do haskell, mas n gosto nd disto... mt complicado e o GHC atrofia com um espaço a + ou uma virgula fora do sitio...
    Os apontamentos, tb podiam tar + simples, dd recursividad ate funçoes d ordem superior, é fdd d entender!!!
     
  6. o Haskell é um bocado 'mariquinhas' nessas coisas dos alinhamentos...
    quanto ao tempo de resposta nada a fazer, tenta perguntar com mais tempo

    apontamentos... no meu tempo queixava-me do mesmo...

    as funções de ordem superior são funções que recebem funções como argumento
    por exemplo a função map recebe como argumentos uma função para aplicar a cada elemento da lista e a lista
    outra coisa que deves ter em mente é que as funções map foldr e filter alem de serem de ordem superior também são funções que implementam elas próprias os padrões de recursividade das listas em Haskell

    a map e a filter poderiam ser definidas como
    Código:
    map :: (a -> b) -> [a] -> [b]
    map _ [] = []
    map f (h:t) = (f h) : (map f t)
    
    filter :: (a->Bool) -> [a] -> [a]
    filter _ [] = []
    filter f (h:t) = if (f h) then h:(filter f t) else (filter f t)
    
    nao sei se o prof deu a solução, mas uma possível solução para o exercício seria

    Código:
    --- 1 ---
    ultimo :: Campeonato -> Equipa
    -- ultimo [] = error "nao ha equipas"
    ultimo (h:t) = fst(foldr f h t)
     where
      f :: Pontuacao -> Pontuacao -> Pontuacao
      f (a,b) (c,d) = if b<d 
                       then (a,b)
                       else (c,d)
    
    --- 2 ---
    tira :: Campeonato -> Campeonato
    tira = map (\(a,b)->(a,b-1))
    
    --- 3 ---
    maisD10 :: Campeonato -> Campeonato
    maisD10 = filter ((10<).snd)
    
    --- 4 ---
    --4.1
    somaV1 :: Campeonato -> Int
    somaV1 = (foldr (+) 0).snd.unzip
    
    --4.2
    somaV2 :: Campeonato -> Int
    somaV2 = foldr ((+).snd) 0
    
    --- 5 ---
    actualiza :: Campeonato -> Jogo -> Campeonato
    actualiza x y = map (f y) x
     where
      f :: Jogo -> Pontuacao -> Pontuacao
      f (ec,gec,ea,gea) (e,p) | (gec == gea) && (e == ec || e == ea) = (e,p+1)
                              | (gec >  gea) && (e == ec)            = (e,p+3)
                              | (gea >  gec) && (e == ea)            = (e,p+3)
                              | otherwise                            = (e,p)
    
     
    Última edição pelo moderador: 11 de Janeiro de 2008

Partilhar esta Página