{"id":2698,"date":"2016-12-15T06:00:55","date_gmt":"2016-12-15T04:00:55","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=2698"},"modified":"2016-12-22T08:34:26","modified_gmt":"2016-12-22T06:34:26","slug":"posiciones-de-equilibrio","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/posiciones-de-equilibrio\/","title":{"rendered":"Posiciones de equilibrio"},"content":{"rendered":"<p>Se dice que k es una <strong>posici\u00f3n de equilibrio<\/strong> de una lista xs si la suma de los elementos de xs en las posiciones menores que k es igual a la suma de los elementos de xs en las posiciones mayores que k. Por ejemplo, en la lista [-7,1,5,2,-4,3,0] el 3 es una posici\u00f3n de equilibrio ya que -7+1+5 = -4+3+0; tambi\u00e9n lo es el 6 ya que -7+1+5+2+(-4)+3 = 0.<\/p>\n<p>Definir la funci\u00f3n,<\/p>\n<pre lang=\"text\">\n   equilibrios :: (Num a, Eq a) => [a] -> [Int]\n<\/pre>\n<p>tal que (equilibrios xs) es la lista de las posiciones de equilibrio de xs. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   equilibrios [-7,1,5,2,-4,3,0]  ==  [3,6]\n   equilibrios [1..10^6]          ==  []\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa definici\u00f3n\n-- =============\n\nequilibrios1 :: (Num a, Eq a) => [a] -> [Int]\nequilibrios1 xs =\n  [n | n <- [0..length xs - 1]\n     , sum (take n xs) == sum (drop (n+1) xs)]\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nequilibrios2 :: (Num a, Eq a) => [a] -> [Int]\nequilibrios2 xs =\n  [n | (n,x,y) <- zip3 [0..] (sumasI xs) (sumasD xs)\n     , x == y]\n\nsumasI :: (Num a, Eq a) => [a] -> [a]\nsumasI xs = [sum (take n xs) | n <- [0..length xs - 1]] \n\nsumasD :: (Num a, Eq a) => [a] -> [a]\nsumasD xs = [sum (drop (n+1) xs) | n <- [0..length xs - 1]] \n\n-- 3\u00aa definici\u00f3n\n-- =============\n\nequilibrios3 :: (Num a, Eq a) => [a] -> [Int]\nequilibrios3 xs =\n  [n | (n,x,y) <- zip3 [0..] (sumasI' xs) (sumasD' xs)\n     , x == y]\n\nsumasI' :: (Num a, Eq a) => [a] -> [a]\nsumasI'  = init . scanl (+) 0 \n\nsumasD' :: (Num a, Eq a) => [a] -> [a]\nsumasD' = tail . scanr (+) 0\n\n-- 4\u00aa definici\u00f3n\n-- =============\n\nequilibrios4 :: (Num a, Eq a) => [a] -> [Int]\nequilibrios4 xs =\n  [n | (n,x,y) <- zip3 [0..] (scanl1 (+) xs) (scanr1 (+) xs)\n     , x == y]\n\n-- Comparaci\u00f3n de eficiencia\n--    \u03bb> let xs = [1..10^4] in equilibrios1 (xs ++ [5] ++ reverse xs)\n--    [10000]\n--    (20.92 secs, 46,240,541,256 bytes)\n--    \u03bb> let xs = [1..10^4] in equilibrios2 (xs ++ [5] ++ reverse xs)\n--    [10000]\n--    (21.12 secs, 46,249,562,520 bytes)\n--    \u03bb> let xs = [1..10^4] in equilibrios3 (xs ++ [5] ++ reverse xs)\n--    [10000]\n--    (0.02 secs, 11,858,768 bytes)\n--    \u03bb> let xs = [1..10^4] in equilibrios4 (xs ++ [5] ++ reverse xs)\n--    [10000]\n--    (0.02 secs, 13,963,952 bytes)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Se dice que k es una posici\u00f3n de equilibrio de una lista xs si la suma de los elementos de xs en las posiciones menores que k es igual a la suma de los elementos de xs en las posiciones mayores que k. Por ejemplo, en la lista [-7,1,5,2,-4,3,0] el 3 es una posici\u00f3n de&#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":[7],"tags":[8,46,285,28,11,78,358,40,45,47,44],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/2698"}],"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=2698"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/2698\/revisions"}],"predecessor-version":[{"id":2733,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/2698\/revisions\/2733"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=2698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=2698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=2698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}