Número de viajeros en el autobús
Un autobús inicia su recorrido con 0 viajeros. El número de viajeros que se suben y bajan en cada parada se representa por un par (x,y) donde x es el número de las que suben e y el de las que bajan. Un recorrido del autobús se representa por una lista de pares representando los números de viajeros que suben o bajan en cada parada.
Definir la función
1 |
nViajerosEnBus :: [(Int, Int)] -> Int |
tal que (nViajerosEnBus ps) es el número de viajeros en el autobús tras el recorrido ps. Por ejemplo,
1 2 3 4 |
nViajerosEnBus [] == 0 nViajerosEnBus [(10,0),(3,5),(5,8)] == 5 nViajerosEnBus [(3,0),(9,1),(4,10),(12,2),(6,1),(7,10)] == 17 nViajerosEnBus [(3,0),(9,1),(4,8),(12,2),(6,1),(7,8)] == 21 |
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 |
import Data.List (foldl') -- 1ª solución (por comprensión) nViajerosEnBus1 :: [(Int, Int)] -> Int nViajerosEnBus1 ps = sum [a - b | (a,b) <- ps] -- 2ª solucioń (por recursión) nViajerosEnBus2 :: [(Int, Int)] -> Int nViajerosEnBus2 [] = 0 nViajerosEnBus2 ((a,b):ps) = a - b + nViajerosEnBus2 ps -- 3ª solución (por recursión con acumulador) nViajerosEnBus3 :: [(Int, Int)] -> Int nViajerosEnBus3 = aux 0 where aux n [] = n aux n ((a,b):xs) = aux (n+a-b) xs -- 4ª solución (por plegado por la derecha): nViajerosEnBus4 :: [(Int, Int)] -> Int nViajerosEnBus4 = foldr (\(a,b) n -> a-b+n) 0 -- 5ª solución (por plegado por la derecha): nViajerosEnBus5 :: [(Int, Int)] -> Int nViajerosEnBus5 = foldl' (\n (a,b) -> a-b+n) 0 -- 6ª solución (con map) nViajerosEnBus6 :: [(Int, Int)] -> Int nViajerosEnBus6 xs = sum (map (\(x,y) -> x-y) xs) -- 7ª solución (por composición y sin argumentos) nViajerosEnBus7 :: [(Int, Int)] -> Int nViajerosEnBus7 = sum . map (uncurry (-)) |
Asignarle su tipo a la función auxiliar f consigue una mejora en la eficiencia tal que así: