{"id":4957,"date":"2019-04-25T06:00:45","date_gmt":"2019-04-25T04:00:45","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4957"},"modified":"2021-04-25T16:03:01","modified_gmt":"2021-04-25T14:03:01","slug":"mayor-capicua-producto-de-dos-numeros-de-n-cifras-2019","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/mayor-capicua-producto-de-dos-numeros-de-n-cifras-2019\/","title":{"rendered":"Mayor capic\u00faa producto de dos n\u00fameros de n cifras"},"content":{"rendered":"<p>Un capic\u00faa es un n\u00famero que es igual le\u00eddo de izquierda a derecha que de derecha a izquierda.<\/p>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\"> \n   mayorCapicuaP :: Integer -> Integer\n<\/pre>\n<p>tal que (mayorCapicuaP n) es el mayor capic\u00faa que es el producto de dos n\u00fameros de n cifras. Por ejemplo,<\/p>\n<pre lang=\"text\"> \n   mayorCapicuaP 2  ==  9009\n   mayorCapicuaP 3  ==  906609\n   mayorCapicuaP 4  ==  99000099\n   mayorCapicuaP 5  ==  9966006699\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP1 :: Integer -> Integer\nmayorCapicuaP1 n = head (capicuasP n)\n\n-- (capicuasP n) es la lista de las capic\u00faas de 2*n cifras que\n-- pueden escribirse como productos de dos n\u00fameros de n cifras. Por\n-- ejemplo, Por ejemplo,\n--    ghci> capicuasP 2\n--    [9009,8448,8118,8008,7227,7007,6776,6336,6006,5775,5445,5335,\n--     5225,5115,5005,4884,4774,4664,4554,4224,4004,3773,3663,3003,\n--     2992,2772,2552,2442,2332,2112,2002,1881,1771,1551,1221,1001]\ncapicuasP n = [x | x <- capicuas n,\n                        not (null (productosDosNumerosCifras n x))]\n\n-- (capicuas n) es la lista de las capic\u00faas de 2*n cifras de mayor a\n-- menor. Por ejemplo, \n--    capicuas 1           ==  [99,88,77,66,55,44,33,22,11]\n--    take 7 (capicuas 2)  ==  [9999,9889,9779,9669,9559,9449,9339]\ncapicuas :: Integer -> [Integer]\ncapicuas n = [capicua x | x <- numerosCifras n]\n\n-- (numerosCifras n) es la lista de los n\u00fameros de n cifras de mayor a\n-- menor. Por ejemplo,\n--    numerosCifras 1           ==  [9,8,7,6,5,4,3,2,1]\n--    take 7 (numerosCifras 2)  ==  [99,98,97,96,95,94,93]\n--    take 7 (numerosCifras 3)  ==  [999,998,997,996,995,994,993]\nnumerosCifras :: Integer -> [Integer]\nnumerosCifras n = [a,a-1..b]\n  where a = 10^n-1\n        b = 10^(n-1) \n\n-- (capicua n) es la capic\u00faa formada a\u00f1adiendo el inverso de n a\n--  continuaci\u00f3n de n. Por ejemplo,\n--    capicua 93  ==  9339\ncapicua :: Integer -> Integer\ncapicua n = read (xs ++ (reverse xs))\n  where xs = show n\n\n-- (productosDosNumerosCifras n x) es la lista de los n\u00fameros y de n\n-- cifras tales que existe un z de n cifras y x es el producto de y por\n-- z. Por ejemplo, \n--    productosDosNumerosCifras 2 9009  ==  [99,91]\nproductosDosNumerosCifras n x = [y | y <- numeros,\n                                     mod x y == 0,\n                                     div x y `elem` numeros]\n  where numeros = numerosCifras n\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP2 :: Integer -> Integer\nmayorCapicuaP2 n = maximum [x*y | x <- [a,a-1..b],\n                                  y <- [a,a-1..b],\n                                  esCapicua (x*y)] \n  where a = 10^n-1\n        b = 10^(n-1)\n\n-- (esCapicua x) se verifica si x es capic\u00faa. Por ejemplo,\n--    esCapicua 353  ==  True\n--    esCapicua 357  ==  False\nesCapicua :: Integer -> Bool\nesCapicua n = xs == reverse xs\n  where xs = show n\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP3 :: Integer -> Integer\nmayorCapicuaP3 n = maximum [x*y | (x,y) <- pares a b, \n                                  esCapicua (x*y)] \n  where a = 10^n-1\n        b = 10^(n-1)\n\n-- (pares a b) es la lista de los pares de n\u00fameros entre a y b de forma\n-- que su suma es decreciente. Por ejemplo,\n--    pares 9 7  ==  [(9,9),(8,9),(8,8),(7,9),(7,8),(7,7)]\npares a b = [(x,z-x) | z <- [a1,a1-1..b1],\n                       x <- [a,a-1..b],\n                       x <= z-x, z-x <= a]\n  where a1 = 2*a\n        b1 = 2*b\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP4 :: Integer -> Integer\nmayorCapicuaP4 n = maximum [x | y <- [a..b],\n                                z <- [y..b],\n                                let x = y * z,\n                                let s = show x,\n                                s == reverse s]\n  where a = 10^(n-1)\n        b = 10^n-1\n     \n-- 5\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP5 :: Integer -> Integer\nmayorCapicuaP5 n = maximum [x*y | (x,y) <- pares2 b a, esCapicua (x*y)]\n  where a = 10^(n-1)\n        b = 10^n-1\n                       \n-- (pares2 a b) es la lista de los pares de n\u00fameros entre a y b de forma\n-- que su suma es decreciente. Por ejemplo,\n--    pares2 9 7  ==  [(9,9),(8,9),(8,8),(7,9),(7,8),(7,7)]\npares2 a b = [(x,y) | x <- [a,a-1..b], y <- [a,a-1..x]]\n\n-- 6\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP6 :: Integer -> Integer\nmayorCapicuaP6 n = maximum [x*y | x <- [a..b], \n                                  y <- [x..b] , \n                                  esCapicua (x*y)]\n  where a = 10^(n-1)\n        b = 10^n-1\n \n-- (cifras n) es la lista de las cifras de n en orden inverso. Por\n-- ejemplo,  \n--    cifras 325  == [5,2,3]\ncifras :: Integer -> [Integer]\ncifras n \n    | n < 10    = [n]\n    | otherwise = (ultima n) : (cifras (quitarUltima n))\n\n-- (ultima n) es la \u00faltima cifra de n. Por ejemplo,\n--    ultima 325  ==  5\nultima  :: Integer -> Integer\nultima n =  n - (n `div` 10)*10\n\n-- (quitarUltima n) es el n\u00famero obtenido al quitarle a n su \u00faltima\n-- cifra. Por ejemplo,\n--    quitarUltima 325  =>  32 \nquitarUltima :: Integer -> Integer\nquitarUltima n = (n - (ultima n)) `div` 10\n\n-- 7\u00aa soluci\u00f3n\n-- ===========\n\nmayorCapicuaP7 :: Integer -> Integer\nmayorCapicuaP7 n = head [x | x <- capicuas n, esFactorizable x n]\n\n-- (esFactorizable x n) se verifica si x se puede escribir como producto\n-- de dos n\u00fameros de n d\u00edgitos. Por ejemplo,\n--    esFactorizable 1219 2  ==  True\n--    esFactorizable 1217 2  ==  False\nesFactorizable x n = aux i x\n  where b = 10^n-1\n        i = floor (sqrt (fromIntegral x))\n        aux i x | i > b          = False\n                | x `mod` i == 0 = x `div` i < b \n                | otherwise      = aux (i+1) x\n\n-- ---------------------------------------------------------------------\n-- Comparaci\u00f3n de soluciones                                          --\n-- ---------------------------------------------------------------------\n\n-- El tiempo de c\u00e1lculo de (mayorCapicuaP n) para las 7 definiciones es\n--    +------+------+------+------+\n--    | Def. | 2    | 3    | 4    |\n--    |------+------+------+------|\n--    |    1 | 0.01 | 0.13 | 1.39 |\n--    |    2 | 0.03 | 2.07 |      |\n--    |    3 | 0.05 | 3.86 |      |\n--    |    4 | 0.01 | 0.89 |      |\n--    |    5 | 0.03 | 1.23 |      |\n--    |    6 | 0.02 | 1.03 |      |\n--    |    7 | 0.01 | 0.02 | 0.02 |\n--    +------+------+------+------+\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nMi coraz\u00f3n est\u00e1 donde ha nacido,<br \/>\nno a la vida, al amor, cerca del Duero.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Un capic\u00faa es un n\u00famero que es igual le\u00eddo de izquierda a derecha que de derecha a izquierda. Definir la funci\u00f3n mayorCapicuaP :: Integer -> Integer tal que (mayorCapicuaP n) es el mayor capic\u00faa que es el producto de dos n\u00fameros de n cifras. Por ejemplo, mayorCapicuaP 2 == 9009 mayorCapicuaP 3 == 906609 mayorCapicuaP&#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,30,26,71,15,89,181,141,95,32,33],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4957"}],"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=4957"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4957\/revisions"}],"predecessor-version":[{"id":4990,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4957\/revisions\/4990"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4957"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4957"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}