Menu Close

Primer elemento repetido

Definir la función

   primerRepetido :: Eq a => [a] -> Maybe a

tal que (primerRepetido xs) es justo el primer elemento repetido de la lista xs o Nothing si no tiene elementos repetidos. Por ejemplo,

   primerRepetido [3,7,5,7,2]  ==  Just 7
   primerRepetido [3,9,5,6,2]  ==  Nothing

Soluciones

primerRepetido :: Eq a => [a] -> Maybe a
primerRepetido xs = aux xs []
  where
    aux [] _                     = Nothing
    aux (x:xs') ys | x `elem` ys = Just x
                   | otherwise   = aux xs' (x:ys)

Otras soluciones

  • Se pueden escribir otras soluciones en los comentarios.
  • El código se debe escribir entre una línea con <pre lang=”haskell”> y otra con </pre>

Pensamiento

“¿Cuál es el núcleo central de la ciencia de la computación? ¿Qué es lo que lo diferencia de los otros temas con los que se relaciona? ¿Qué es lo que el hilo de unión que reúne estas ramas dispares en una sola disciplina? Mi respuesta a estas preguntas es simple: es el arte de programar un ordenador. Es el arte de diseñar métodos eficientes y elegantes para conseguir que un ordenador resuelva problemas, teóricos o prácticos, pequeños o grandes, simples o complejos. Es el arte de traducir estos diseños programas correctos y eficientes.”

Tony Hoare.

5 soluciones de “Primer elemento repetido

  1. anthormol
    primerRepetido :: Eq a => [a] -> Maybe a
    primerRepetido [] = Nothing
    primerRepetido (x:xs)
      | x `elem` xs = Just x
      | otherwise   = primerRepetido xs
  2. Carlos
    primerRepetido :: Eq a => [a] -> Maybe a
    primerRepetido = go []
      where go rs [] = Nothing
            go rs (x:xs)
              | elem x rs = Just x
              | otherwise = go (x:rs) xs
  3. jesvazper1
    import Data.List (intersect)
     
    primerRepetido :: Eq a => [a] -> Maybe a
    primerRepetido xs
      | seRepiteUno xs == True  = Just (head (repetidos xs))
      | seRepiteUno xs == False = Nothing
     
    seRepiteUno :: Eq a => [a] -> Bool
    seRepiteUno (x:[]) = False
    seRepiteUno (x:xs)
      | intersect [x] xs == [] = seRepiteUno xs
      | intersect [x] xs == [x] = True
     
    repetidos :: Eq a => [a] -> [a]
    repetidos (x:[]) = []
    repetidos (x:xs)
      | intersect [x] xs /= [] = [x] ++ repetidos xs
      | intersect [x] xs == [] = repetidos xs
  4. melgonaco
    import Data.List (find, delete)
     
    primerRepetido :: Eq a => [a] -> Maybe a
    primerRepetido xs = find esRepetido xs
      where esRepetido n = aux n xs
               where aux n xs = n `elem` (delete n xs)
  5. javjimord
    primerRepetido :: Eq a => [a] -> Maybe a
    primerRepetido xs
      | null ys   = Nothing
      | otherwise = Just (head ys)
      where ys = [x | x <- xs, repeticiones x xs >= 2]
     
    repeticiones :: Eq a => a -> [a] -> Integer
    repeticiones _ []  = 0
    repeticiones _ [_] = 0
    repeticiones x (y:xs)
      | x == y = 1 + repeticiones x xs
      | x /= y = repeticiones x xs

Leave a Reply

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