{"id":7104,"date":"2022-06-29T06:00:31","date_gmt":"2022-06-29T04:00:31","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=7104"},"modified":"2022-06-21T18:04:22","modified_gmt":"2022-06-21T16:04:22","slug":"pandigitales-primos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/pandigitales-primos\/","title":{"rendered":"Pandigitales primos"},"content":{"rendered":"<p>Un n\u00famero con n d\u00edgitos es pandigital si contiene todos los d\u00edgitos del 1 a n exactamente una vez. Por ejemplo, 2143 es un pandigital con 4 d\u00edgitos y, adem\u00e1s, es primo.<\/p>\n<p>Definir la lista<\/p>\n<pre lang=\"text\">\n   pandigitalesPrimos :: [Int]\n<\/pre>\n<p>tal que sus elementos son los n\u00fameros pandigitales primos, ordenados de mayor a menor. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   take 3 pandigitalesPrimos       ==  [7652413,7642513,7641253]\n   2143 `elem` pandigitalesPrimos  ==  True\n   length pandigitalesPrimos       ==  538\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (permutations, sort)\nimport Data.Char (intToDigit)\nimport Data.Numbers.Primes (isPrime)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\npandigitalesPrimos1 :: [Int]\npandigitalesPrimos1 =\n  concatMap nPandigitalesPrimos1 [9,8..1]\n\n-- (nPandigitalesPrimos n) es la lista de los n\u00fameros pandigitales con n\n-- d\u00edgitos, ordenada de mayor a menor. Por ejemplo,\n--    nPandigitalesPrimos 4  ==  [4231,2341,2143,1423]\n--    nPandigitalesPrimos 5  ==  []\nnPandigitalesPrimos1 :: Int -> [Int]\nnPandigitalesPrimos1 n = filter isPrime (pandigitales n)\n\n-- (pandigitales n) es la lista de los n\u00fameros pandigitales de n d\u00edgitos\n-- ordenada de mayor a menor. Por ejemplo,\n--    pandigitales 3  ==  [321,312,231,213,132,123]\npandigitales :: Int -> [Int]\npandigitales n = \n    reverse $ sort $ map digitosAentero (permutations [1..n])\n\n-- (digitosAentero ns) es el n\u00famero cuyos d\u00edgitos son ns. Por ejemplo,\n--    digitosAentero [3,2,5]  ==  325\ndigitosAentero :: [Int] -> Int\ndigitosAentero = read . map intToDigit\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\npandigitalesPrimos2 :: [Int]\npandigitalesPrimos2 =\n  concatMap nPandigitalesPrimos2 [9,8..1]\n\n-- Nota. La definici\u00f3n de nPandigitalesPrimos1 se puede simplificar, ya\n-- que la suma de los n\u00fameros de 1 a n es divisible por 3, entonces los\n-- n\u00fameros  pandigitales con n d\u00edgitos tambi\u00e9n lo son y, por tanto, no\n-- son primos. \nnPandigitalesPrimos2 :: Int -> [Int]\nnPandigitalesPrimos2 n \n  | sum [1..n] `mod` 3 == 0 = []\n  | otherwise               = filter isPrime (pandigitales n)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\npandigitalesPrimos3 :: [Int]\npandigitalesPrimos3 =\n  concatMap nPandigitalesPrimos3 [9,8..1]\n\n-- La definici\u00f3n de nPandigitales se puede simplificar, ya que\n--    \u03bb> [n | n <- [1..9], sum [1..n] `mod` 3 \/= 0]\n--    [1,4,7]\nnPandigitalesPrimos3 :: Int -> [Int]\nnPandigitalesPrimos3 n \n  | n `elem` [4,7] = filter isPrime (pandigitales n)\n  | otherwise      = []\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_pandigitalesPrimos :: Bool\nprop_pandigitalesPrimos =\n  all (== pandigitalesPrimos1)\n      [pandigitalesPrimos2,\n       pandigitalesPrimos3]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> prop_pandigitalesPrimos\n--    True\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> length (pandigitalesPrimos1)\n--    538\n--    (1.44 secs, 5,249,850,032 bytes)\n--    \u03bb> length (pandigitalesPrimos2)\n--    538\n--    (0.14 secs, 619,249,632 bytes)\n--    \u03bb> length (pandigitalesPrimos3)\n--    538\n--    (0.14 secs, 619,237,464 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Pandigitales_primos.hs\">GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero con n d\u00edgitos es pandigital si contiene todos los d\u00edgitos del 1 a n exactamente una vez. Por ejemplo, 2143 es un pandigital con 4 d\u00edgitos y, adem\u00e1s, es primo. Definir la lista pandigitalesPrimos :: [Int] tal que sus elementos son los n\u00fameros pandigitales primos, ordenados de mayor a menor. Por ejemplo, take&#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":[521],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7104"}],"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=7104"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7104\/revisions"}],"predecessor-version":[{"id":7105,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/7104\/revisions\/7105"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=7104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=7104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=7104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}