-- 1ª definición
-- =============
equilibrios1 :: (Num a, Eq a) => [a] -> [Int]
equilibrios1 xs =
[n | n <- [0..length xs - 1]
, sum (take n xs) == sum (drop (n+1) xs)]
-- 2ª definición
-- =============
equilibrios2 :: (Num a, Eq a) => [a] -> [Int]
equilibrios2 xs =
[n | (n,x,y) <- zip3 [0..] (sumasI xs) (sumasD xs)
, x == y]
sumasI :: (Num a, Eq a) => [a] -> [a]
sumasI xs = [sum (take n xs) | n <- [0..length xs - 1]]
sumasD :: (Num a, Eq a) => [a] -> [a]
sumasD xs = [sum (drop (n+1) xs) | n <- [0..length xs - 1]]
-- 3ª definición
-- =============
equilibrios3 :: (Num a, Eq a) => [a] -> [Int]
equilibrios3 xs =
[n | (n,x,y) <- zip3 [0..] (sumasI' xs) (sumasD' xs)
, x == y]
sumasI' :: (Num a, Eq a) => [a] -> [a]
sumasI' = init . scanl (+) 0
sumasD' :: (Num a, Eq a) => [a] -> [a]
sumasD' = tail . scanr (+) 0
-- 4ª definición
-- =============
equilibrios4 :: (Num a, Eq a) => [a] -> [Int]
equilibrios4 xs =
[n | (n,x,y) <- zip3 [0..] (scanl1 (+) xs) (scanr1 (+) xs)
, x == y]
-- Comparación de eficiencia
-- λ> let xs = [1..10^4] in equilibrios1 (xs ++ [5] ++ reverse xs)
-- [10000]
-- (20.92 secs, 46,240,541,256 bytes)
-- λ> let xs = [1..10^4] in equilibrios2 (xs ++ [5] ++ reverse xs)
-- [10000]
-- (21.12 secs, 46,249,562,520 bytes)
-- λ> let xs = [1..10^4] in equilibrios3 (xs ++ [5] ++ reverse xs)
-- [10000]
-- (0.02 secs, 11,858,768 bytes)
-- λ> let xs = [1..10^4] in equilibrios4 (xs ++ [5] ++ reverse xs)
-- [10000]
-- (0.02 secs, 13,963,952 bytes)