{"id":6211,"date":"2021-03-29T06:00:36","date_gmt":"2021-03-29T04:00:36","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6211"},"modified":"2021-04-05T08:45:11","modified_gmt":"2021-04-05T06:45:11","slug":"autonumeros","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/autonumeros\/","title":{"rendered":"Auton\u00fameros"},"content":{"rendered":"<p>Un <a href=\"https:\/\/bit.ly\/3c3ROeo\">auton\u00famero<\/a> es un n\u00famero entero  n tal que no existe ning\u00fan n\u00famero entero positivo k tal que n sea igual a la suma de k y los d\u00edgitos de k. Por ejemplo, 5 es un auton\u00famero pero 21 no lo es ya que 21=15+1+5.<\/p>\n<p>Definir la lista<\/p>\n<pre lang=\"text\">\n   autonumeros :: [Integer]\n<\/pre>\n<p>cuyos elementos son los auton\u00fameros. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 20 autonumeros\n   [1,3,5,7,9,20,31,42,53,64,75,86,97,108,110,121,132,143,154,165]\n   \u03bb> autonumeros !! 1200\n   12236\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nautonumeros :: [Integer]\nautonumeros = filter autonumero [1..]\n\n-- (autonumero n) se verifica si n es un auton\u00famero. Por ejemplo,\n--    autonumero 5  == True\n--    autonumero 21 == False\nautonumero :: Integer -> Bool\nautonumero n =\n  all (\/=n) [k + sum (digitos k) | k <- [1..n]]\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 a = [read [c] | c <-show a]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nautonumeros2 :: [Integer]\nautonumeros2 = map head sucesionSucesionesSumasDigitales\n\n-- sucesionSucesionesSumasDigitales es la lista de las sucesiones de\n-- sumas parciales tal que el primer elemento de cada sucesi\u00f3n es el\n-- menor elemento que no pertenece a las sucesiones anteriores. Por\n-- ejemplo,\n--    \u03bb> map (take 4) (take 8 sucesionSucesionesSumasDigitales)\n--    [[1,2,4,8],[3,6,12,15],[5,10,11,13],[7,14,19,29],\n--     [9,18,27,36],[20,22,26,34],[31,35,43,50],[42,48,60,66]]\nsucesionSucesionesSumasDigitales :: [[Integer]]\nsucesionSucesionesSumasDigitales = aux [1..]\n  where aux xs = sucesion xs : aux (diferencia xs (sucesion xs))\n        sucesion xs = sucesionSumasDigitales (head xs)\n\n-- (diferencia xs ys) es la diferencia las listas infinitas ordenadas\n-- crecientes xs e ys. Por ejemplo,\n--    \u03bb> take 8 (diferencia [1..] [2,4..])\n--    [1,3,5,7,9,11,13,15]\ndiferencia :: [Integer] -> [Integer] -> [Integer]\ndiferencia (x:xs) (y:ys)\n  | x == y    = diferencia xs ys\n  | otherwise = x : diferencia xs (y:ys)\n\n-- (sucesionSumasDigitales a) es la sucesi\u00f3n de las sumas digitales\n-- definida por un n\u00famero a. Por ejemplo,\n--    \u03bb> take 16 (sucesionSumasDigitales 1)\n--    [1,2,4,8,16,23,28,38,49,62,70,77,91,101,103,107]\n--    \u03bb> take 16 (sucesionSumasDigitales 3)\n--    [3,6,12,15,21,24,30,33,39,51,57,69,84,96,111,114]\n--    \u03bb> take 16 (sucesionSumasDigitales 5)\n--    [5,10,11,13,17,25,32,37,47,58,71,79,95,109,119,130]\n--    \u03bb> take 16 (sucesionSumasDigitales 7)\n--    [7,14,19,29,40,44,52,59,73,83,94,107,115,122,127,137]\n--    \u03bb> take 16 (sucesionSumasDigitales 9)\n--    [9,18,27,36,45,54,63,72,81,90,99,117,126,135,144,153]\n--    \u03bb> take 16 (sucesionSumasDigitales 20)\n--    [20,22,26,34,41,46,56,67,80,88,104,109,119,130,134,142]\nsucesionSumasDigitales :: Integer -> [Integer]\nsucesionSumasDigitales a =\n  iterate siguienteSumaDigital a\n\n-- (siguienteSumaDigital a) es el siguiente de a en la sucesi\u00f3n de sumas\n-- digitales. Por ejemplo,\n--    siguienteSumaDigital 23 == 28\nsiguienteSumaDigital :: Integer -> Integer\nsiguienteSumaDigital a =\n  a + sum (digitos a)\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> autonumeros !! 150\n--    1502\n--    (4.54 secs, 13,302,379,936 bytes)\n--    \u03bb> autonumeros2 !! 150\n--    1502\n--    (0.06 secs, 41,794,872 bytes)\n<\/pre>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Un auton\u00famero es un n\u00famero entero n tal que no existe ning\u00fan n\u00famero entero positivo k tal que n sea igual a la suma de k y los d\u00edgitos de k. Por ejemplo, 5 es un auton\u00famero pero 21 no lo es ya que 21=15+1+5. Definir la lista autonumeros :: [Integer] cuyos elementos son los&#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":[2],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6211"}],"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=6211"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6211\/revisions"}],"predecessor-version":[{"id":6259,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6211\/revisions\/6259"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}