{"id":1743,"date":"2015-11-20T06:00:02","date_gmt":"2015-11-20T04:00:02","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=1743"},"modified":"2016-05-01T20:11:02","modified_gmt":"2016-05-01T18:11:02","slug":"ternas-con-suma-acotada","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/ternas-con-suma-acotada\/","title":{"rendered":"Ternas con suma acotada"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   ternasAcotadas :: [Int] -> Int -> [(Int,Int,Int)]\n<\/pre>\n<p>tal que (ternasAcotadas xs n) es el conjunto de ternas de n\u00fameros naturales de xs cuya suma es menor que n. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   ternasAcotadas [5,1,5,4,7] 12      ==  [(1,4,5),(1,5,5)]\n   ternasAcotadas [5,1,5,4,7] 11      ==  [(1,4,5)]\n   ternasAcotadas [5,1,5,4,7] 10      ==  []\n   ternasAcotadas [1..10^6] 8         ==  [(1,2,3),(1,2,4)]\n   ternasAcotadas [10^6,10^6-1..1] 8  ==  [(1,2,3),(1,2,4)]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (tails, sort, nub)\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\nternasAcotadas :: [Int] -> Int -> [(Int,Int,Int)]\nternasAcotadas xs n =\n    nub [(x,y,z) | (x,y,z) <- ternas (sort xs)\n                 , x+y+z < n]\n\n-- (ternas xs) es la lista de ternas de elementos de xs. Por ejemplo,\n--    \u03bb> ternas [1..5]\n--    [(1,2,3),(1,2,4),(1,2,5),(1,3,4),(1,3,5),(1,4,5),\n--     (2,3,4),(2,3,5),(2,4,5),\n--     (3,4,5)]\nternas :: [a] -> [(a,a,a)]\nternas xs = [(x,y,z) | (x:ys) <- tails xs\n                     , (y:zs) <- tails ys\n                     , z <- zs]\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nternasAcotadas2 :: [Int] -> Int -> [(Int,Int,Int)]\nternasAcotadas2 xs n = nub (aux (sort xs))\n    where aux xs = [(x,y,z) | (x:ys) <- tails (takeWhile (< n) xs)\n                            , (y:zs) <- tails (takeWhile (< (n-x)) ys)\n                            , z <- takeWhile (< (n-x-y)) zs]\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> ternasAcotadas [1..1000] 10\n--    [(1,2,3),(1,2,4),(1,2,5),(1,2,6),(1,3,4),(1,3,5),(2,3,4)]\n--    (336.06 secs, 50,595,444,208 bytes)\n--    \u03bb> ternasAcotadas2 [1..1000] 10\n--    [(1,2,3),(1,2,4),(1,2,5),(1,2,6),(1,3,4),(1,3,5),(2,3,4)]\n--    (0.00 secs, 0 bytes)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n ternasAcotadas :: [Int] -> Int -> [(Int,Int,Int)] tal que (ternasAcotadas xs n) es el conjunto de ternas de n\u00fameros naturales de xs cuya suma es menor que n. Por ejemplo, ternasAcotadas [5,1,5,4,7] 12 == [(1,4,5),(1,5,5)] ternasAcotadas [5,1,5,4,7] 11 == [(1,4,5)] ternasAcotadas [5,1,5,4,7] 10 == [] ternasAcotadas [1..10^6] 8 == [(1,2,3),(1,2,4)] ternasAcotadas [10^6,10^6-1..1]&#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":[8,24,11,14,75,34],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1743"}],"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=1743"}],"version-history":[{"count":5,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1743\/revisions"}],"predecessor-version":[{"id":1777,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/1743\/revisions\/1777"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=1743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=1743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=1743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}