Segmentos de longitud dada
Definir la función
1 |
segmentos :: Int -> [a] -> [[a]] |
tal que (segmentos n xs) es la lista de los segmentos de longitud n de la lista xs. Por ejemplo,
1 |
segmentos 3 [1..5] == [[1,2,3],[2,3,4],[3,4,5]] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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)) -- ghci> length (segmentos1 3 [1..30000]) -- 29998 -- (2.99 secs, 13998816 bytes) -- -- ghci> length (segmentos2 3 [1..30000]) -- 29998 -- (0.05 secs, 16941304 bytes) -- -- ghci> length (segmentos3 3 [1..30000]) -- 29998 -- (0.04 secs, 10375520 bytes) -- -- ghci> length (segmentos2 3 [1..1000000]) -- 999998 -- (0.70 secs, 498098336 bytes) -- -- ghci> length (segmentos3 3 [1..1000000]) -- 999998 -- (0.24 secs, 273979304 bytes) |
Esta definición falla para el caso n = 1.