Ir al contenido principal

Segmentos de longitud dada

Definir la función

segmentos :: Int -> [a] -> [[a]]

tal que (segmentos n xs) es la lista de los segmentos de longitud n de la lista xs. Por ejemplo,

segmentos 3 [1..5]  ==  [[1,2,3],[2,3,4],[3,4,5]]

Soluciones

import Data.List (tails)

-- 1ª definición (por recursión)
segmentos1 :: Int -> [a] -> [[a]]
segmentos1 n xs
    | length xs < n = []
    | otherwise     = take n xs : segmentos1 n (tail xs)

-- 2ª definición (con tails):
segmentos2 :: Int -> [a] -> [[a]]
segmentos2 n xs =
    takeWhile (\ys -> length ys == n) (map (take n) (tails xs))

-- 3ª definición:
segmentos3 :: Int -> [a] -> [[a]]
segmentos3 n xs =
    take (length xs - n + 1) (map (take n) (tails xs))

--    λ> length (segmentos1 3 [1..30000])
--    29998
--    (2.99 secs, 13998816 bytes)
--
--    λ> length (segmentos2 3 [1..30000])
--    29998
--    (0.05 secs, 16941304 bytes)
--
--    λ> length (segmentos3 3 [1..30000])
--    29998
--    (0.04 secs, 10375520 bytes)
--
--    λ> length (segmentos2 3 [1..1000000])
--    999998
--    (0.70 secs, 498098336 bytes)
--
--    λ> length (segmentos3 3 [1..1000000])
--    999998
--    (0.24 secs, 273979304 bytes)