Ir al contenido principal

Intercalación de n copias

Definir la función

intercala :: Int -> a -> [a] -> [[a]]

tal que (intercala n x ys) es la lista de la listas obtenidas intercalando n copias de x en ys. Por ejemplo,

intercala 2 'a' "bc" == ["bcaa","baca","baac","abca","abac","aabc"]
intercala 2 'a' "c"  == ["caa","aca","aac"]
intercala 1 'a' "c"  == ["ca","ac"]
intercala 0 'a' "c"  == ["c"]

Nota: No importa el orden de los elementos.


Soluciones

import Data.List

-- 1ª solución
-- ===========

intercala1 :: Int -> a -> [a] -> [[a]]
intercala1 0 _ xs     = [xs]
intercala1 n y []     = [replicate n y]
intercala1 n y (x:xs) =
    concat [[replicate i y ++ (x:zs) | zs <- intercala1 (n-i) y xs]
            | i <- [0..n]]

-- 2ª solución
-- ===========

intercala2 :: Eq a => Int -> a -> [a] -> [[a]]
intercala2 n x ys = nub (aux n x ys)
    where
      aux 0 _ ys = [ys]
      aux n x ys = concat [intercalaUno x zs | zs <- aux (n-1) x ys]

--    intercalaUno 'a' "bc"  == ["abc","bac","bca"]
intercalaUno :: a -> [a] -> [[a]]
intercalaUno x []     = [[x]]
intercalaUno x (y:ys) = (x:y:ys) : [y:zs | zs <- intercalaUno x ys]