Menu Close

Mezcla de listas

Definir la función

   mezcla :: [[a]] -> [a]

tal que (mezcla xss) es la lista tomando sucesivamente los elementos de xss en la misma posición. Cuando una de las listas de xss es vacía, se continua con las restantes. por ejemplo,

   mezcla [[1,2],[3..7],[8..10]]            ==  [1,3,8,2,4,9,5,10,6,7]
   mezcla ["Estamos","en","2019"]           ==  "Ee2sn0t1a9mos"
   take 9 (mezcla [[3,6..],[5,7..],[0,1]])  ==  [3,5,0,6,7,1,9,9,12]

Soluciones

import Data.List (transpose)
 
-- 1ª solución
mezcla :: [[a]] -> [a]
mezcla xss = aux (filter (not . null) xss)
  where
    aux []  = []
    aux yss = map head yss ++ mezcla (map tail yss)
 
-- 2ª solución
mezcla2 :: [[a]] -> [a]
mezcla2 = aux . filter (not . null)
  where
    aux []  = []
    aux yss = map head yss ++ mezcla (map tail yss)
 
-- 3ª solución
mezcla3 :: [[a]] -> [a]
mezcla3 = concatMap primeros . takeWhile (not . null) . iterate restos
  where primeros = map head . filter (not . null)
        restos   = map tail . filter (not . null)
 
-- 4ª solución
mezcla4 :: [[a]] -> [a]
mezcla4 = concat . transpose

Pensamiento

Cuatro cosas tiene el hombre
que no sirven en la mar:
ancla, gobernalle y remos,
y miedo de naufragar.

Antonio Machado

Medio

5 soluciones de “Mezcla de listas

  1. frahidzam
    mezcla :: [[a]] -> [a]
    mezcla []  = []
    mezcla xss = aux (filter (not . null) xss)
      where aux yss = map head yss ++ mezcla (map tail yss)
  2. adogargon
    mezcla :: [[a]] -> [a]
    mezcla [] = []
    mezcla xss
      | any null xss = mezcla (filter (not . null) xss)
      | otherwise    = map head xss ++ mezcla (map tail xss)
  3. luipromor
    mezcla :: [[a]] -> [a]
    mezcla [] = []
    mezcla xss
      | or (map null xss) = mezcla (aux xss)
      | otherwise         = map head xss ++ mezcla (map tail xss)
      where aux [] = []
            aux (xs:xss) | null xs   = aux xss
                         | otherwise = xs : aux xss
  4. javmarcha1
    mezcla :: [[a]] -> [a]
    mezcla xss | and [null xs | xs <- xss] = []
    mezcla xss = concat (map sacar xss) ++ mezcla (map (drop 1) xss)
     
    sacar :: [a] -> [a]
    sacar []     = []
    sacar (x:xs) = [x]
  5. Diego
    import Data.List (transpose)
     
    mezcla :: [[a]] -> [a]
    mezcla = concat . transpose

Escribe tu solución

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