{"id":4514,"date":"2019-01-07T06:00:43","date_gmt":"2019-01-07T04:00:43","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4514"},"modified":"2019-01-14T10:04:10","modified_gmt":"2019-01-14T08:04:10","slug":"cadena-descendiente-de-subnumeros","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/cadena-descendiente-de-subnumeros\/","title":{"rendered":"Cadena descendiente de subn\u00fameros"},"content":{"rendered":"<p>Una particularidad del 2019 es que se puede escribir como una cadena de dos subn\u00fameros consecutivos (el 20 y el 19).<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\"> \n   cadena :: Integer -> [Integer]\n<\/pre>\n<p>tal que (cadena n) es la cadena de subn\u00fameros consecutivos de n cuya uni\u00f3n es n; es decir, es la lista de n\u00fameros [x,x-1,&#8230;x-k] tal que su concatenaci\u00f3n es n. Por ejemplo,<\/p>\n<pre lang=\"text\">  \n   cadena 2019         == [20,19]\n   cadena 2018         == [2018]\n   cadena 1009         == [1009]\n   cadena 110109       == [110,109]\n   cadena 201200199198 == [201,200,199,198] \n   cadena 3246         == [3246]            \n   cadena 87654        == [8,7,6,5,4]       \n   cadena 123456       == [123456]          \n   cadena 1009998      == [100,99,98]       \n   cadena 100908       == [100908]          \n   cadena 1110987      == [11,10,9,8,7]     \n   cadena 210          == [2,1,0]           \n   cadena 1            == [1]               \n   cadena 0            == [0]               \n   cadena 312          == [312]             \n   cadena 191          == [191]\n   length (cadena (read (concatMap show [2019,2018..0])))  ==  2020\n<\/pre>\n<p>Nota: Los subn\u00fameros no pueden empezar por cero. Por ejemplo, [10,09] no es una cadena de 1009 como se observa en el tercer ejemplo.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Test.QuickCheck\nimport Data.List (inits)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\ncadena :: Integer -> [Integer]\ncadena = head . cadenasL . digitos\n\n-- (digitos n) es la lista de los d\u00edgitos de n. Por ejemplo, \n--    digitos 325  ==  [3,2,5]\ndigitos :: Integer -> [Integer]\ndigitos n = [read [c] | c <- show n]\n\n-- (cadenasL xs) son las cadenas descendientes del n\u00famero cuyos d\u00edgitos\n-- son xs. Por ejemplo,\n--    cadenasL [2,0,1,9]      == [[20,19],[2019]]\n--    cadenasL [1,0,0,9]      == [[1009]]\n--    cadenasL [1,1,0,1,0,9]  == [[110,109],[110109]]\ncadenasL :: [Integer] -> [[Integer]] \ncadenasL []       = []\ncadenasL [x]      = [[x]]\ncadenasL [1,0]    = [[1,0],[10]]\ncadenasL (x:0:zs) = cadenasL (10*x:zs) \ncadenasL (x:y:zs) =\n     [x:a:as | (a:as) <- cadenasL (y:zs), a == x-1]\n  ++ cadenasL (10*x+y:zs)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\ncadena2 :: Integer -> [Integer]\ncadena2 n = (head . concatMap aux . iniciales) n \n  where aux x = [[x,x-1..x-k] | k <- [0..x]\n                              , concatMap show [x,x-1..x-k] == ds]\n        ds    = show n\n\n-- (iniciales n) es la lista de los subn\u00fameros iniciales de n. Por\n-- ejemplo, \n--    iniciales 2019  ==  [2,20,201,2019]\niniciales :: Integer -> [Integer]\niniciales = map read . tail . inits . show\n\n-- Equivalencia\n-- ============\n\n-- La propiedad es\nprop_cadena :: (Positive Integer) -> Bool\nprop_cadena (Positive n) =\n  cadena n == cadena2 n \n  \n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_cadena\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> length (cadena (read (concatMap show [15,14..0])))\n--    16\n--    (3.28 secs, 452,846,008 bytes)\n--    \u03bb> length (cadena2 (read (concatMap show [15,14..0])))\n--    16\n--    (0.03 secs, 176,360 bytes)\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nLa inseguridad, la incertidumbre, la desconfianza, son acaso nuestras \u00fanicas verdades. Hay que aferrarse a ellas.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Una particularidad del 2019 es que se puede escribir como una cadena de dos subn\u00fameros consecutivos (el 20 y el 19). Definir la funci\u00f3n cadena :: Integer -> [Integer] tal que (cadena n) es la cadena de subn\u00fameros consecutivos de n cuya uni\u00f3n es n; es decir, es la lista de n\u00fameros [x,x-1,&#8230;x-k] tal que&#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,58,71,74,10,11,6,33,45],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4514"}],"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=4514"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4514\/revisions"}],"predecessor-version":[{"id":4559,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4514\/revisions\/4559"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}