Pares a distancia dada
Definir la función
pares :: [Int] -> Int -> [(Int,Int)]
tal que (pares xs k) es la lista de pares de elementos de xs que están a distancia k (se supone que los elementos de xs son distintos). Por ejemplo,
pares [1,5,3,4,2,8] 2 == [(1,3),(3,5),(2,4)] length (pares [1..10^6] 3) == 999997
Soluciones
import Data.List (sort, tails) import Data.Set -- 1ª definición -- ============= pares1 :: [Int] -> Int -> [(Int,Int)] pares1 xs k = [(x,y) | x <- xs, y <- xs, y - x == k] -- 2ª definición -- ============= pares2 :: [Int] -> Int -> [(Int,Int)] pares2 xs k = [(y,y+k) | (y:ys) <- init (tails (sort xs)) , (y+k) `pertenece` ys] pertenece :: Int -> [Int] -> Bool pertenece _ [] = False pertenece x (y:ys) | x < y = False | x == y = True | otherwise = pertenece x ys -- 3ª definición -- ============= pares3 :: [Int] -> Int -> [(Int,Int)] pares3 xs k = [(x,x+k) | x <- xs , (x+k) `member` c] where c = fromList xs -- Comparación de eficiencia -- ========================= -- λ> length (pares1 [1..2000] 3) -- 1997 -- (4.26 secs, 471,640,672 bytes) -- λ> length (pares2 [1..2000] 3) -- 1997 -- (0.02 secs, 0 bytes) -- λ> length (pares3 [1..2000] 3) -- 1997 -- (0.01 secs, 0 bytes) -- -- λ> length (pares2 [1..10^6] 3) -- 999997 -- (6.00 secs, 855,807,112 bytes) -- λ> length (pares3 [1..10^6] 3) -- 999997 -- (3.67 secs, 390,934,904 bytes)