{"id":4800,"date":"2019-03-07T06:00:44","date_gmt":"2019-03-07T04:00:44","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4800"},"modified":"2021-04-25T16:22:58","modified_gmt":"2021-04-25T14:22:58","slug":"suma-de-segmentos-iniciales-2019","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/suma-de-segmentos-iniciales-2019\/","title":{"rendered":"Suma de segmentos iniciales"},"content":{"rendered":"<p>Los segmentos iniciales de [3,1,2,5] son [3], [3,1], [3,1,2] y [3,1,2,5]. Sus sumas son 3, 4, 6 y 9, respectivamente. La suma de dichas sumas es 24.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\"> \n   sumaSegmentosIniciales :: [Integer] -> Integer\n<\/pre>\n<p>tal que (sumaSegmentosIniciales xs) es la suma de las sumas de los segmentos iniciales de xs. Por ejemplo,<\/p>\n<pre lang=\"text\"> \n   sumaSegmentosIniciales [3,1,2,5]     ==  24\n   sumaSegmentosIniciales3 [1..3*10^6]  ==  4500004500001000000\n<\/pre>\n<p>Comprobar con QuickCheck que la suma de las sumas de los segmentos iniciales de la lista formada por n veces el n\u00famero uno es el n-\u00e9simo n\u00famero triangular; es decir que<\/p>\n<pre lang=\"text\"> \n   sumaSegmentosIniciales (genericReplicate n 1)\n<\/pre>\n<p>es igual a<\/p>\n<pre lang=\"text\"> \n   n * (n + 1) `div` 2\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericLength, genericReplicate)\nimport Test.QuickCheck\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nsumaSegmentosIniciales :: [Integer] -> Integer\nsumaSegmentosIniciales xs =\n  sum [sum (take k xs) | k <- [1.. length xs]]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nsumaSegmentosIniciales2 :: [Integer] -> Integer\nsumaSegmentosIniciales2 xs =\n  sum (zipWith (*) [n,n-1..1] xs)\n  where n = genericLength xs\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nsumaSegmentosIniciales3 :: [Integer] -> Integer\nsumaSegmentosIniciales3 xs =\n  sum (scanl1 (+) xs)\n\n-- Comprobaci\u00f3n de la equivalencia\n-- ===============================\n\n-- La propiedad es\nprop_sumaSegmentosInicialesEquiv :: [Integer] -> Bool\nprop_sumaSegmentosInicialesEquiv xs =\n  all (== sumaSegmentosIniciales xs) [f xs | f <- [ sumaSegmentosIniciales2\n                                                  , sumaSegmentosIniciales3]]\n\n-- La comprobaci\u00f3n es\n--   \u03bb> quickCheck prop_sumaSegmentosInicialesEquiv\n--   +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--   \u03bb> sumaSegmentosIniciales [1..10^4]\n--   166716670000\n--   (2.42 secs, 7,377,926,824 bytes)\n--   \u03bb> sumaSegmentosIniciales2 [1..10^4]\n--   166716670000\n--   (0.01 secs, 4,855,176 bytes)\n--   \n--   \u03bb> sumaSegmentosIniciales2 [1..3*10^6]\n--   4500004500001000000\n--   (2.68 secs, 1,424,404,168 bytes)\n--   \u03bb> sumaSegmentosIniciales3 [1..3*10^6]\n--   4500004500001000000\n--   (1.54 secs, 943,500,384 bytes)\n\n-- Comprobaci\u00f3n de la propiedad\n-- ============================\n\n-- La propiedad es\nprop_sumaSegmentosIniciales :: Positive Integer -> Bool\nprop_sumaSegmentosIniciales (Positive n) =\n  sumaSegmentosIniciales3 (genericReplicate n 1) ==\n  n * (n + 1) `div` 2\n\n-- La compronaci\u00f3n es\n--   \u03bb> quickCheck prop_sumaSegmentosIniciales\n--   +++ OK, passed 100 tests.\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nAl andar se hace camino,<br \/>\ny al volver la vista atr\u00e1s<br \/>\nse ve la senda que nunca<br \/>\nse ha de volver a pisar.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Los segmentos iniciales de [3,1,2,5] son [3], [3,1], [3,1,2] y [3,1,2,5]. Sus sumas son 3, 4, 6 y 9, respectivamente. La suma de dichas sumas es 24. Definir la funci\u00f3n sumaSegmentosIniciales :: [Integer] -> Integer tal que (sumaSegmentosIniciales xs) es la suma de las sumas de los segmentos iniciales de xs. Por ejemplo, sumaSegmentosIniciales [3,1,2,5]&#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":[5],"tags":[41,8,30,175,11,252,40,47,146,467],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4800"}],"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=4800"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4800\/revisions"}],"predecessor-version":[{"id":4828,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4800\/revisions\/4828"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}