UTNianos

Versión completa: [Haskell] Obtener elementos repetidos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Como les va? Estaba tratando de hacer un parcial de la pagina de pdp y me trabé en una parte. Dice:

Obtener los elementos repetidos de una lista
>repetidos [1,2,3,1,2,44]
[1,2]

Yo llegue a hacer:
repetidos lista = [elemento | elemento <-lista, length (filter (elemento==) lista) > 1]

El tema es que me muestra dos veces el elemento 1 y dos veces el elemento 2 (no se como hacer que si ya encontro a ese elemento no lo vuelva a comparar)

Gracias, Eric!
A mí me quedó así!

sinRepetidos listaNum | listaNum == [] = []
| any (== head listaNum) (tail listaNum) = sinRepetidos (tail listaNum)
| otherwise = (take 1 listaNum) ++ sinRepetidos (tail listaNum)
y como haces para obtener solo los que estaban repetidos?

Eric!
Aaaaaah, pensé que era el mismo ejercicio, perdón jajaja.

repetidos listaNum | listaNum == [] = []
| any (== head listaNum) (tail listaNum) = (take 1 listaNum) ++ repetidos (tail listaNum)
| otherwise = repetidos (tail listaNum)

No me fijé si compila. El tema es que me parece que si el número se repite más de una vez, te lo devuelve repetido. Si querés que no te pase eso, por ahí convendría hacer esto:

Repetidos listaNum | listaNum == [] = []
| any (== head listaNum) (tail listaNum) = (take 1 listaNum) ++ repetidos (filter (==(take 1 listaNum)) listaNum)

Lo que hice fue en la segunda guarda fue sacar todos los que se repetían en la lista. Decime si no se entiende mi solución jaja también la estoy cursando así que soy medio desastre todavía
Si te sirve de algo, mi resolucion!!! =)

sinrep [x]=[]
sinrep (x:xs) | x elem xs = sinrep (xs)
| otherwise x:sinrep (xs)

repetidos [x] = []
repetidos (x:xs) | not ( elem) x xs = repetidos xs
| otherwise x: repetidos xs
sigue pasando lo mismo:

>repetidos [1,2,2,3,1,1,4]
[1,2,1]

Eric!
Este salió =)

repetidos listaNum | listaNum == [] = []
| any (== head listaNum) (tail listaNum) = (take 1 listaNum) ++ repetidos (filter (/=(head listaNum)) listaNum)
| otherwise = repetidos (tail listaNum)
A mi se me ocurrió llamar a otra función con una lista que sabe los elementos repetidos:


repetidosDe lista = repetidosDe' [] lista

repetidosDe' accum [] = accum
repetidosDe' accum (x:xs)
| elem x xs && not (elem x accum) = repetidosDe' (x:accum) xs
| otherwise = repetidosDe' accum xs


esta seria la solución para filtrar los elementos repetidos de una lista, lo que hace es ir recorriendo la lista y se fija si la cabeza(x) de la lista vuelve a aparecer en la cola(xs) de la lista si es asi aplica la funcion "repetidos" sobre la cola(xs) y sino no elimina la cabeza(x) y continua aplicando repetidos a la cola(xs), todo hasta que se llega al último elemento de la lista que se supone que no va a estar repetido.

repetidos [x] = [x]
repetidos (x:xs) | elem x xs = repetidos xs
| otherwise = x: repetidos xs
URLs de referencia