{"id":6186,"date":"2021-03-18T06:00:24","date_gmt":"2021-03-18T04:00:24","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6186"},"modified":"2021-03-25T09:15:18","modified_gmt":"2021-03-25T07:15:18","slug":"numeros-ordenados-con-cuadrados-ordenados","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-ordenados-con-cuadrados-ordenados\/","title":{"rendered":"N\u00fameros ordenados con cuadrados ordenados"},"content":{"rendered":"<p>Un n\u00famero es ordenado si cada uno de sus d\u00edgitos es menor o igual  el siguiente d\u00edgito. Por ejemplo, 116 es un n\u00famero creciente y su cuadrado es 13456, que tambi\u00e9n es ordenado. En cambio, 115 es ordenado pero su cuadrado es 13225 que no es ordenado.<\/p>\n<p>Definir la lista<\/p>\n<pre lang=\"text\">\n   numerosOrdenadosConCuadradosOrdenados :: [Integer]\n<\/pre>\n<p>cuyos elementos son los n\u00fameros ordenados cuyos cuadrados tambi\u00e9n lo son. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 20 numerosOrdenadosConCuadradosOrdenados\n   [0,1,2,3,4,5,6,7,12,13,15,16,17,34,35,37,38,67,116,117]\n   \u03bb> length (show (numerosOrdenadosConCuadradosOrdenados !! (10^6)))\n   1411\n   \u03bb> length (show (numerosOrdenadosConCuadradosOrdenados !! (5*10^6)))\n   3159\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nnumerosOrdenadosConCuadradosOrdenados :: [Integer]\nnumerosOrdenadosConCuadradosOrdenados =\n  filter numeroOrdenadoConCuadradoOrdenado [0..]\n\n-- (numeroOrdenadoConCuadradoOrdenado n) se verifica si n es un n\u00famero\n-- ordenado cuyo cuadrado tambi\u00e9n lo es. Por ejemplo,\n--    numeroOrdenadoConCuadradoOrdenado 116  ==  True\n--    numeroOrdenadoConCuadradoOrdenado 115  ==  False\nnumeroOrdenadoConCuadradoOrdenado :: Integer -> Bool\nnumeroOrdenadoConCuadradoOrdenado n =\n  ordenado n && ordenado (n^2)\n\n-- (ordenado n) se verifica si n es un n\u00famero ordenado. Por ejemplo,\n--    ordenado 115  ==  True\n--    ordenado 151  ==  False\nordenado :: Integer -> Bool\nordenado n =\n  and [x <= y | (x,y) <- zip xs (tail xs)]\n  where xs = show n\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\n-- Se basa en la observaci\u00f3n de los sisuientes c\u00e1lculos con la primera\n-- soluci\u00f3n\n--    \u03bb> take 30 numerosOrdenadosConCuadradosOrdenados\n--    [0,1,2,3,4,5,6,7,12,13,15,16,17,34,35,37,38,67,116,117,\n--     167,334,335,337,367,667,1667,3334,3335,3337]\n--    \u03bb> take 21 (dropWhile (<= 117) numerosOrdenadosConCuadradosOrdenados)\n--    [167,334,335,337,367,667,\n--     1667,3334,3335,3337,3367,3667,6667,\n--     16667,33334,33335,33337,33367,33667,36667,66667]\n--\n-- Se observa que a partir del 167 todos los elementos son de 4 tipos\n-- como se ve en la siguente tabla\n--    |-------+--------+--------+--------+--------|\n--    |       | Tipo A | Tipo B | Tipo C | Tipo D |\n--    |-------+--------+--------+--------+--------|\n--    |   167 | 16\u00b97   |        |        |        |\n--    |   334 |        | 3\u00b24    |        |        |\n--    |   335 |        |        | 3\u00b25    |        |\n--    |   337 |        |        |        | 3\u00b26\u20707  |\n--    |   367 |        |        |        | 3\u00b96\u00b97  |\n--    |   667 |        |        |        | 3\u20706\u00b27  |\n--    |  1667 | 16\u00b27   |        |        |        |\n--    |  3334 |        | 3\u00b34    |        |        |\n--    |  3335 |        |        | 3\u00b35    |        |\n--    |  3337 |        |        |        | 3\u00b36\u20707  |\n--    |  3367 |        |        |        | 3\u00b26\u00b97  |\n--    |  3667 |        |        |        | 3\u00b96\u00b27  |\n--    |  6667 |        |        |        | 3\u20706\u00b37  |\n--    | 16667 | 16\u00b37   |        |        |        |\n--    | 33334 |        | 3\u20744    |        |        |\n--    | 33335 |        |        | 3\u20745    |        |\n--    | 33337 |        |        |        | 3\u20746\u20707  |\n--    | 33367 |        |        |        | 3\u00b36\u00b97  |\n--    | 33667 |        |        |        | 3\u00b26\u00b27  |\n--    | 36667 |        |        |        | 3\u00b96\u00b37  |\n--    | 66667 |        |        |        | 3\u20706\u20747  |\n--    |-------+--------+--------+--------+--------|\n-- donde el exponente en cad d\u00edgito indica el n\u00famero de repeticiones de\n-- dicho d\u00edgito.\n\nnumerosOrdenadosConCuadradosOrdenados2 :: [Integer]\nnumerosOrdenadosConCuadradosOrdenados2 =\n  [0,1,2,3,4,5,6,7,12,13,15,16,17,34,35,37,38,67,116,117] ++\n  map read (concat [['1' : replicate n '6' ++ \"7\",\n                     replicate (n+1) '3' ++ \"4\",\n                     replicate (n+1) '3' ++ \"5\"] ++\n                    [replicate a '3' ++ replicate b '6' ++ \"7\"\n                    | b <- [0..n+1], let a = (n+1) - b]\n                   | n <- [1..]])\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> numerosOrdenadosConCuadradosOrdenados !! 50\n--    1666667\n--    (2.35 secs, 2,173,983,096 bytes)\n--    \u03bb> numerosOrdenadosConCuadradosOrdenados2 !! 50\n--    1666667\n--    (0.01 secs, 125,296 bytes)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La comprobaci\u00f3n es\n--    \u03bb> take 50 numerosOrdenadosConCuadradosOrdenados == take 50 numerosOrdenadosConCuadradosOrdenados2\n--    True\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","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero es ordenado si cada uno de sus d\u00edgitos es menor o igual el siguiente d\u00edgito. Por ejemplo, 116 es un n\u00famero creciente y su cuadrado es 13456, que tambi\u00e9n es ordenado. En cambio, 115 es ordenado pero su cuadrado es 13225 que no es ordenado. Definir la lista numerosOrdenadosConCuadradosOrdenados :: [Integer] cuyos elementos&#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":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6186"}],"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=6186"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6186\/revisions"}],"predecessor-version":[{"id":6220,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6186\/revisions\/6220"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}