{"id":3703,"date":"2018-02-06T06:00:52","date_gmt":"2018-02-06T04:00:52","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3703"},"modified":"2022-03-26T12:10:38","modified_gmt":"2022-03-26T10:10:38","slug":"division-equitativa","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/division-equitativa\/","title":{"rendered":"Divisi\u00f3n equitativa"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   divisionEquitativa :: [Int] -> Maybe ([Int],[Int])\n<\/pre>\n<p>tal que (divisionEquitativa xs) determina si la lista de n\u00fameros enteros positivos xs se puede dividir en dos partes (sin reordenar sus elementos) con la misma suma. Si es posible, su valor es el par formado por las dos partes. Si no lo es, su valor es Nothing. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   divisionEquitativa [1,2,3,4,5,15]  ==  Just ([1,2,3,4,5],[15])\n   divisionEquitativa [15,1,2,3,4,5]  ==  Just ([15],[1,2,3,4,5])\n   divisionEquitativa [1,2,3,4,7,15]  ==  Nothing\n   divisionEquitativa [1,2,3,4,15,5]  ==  Nothing\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.Maybe (isNothing, fromJust, listToMaybe)\nimport Data.List  (elemIndex, inits, tails)\n\n-- 1\u00aa soluci\u00f3n\ndivisionEquitativa1 :: [Int] -> Maybe ([Int],[Int])\ndivisionEquitativa1 xs = aux (particiones xs)\n where aux []                              = Nothing\n       aux ((as,bs):ys) | sum as == sum bs = Just (as,bs)\n                        | otherwise        = aux ys                   \n       particiones xs = [splitAt i xs | i <- [1..length xs-1]]\n\n-- 2\u00aa soluci\u00f3n\ndivisionEquitativa2 :: [Int] -> Maybe ([Int],[Int])\ndivisionEquitativa2 xs\n  | 2 * b == suma = Just $ splitAt (length as + 1) xs\n  | otherwise     = Nothing\n  where suma        = sum xs\n        (as,(b:bs)) = span (<suma `div` 2) $ scanl1 (+) xs\n\n-- 3\u00aa soluci\u00f3n\ndivisionEquitativa3 :: [Int] -> Maybe ([Int],[Int])\ndivisionEquitativa3 xs\n  | odd n       = Nothing\n  | isNothing p = Nothing\n  | otherwise   = Just (splitAt (1 + fromJust p) xs)\n  where n  = sum xs\n        ys = scanl1 (+) xs\n        p  = elemIndex (n `div` 2) ys\n\n-- 4\u00aa soluci\u00f3n\ndivisionEquitativa4 :: [Int] -> Maybe ([Int],[Int])\ndivisionEquitativa4 xs\n  | odd (sum xs) = Nothing\n  | otherwise    = aux [] xs\n  where aux as bs@(b:bs') | sum as == sum bs = Just (reverse as, bs)\n                          | sum as > sum bs  = Nothing\n                          | otherwise        = aux (b:as) (bs')\n\n-- 5\u00aa soluci\u00f3n\ndivisionEquitativa5 :: [Int] -> Maybe ([Int],[Int])\ndivisionEquitativa5 xs =\n  listToMaybe\n    [(ys, zs) | (ys,zs) <- zip (inits xs) (tails xs)\n              , sum ys == sum zs ]\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n divisionEquitativa :: [Int] -> Maybe ([Int],[Int]) tal que (divisionEquitativa xs) determina si la lista de n\u00fameros enteros positivos xs se puede dividir en dos partes (sin reordenar sus elementos) con la misma suma. Si es posible, su valor es el par formado por las dos partes. Si no lo es, su valor&#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":[500,30,420,419,418,92,11,252,73],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3703"}],"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=3703"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3703\/revisions"}],"predecessor-version":[{"id":3749,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3703\/revisions\/3749"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}