Menu Close

Inserciones en una lista de listas

Definir la función

   inserta :: a -> [[a]] -> [[[a]]]

tal que (inserta x yss) es la lista obtenida insertando x en cada uno de los elementos de yss. Por ejemplo,

   λ> inserta 1 [[2,3],[4],[5,6,7]]
   [[[1,2,3],[4],[5,6,7]],[[2,3],[1,4],[5,6,7]],[[2,3],[4],[1,5,6,7]]]
   λ> inserta 'a' ["hoy","es","lunes"]
   [["ahoy","es","lunes"],["hoy","aes","lunes"],["hoy","es","alunes"]]

Soluciones

-- 1ª solución
inserta :: a -> [[a]] -> [[[a]]]
inserta _ []       = []
inserta x (ys:yss) = ((x:ys):yss) : [ys : zs | zs <- inserta x yss] 
 
-- 2ª solución
inserta2 :: a -> [[a]] -> [[[a]]]
inserta2 _ []       = []
inserta2 x (ys:yss) = ((x:ys):yss) : map (ys:) (inserta2 x yss)

Pensamiento

… De la mar al percepto,
del percepto al concepto,
del concepto a la idea
— ¡oh, la linda tarea! —
de la idea a la mar.
¡Y otra vez al empezar!

Antonio Machado

Inicial

5 soluciones de “Inserciones en una lista de listas

  1. frahidzam
    inserta :: a -> [[a]] -> [[[a]]]
    inserta x yss = insertaAux x yss 0
     
    insertaAux :: a -> [[a]] -> Int -> [[[a]]]
    insertaAux x yss n
      | n < length yss =
        insertaEnPos (x:(yss!!n)) yss (n+1) : insertaAux x yss (n+1)
      | otherwise = []
     
    insertaEnPos :: [a] -> [[a]] -> Int -> [[a]]
    insertaEnPos xss yss n =  take (n-1) yss ++ [xss] ++ drop n yss
  2. adogargon
    import Data.Matrix
     
    inserta :: a -> [[a]] -> [[[a]]]
    inserta x xss = toLists (matrix n n ((i,j) -> aux i j ))
      where n = length xss
            aux i j | i == j = x:(xss !! (j-1))
                    | otherwise = xss !! (j-1)
  3. luipromor
    inserta :: a -> [[a]] -> [[[a]]]
    inserta _ []  = []
    inserta a yss = [aux yss k 1 | k <- [1..length yss]]
      where aux [] _ _ = []
            aux (xs:xss) k n | k == n    = (a:xs) : aux xss k (n+1)
                             | otherwise = xs : aux xss k (n+1)
  4. berarcmat
    inserta :: a -> [[a]] -> [[[a]]]
    inserta x yss =
      zipWith (p ys -> take (snd p) yss ++ fst p: drop (snd p + 1) yss)
              (zip (modifica x yss) [0..]) yss
     
    modifica :: a -> [[a]] -> [[a]]
    modifica x yss = zipWith (:) (replicate m x) yss
      where m = length yss
     
    -- Com: usando comprensión
  5. javmarcha1
    insertaA5 :: a -> [[a]] -> [[[a]]]
    insertaA5 x xss =
      [ take n xss ++ [x : head (drop n xss)] ++ drop (n+1) xss
      | n <- [0..length xss-1]]

Escribe tu solución

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