Separación y mezcla de listas
Definir las funciones
1 2 |
separacion :: [a] -> ([a],[a]) mezcla :: ([a],[a]) -> [a] |
tales que (separacion xs) es el par formado eligiendo alternativamente elementos de xs mientras que mezcla intercala los elementos de las dos listas. Por ejemplo,
1 2 3 4 5 6 |
separacion [1..5] == ([1,3,5],[2,4]) mezcla ([1,3,5],[2,4]) == [1,2,3,4,5] separacion "Telescopio" == ("Tlsoi","eecpo") mezcla ("Tlsoi","eecpo") == "Telescopio" take 5 (fst (separacion [2,4..])) == [2,6,10,14,18] take 6 (mezcla ([2,4..],[7,14..])) == [2,7,4,14,6,21] |
Comprobar con QuickCheck que
1 |
mezcla (separacion xs) == xs |
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 38 39 40 41 42 43 44 45 46 47 |
import Test.QuickCheck -- 1ª definición (por recursión): separacion1 :: [a] -> ([a],[a]) separacion1 [] = ([], []) separacion1 [x] = ([x], []) separacion1 (x:y:zs) = (x:us,y:vs) where (us,vs) = separacion1 zs -- 2ª definición (por comprensión): separacion2 :: [a] -> ([a],[a]) separacion2 xs = ([x | (x,n) <- aux, even n], [x | (x,n) <- aux, odd n]) where aux = zip xs [0..] -- 3ª definición separacion3 :: [a] -> ([a],[a]) separacion3 [] = ([],[]) separacion3 (x:xs) = (x:zs, ys) where (ys, zs) = separacion3 xs -- Comprobación de eficiencia -- ghci> last (snd (separacion1 [1..10000000])) -- 10000000 -- (10.73 secs, 2,945,794,552 bytes) -- -- ghci> last (snd (separacion2 [1..10000000])) -- 10000000 -- (16.33 secs, 4,351,366,976 bytes) -- -- λ> last (snd (separacion3 [1..10000000])) -- 10000000 -- (15.67 secs, 4,423,573,048 bytes) mezcla :: ([a],[a]) -> [a] mezcla ([],ys) = ys mezcla (xs,[]) = xs mezcla (x:xs,y:ys) = x : y : mezcla (xs,ys) -- La propiedad es prop_mezcla_separacion :: [Int] -> Bool prop_mezcla_separacion xs = mezcla (separacion xs) == xs -- La comprobación es -- ghci> quickCheck prop_mezcla_separacion -- +++ OK, passed 100 tests. |
5 Comentarios