Menu Close

Elementos no repetidos

Definir la función

   noRepetidos :: Eq a => [a] -> [a]

tal que (noRepetidos xs) es la lista de los elementos no repetidos de la lista xs. Por ejemplo,

   noRepetidos [3,2,5,2,4,7,3]  ==  [5,4,7]
   noRepetidos "noRepetidos"    ==  "nRptids"
   noRepetidos "Roma"           ==  "Roma"

Soluciones

import Test.QuickCheck
 
-- 1ª solución
-- ===========
 
noRepetidos :: Eq a => [a] -> [a]
noRepetidos xs = 
  [x | x <- xs, ocurrencias x xs == 1]
 
-- (ocurrencias x ys) es el número de ocurrencias de x en ys. Por
-- ejemplo,
--    ocurrencias 3 [3,2,5,2,4,7,3]  ==  2
--    ocurrencias 5 [3,2,5,2,4,7,3]  ==  1
ocurrencias :: Eq a => a -> [a] -> Int
ocurrencias x ys = 
  length [y | y <- ys, y == x]
 
-- 2ª solución
-- ===========
noRepetidos2 :: Eq a => [a] -> [a]
noRepetidos2 [] = []
noRepetidos2 (x:xs) | elem x xs = noRepetidos2 [y | y <- xs, y /= x]
                    | otherwise = x : noRepetidos2 xs
 
-- Equivalencia
-- ============
 
-- La propiedad de equivalencia es
prop_equivalencia :: [Int] -> Bool
prop_equivalencia xs =
  noRepetidos xs == noRepetidos2 xs
 
-- La comprobación es
--    ghci> quickCheck prop_equivalencia
--    +++ OK, passed 100 tests.

Pensamiento

Y en perfecto rimo
— así a la vera del agua
el doble chopo del río.

Antonio Machado

Inicial

11 soluciones de “Elementos no repetidos

  1. adogargon
    import Data.List 
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos [x] =  [x]
    noRepetidos (x:xs) | x`elem`xs = noRepetidos (xs \[x])
                        | otherwise = x:noRepetidos xs
    • guicabgod

      Falla para los elementos que aparecen más de dos veces. Por ejemplo,

      λ> noRepetidos [5,2,5,2,5]
      [5]
  2. luipromor
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos [] = []
    noRepetidos (x:xs)
      | elem x xs = noRepetidos $ filter (/=x) xs
      | otherwise = x : noRepetidos xs
  3. frahidzam
    import Data.List (nub)
     
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos xs =
      [a | (a,b) <- zip (nub xs) [length (filter (==c) xs) | c <- nub xs],
           b == 1]
  4. ampjargar
    import Data.List (delete)
     
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos xs = [x | x <- xs, not (elem x (delete x xs))]
  5. marlimand
    import Data.List (nub)
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos [] = []
    noRepetidos [x] = [x]
    noRepetidos (x:xs) | x `elem`xs = noRepetidos (dropWhile (==x) (nub xs))
                       | otherwise =[x] ++  noRepetidos xs
    • guicabgod

      Falla en el primer ejemplo

      λ> noRepetidos [3,2,5,2,4,7,3]
      [2,5,4,7,3]

      pero el 2 y el 3 están repetidos.

  6. guicabgod

    En Python

    def noRepetidos(xs):
        return [x for x in xs if ocurrencias(x,xs) == 1]
     
    # (ocurrencias x xs) es el número de ocurrencias de x en xs. Por
    # ejemplo, 
    #    >>> ocurrencias(1,[1,2,3,4,3,2,3,1,4]) 
    #    2
    def ocurrencias(x,xs):
        return len([x1 for x1 in xs if x == x1])
  7. rafasidia
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos [] = []
    noRepetidos (x:xs) | elem x xs = noRepetidos (filter (/=x) (x:xs))
                       | otherwise = x:(noRepetidos xs)
  8. javmarcha1
    import Data.List
     
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos xs = [ x | x <- xs, not(elem x (xs \ nub xs))]
  9. ireprirod
    noRepetidos :: Eq a => [a] -> [a]
    noRepetidos xs = [ x | x<-xs, length (filter (==x) xs )== 1]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.