{"id":3515,"date":"2017-12-12T06:00:52","date_gmt":"2017-12-12T04:00:52","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3515"},"modified":"2017-12-19T07:12:39","modified_gmt":"2017-12-19T05:12:39","slug":"reconocimiento-de-recorridos-correctos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/reconocimiento-de-recorridos-correctos\/","title":{"rendered":"Reconocimiento de recorridos correctos"},"content":{"rendered":"<p>Se usar\u00e1 la misma representaci\u00f3n del ejercicio anterior para las subidas y bajadas en el autob\u00fas; es decir, una lista de pares donde los primeros elementos es el n\u00famero de viajeros que suben y los segundo es el de los que bajan.<\/p>\n<p>Un recorrido es correcto si en cada bajada tanto el n\u00famero de viajeros que suben como los que bajan son positivos, el n\u00famero de viajeros en el autob\u00fas no puede ser mayor que su capacidad y el n\u00famero de viajeros que bajan no puede ser mayor que el n\u00famero de viajeros en el autob\u00fas. Se supone que en la primera parada el autob\u00fas no tiene viajeros.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   recorridoCorrecto :: Int -> [(Int,Int)] -> Bool\n<\/pre>\n<p>tal que (recorridoCorrecto n ps) se verifica si ps es un recorrido correcto en un autob\u00fas cuya capacidad es n. Por ejemplo,<\/p>\n<pre lang=\"text\">\n  recorridoCorrecto 20 [(3,0),(9,1),(4,10),(12,2),(6,1)]  ==  True\n  recorridoCorrecto 15 [(3,0),(9,1),(4,10),(12,2),(6,1)]  ==  False\n  recorridoCorrecto 15 [(3,2),(9,1),(4,10),(12,2),(6,1)]  ==  False\n  recorridoCorrecto 15 [(3,0),(2,7),(4,10),(12,2),(6,1)]  ==  False\n<\/pre>\n<p>el segundo ejemplo es incorrecto porque en la \u00faltima para se supera la capacidad del autob\u00fas; el tercero, porque en la primera para no hay viajeros en el autob\u00fas que se puedan bajar y el cuarto, porque en la 2\u00aa parada el autob\u00fas tiene 3 viajeros por lo que es imposible que se bajen 7.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa definici\u00f3n\nrecorridoCorrecto1 :: Int -> [(Int,Int)] -> Bool\nrecorridoCorrecto1 _ [] = True\nrecorridoCorrecto1 n ps = aux 0 ps\n  where aux _ []         = True\n        aux k ((a,b):ps) = 0 <= a &#038;&#038; a <= n - k + b &#038;&#038;\n                           0 <= b &#038;&#038; b <= k &#038;&#038;\n                           aux (k + a - b) ps\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nrecorridoCorrecto2 :: Int -> [(Int,Int)] -> Bool\nrecorridoCorrecto2 n ps =\n  all (\\(x,y) -> x >= 0 && y >= 0) ps &&\n  all (\\k -> 0 <= k &#038;&#038; k <= n) (viajeros ps)\n\n-- (viajeros ps) es el n\u00famero de viajeros despu\u00e9s de cada parada del\n-- recorrido ps. Por ejemplo,\n--   viajeros [(3,0),(9,1),(4,10),(12,2),(6,1)]  ==  [0,3,11,5,15,20]\n--   viajeros [(3,0),(2,7),(4,10),(12,2),(6,1)]  ==  [0,3,-2,-8,2,7]\nviajeros :: [(Int,Int)] -> [Int]\nviajeros ps = aux [0] ps\n  where aux ns     []         = reverse ns\n        aux (n:ns) ((a,b):ps) = aux (n+a-b:n:ns) ps \n\n-- 3\u00aa definici\u00f3n\n-- =============\n\nrecorridoCorrecto3 :: Int -> [(Int,Int)] -> Bool\nrecorridoCorrecto3 n ps =\n  all (\\(x,y) -> x >= 0 && y >= 0) ps &&\n  all (\\k -> 0 <= k &#038;&#038; k <= n) (viajeros3 ps)\n\n-- (viajeros3 ps) es el n\u00famero de viajeros despu\u00e9s de cada parada del\n-- recorrido ps. Por ejemplo,\n--   viajeros3 [(3,0),(9,1),(4,10),(12,2),(6,1)]  ==  [0,3,11,5,15,20]\n--   viajeros3 [(3,0),(2,7),(4,10),(12,2),(6,1)]  ==  [0,3,-2,-8,2,7]\nviajeros3 :: [(Int,Int)] -> [Int]\nviajeros3 = scanl (\\k (a,b) -> k+a-b) 0  \n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Se usar\u00e1 la misma representaci\u00f3n del ejercicio anterior para las subidas y bajadas en el autob\u00fas; es decir, una lista de pares donde los primeros elementos es el n\u00famero de viajeros que suben y los segundo es el de los que bajan. Un recorrido es correcto si en cada bajada tanto el n\u00famero de viajeros&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[4],"tags":[41,11,6,32,78],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3515"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/comments?post=3515"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3515\/revisions"}],"predecessor-version":[{"id":3547,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3515\/revisions\/3547"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}