{"id":6981,"date":"2022-04-29T08:37:33","date_gmt":"2022-04-29T06:37:33","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6981"},"modified":"2022-05-01T11:16:33","modified_gmt":"2022-05-01T09:16:33","slug":"numeros-con-todos-sus-digitos-primos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-con-todos-sus-digitos-primos\/","title":{"rendered":"N\u00fameros con todos sus d\u00edgitos primos"},"content":{"rendered":"<p>Definir la lista<\/p>\n<pre lang=\"text\">\n   numerosConDigitosPrimos :: [Integer]\n<\/pre>\n<p>cuyos elementos son los n\u00fameros con todos sus d\u00edgitos primos. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> take 22 numerosConDigitosPrimos\n   [2,3,5,7,22,23,25,27,32,33,35,37,52,53,55,57,72,73,75,77,222,223]\n   \u03bb> numerosConDigitosPrimos !! (10^7)\n   322732232572\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nmodule Numeros_con_digitos_primos where\n\nimport Test.QuickCheck (NonNegative (NonNegative), quickCheck)\nimport Data.Char (intToDigit)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nnumerosConDigitosPrimos1 :: [Integer]\nnumerosConDigitosPrimos1 = [n | n <- [2..], digitosPrimos n]\n\n-- (digitosPrimos n) se verifica si todos los d\u00edgitos de n son\n-- primos. Por ejemplo,\n--    digitosPrimos 352  ==  True\n--    digitosPrimos 362  ==  False\ndigitosPrimos :: Integer -> Bool\ndigitosPrimos n = subconjunto (digitos n) [2,3,5,7]\n\n-- (digitos n) es la lista de las digitos de n. Por ejemplo,\n--    digitos 325  ==  [3,2,5]\ndigitos :: Integer -> [Integer]\ndigitos n = [read [x] | x <- show n]\n\n-- (subconjunto xs ys) se verifica si xs es un subconjunto de ys. Por\n-- ejemplo,\n--    subconjunto [3,2,5,2] [2,7,3,5]  ==  True\n--    subconjunto [3,2,5,2] [2,7,2,5]  ==  False\nsubconjunto :: Eq a => [a] -> [a] -> Bool\nsubconjunto xs ys = and [x `elem` ys | x <- xs]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nnumerosConDigitosPrimos2 :: [Integer]\nnumerosConDigitosPrimos2 =\n  filter (all (`elem` \"2357\") . show) [2..]\n\n-- 3\u00aa soluci\u00f3n\n-- ===========\n\n--    \u03bb> take 60 numerosConDigitosPrimos2\n--    [  2,  3,  5,  7,\n--      22, 23, 25, 27,\n--      32, 33, 35, 37,\n--      52, 53, 55, 57,\n--      72, 73, 75, 77,\n--     222,223,225,227,\n--     232,233,235,237,\n--     252,253,255,257,\n--     272,273,275,277,\n--     322,323,325,327,\n--     332,333,335,337,\n--     352,353,355,357,\n--     372,373,375,377,\n--     522,523,525,527,\n--     532,533,535,537]\n\nnumerosConDigitosPrimos3 :: [Integer]\nnumerosConDigitosPrimos3 =\n  [2,3,5,7] ++ [10*n+d | n <- numerosConDigitosPrimos3, d <- [2,3,5,7]]\n\n-- 4\u00aa soluci\u00f3n\n-- ===========\n\n--    \u03bb> take 60 numerosConDigitosPrimos2\n--    [ 2, 3, 5, 7,\n--     22,23,25,27,\n--     32,33,35,37,\n--     52,53,55,57,\n--     72,73,75,77,\n--     222,223,225,227, 232,233,235,237, 252,253,255,257, 272,273,275,277,\n--     322,323,325,327, 332,333,335,337, 352,353,355,357, 372,373,375,377,\n--     522,523,525,527, 532,533,535,537]\n\nnumerosConDigitosPrimos4 :: [Integer]\nnumerosConDigitosPrimos4 = concat (iterate siguiente [2,3,5,7])\n\n-- (siguiente xs) es la lista obtenida a\u00f1adiendo delante de cada\n-- elemento de xs los d\u00edgitos 2, 3, 5 y 7. Por ejemplo,\n--    \u03bb> siguiente [5,6,8]\n--    [25,26,28,\n--     35,36,38,\n--     55,56,58,\n--     75,76,78]\nsiguiente :: [Integer] -> [Integer]\nsiguiente xs = concat [map (pega d) xs | d <- [2,3,5,7]]\n\n-- (pega d n) es el n\u00famero obtenido a\u00f1adiendo el d\u00edgito d delante del\n-- n\u00famero n. Por ejemplo,\n--    pega 3 35  ==  335\npega :: Int -> Integer -> Integer\npega d n = read (intToDigit d : show n)\n\n-- Comprobaci\u00f3n de equivalencia\n-- ============================\n\n-- La propiedad es\nprop_numerosConDigitosPrimos :: NonNegative Int -> Bool\nprop_numerosConDigitosPrimos (NonNegative n) =\n  all (== numerosConDigitosPrimos1 !! n)\n      [ numerosConDigitosPrimos2 !! n\n      , numerosConDigitosPrimos3 !! n\n      , numerosConDigitosPrimos4 !! n\n      ]\n\n-- La comprobaci\u00f3n es\n--    \u03bb> quickCheck prop_numerosConDigitosPrimos\n--    +++ OK, passed 100 tests.\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> numerosConDigitosPrimos1 !! 5000\n--    752732\n--    (2.45 secs, 6,066,926,272 bytes)\n--    \u03bb> numerosConDigitosPrimos2 !! 5000\n--    752732\n--    (0.34 secs, 387,603,456 bytes)\n--    \u03bb> numerosConDigitosPrimos3 !! 5000\n--    752732\n--    (0.01 secs, 1,437,624 bytes)\n--    \u03bb> numerosConDigitosPrimos4 !! 5000\n--    752732\n--    (0.00 secs, 1,556,104 bytes)\n--\n--    \u03bb> numerosConDigitosPrimos3 !! (10^7)\n--    322732232572\n--    (3.94 secs, 1,820,533,328 bytes)\n--    \u03bb> numerosConDigitosPrimos4 !! (10^7)\n--    322732232572\n--    (1.84 secs, 2,000,606,640 bytes)\n<\/pre>\n<p>El c\u00f3digo se encuentra en <a href=\"https:\/\/github.com\/jaalonso\/Exercitium\/blob\/main\/src\/Numeros_con_digitos_primos.hs\">GitHub<\/a>.<\/p>\n<p>La elaboraci\u00f3n de las soluciones se describe en el siguiente v\u00eddeo<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/OEAD7fLZiSk\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Definir la lista numerosConDigitosPrimos :: [Integer] cuyos elementos son los n\u00fameros con todos sus d\u00edgitos primos. Por ejemplo, \u03bb> take 22 numerosConDigitosPrimos [2,3,5,7,22,23,25,27,32,33,35,37,52,53,55,57,72,73,75,77,222,223] \u03bb> numerosConDigitosPrimos !! (10^7) 322732232572 Soluciones module Numeros_con_digitos_primos where import Test.QuickCheck (NonNegative (NonNegative), quickCheck) import Data.Char (intToDigit) &#8212; 1\u00aa soluci\u00f3n &#8212; =========== numerosConDigitosPrimos1 :: [Integer] numerosConDigitosPrimos1 = [n | n Bool digitosPrimos&#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":[41,100,8,12,504,26,38,348,50,10,11,95,33,521,146],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6981"}],"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=6981"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6981\/revisions"}],"predecessor-version":[{"id":6993,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6981\/revisions\/6993"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}