{"id":4494,"date":"2019-01-02T06:00:31","date_gmt":"2019-01-02T04:00:31","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4494"},"modified":"2019-01-09T08:11:48","modified_gmt":"2019-01-09T06:11:48","slug":"el-2019-es-malvado","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/el-2019-es-malvado\/","title":{"rendered":"El 2019 es malvado"},"content":{"rendered":"<p>Un n\u00famero malvado es un n\u00famero natural cuya expresi\u00f3n en base 2 contiene un n\u00famero par de unos. Por ejemplo, 6 es malvado porque su expresi\u00f3n en base 2 es 110 que tiene dos unos.<\/p>\n<p>Definir las funciones<\/p>\n<pre lang=\"text\">\n   esMalvado       :: Integer -> Bool\n   malvados        :: [Integer]\n   posicionMalvada :: Integer -> Maybe Int\n<\/pre>\n<p>tales que<\/p>\n<ul>\n<li>(esMalvado n) se verifica si n es un n\u00famero malvado. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     esMalvado 6              ==  True\n     esMalvado 7              ==  False\n     esMalvado 2019           ==  True\n     esMalvado (10^70000)     ==  True\n     esMalvado (10^(3*10^7))  ==  True\n<\/pre>\n<ul>\n<li>malvados es la sucesi\u00f3n de los n\u00fameros malvados. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     \u03bb> take 20 malvados\n     [0,3,5,6,9,10,12,15,17,18,20,23,24,27,29,30,33,34,36,39]\n     malvados !! 1009    ==  2019\n     malvados !! 10      ==  20\n     malvados !! (10^2)  ==  201\n     malvados !! (10^3)  ==  2000\n     malvados !! (10^4)  ==  20001\n     malvados !! (10^5)  ==  200000\n     malvados !! (10^6)  ==  2000001\n<\/pre>\n<ul>\n<li>(posicionMalvada n) es justo la posici\u00f3n de n en la sucesi\u00f3n de n\u00fameros malvados, si n es malvado o Nothing, en caso contrario. Por ejemplo,<\/li>\n<\/ul>\n<pre lang=\"text\">\n     posicionMalvada 6        ==  Just 3\n     posicionMalvada 2019     ==  Just 1009\n     posicionMalvada 2018     ==  Nothing\n     posicionMalvada 2000001  ==  Just 1000000\n     posicionMalvada (10^7)   ==  Just 5000000\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericLength, elemIndex)\nimport Data.Bits (popCount)\n\n-- 1\u00aa definici\u00f3n de esMalvado\n-- ==========================\n\nesMalvado :: Integer -> Bool\nesMalvado n = even (numeroUnosBin n)\n\n-- Sin argumentos\nesMalvado' :: Integer -> Bool\nesMalvado' = even . numeroUnosBin\n\n-- (numeroUnosBin n) es el n\u00famero de unos de la representaci\u00f3n binaria\n-- del n\u00famero decimal n. Por ejemplo,\n--   numeroUnosBin 11  ==  3\n--   numeroUnosBin 12  ==  2\nnumeroUnosBin :: Integer -> Integer\nnumeroUnosBin n  = genericLength (filter (== 1) (binario n))\n\n-- Sin argumentos\nnumeroUnosBin' :: Integer -> Integer\nnumeroUnosBin' = genericLength . filter (== 1) . binario\n\n-- (binario n) es el n\u00famero binario correspondiente al n\u00famero decimal n.\n-- Por ejemplo, \n--   binario 11  ==  [1,1,0,1]\n--   binario 12  ==  [0,0,1,1]\nbinario :: Integer -> [Integer]\nbinario n | n < 2     = [n]\n          | otherwise = n `mod` 2 : binario (n `div` 2)\n\n-- 2\u00aa definici\u00f3n de esMalvado\n-- ==========================\n\nesMalvado2 :: Integer -> Bool\nesMalvado2 n = even (numeroUnosBin n)\n\n-- (numeroIntBin n) es el n\u00famero de unos que contiene la representaci\u00f3n\n-- binaria del n\u00famero decimal n. Por ejemplo,\n--   numeroIntBin 11  ==  3\n--   numeroIntBin 12  ==  2\nnumeroIntBin :: Integer -> Integer\nnumeroIntBin n | n < 2     = n\n               | otherwise = n `mod` 2 + numeroIntBin (n `div` 2)\n\n-- 3\u00aa definici\u00f3n de esMalvado\n-- ==========================\n\nesMalvado3 :: Integer -> Bool\nesMalvado3 n = even (popCount n)\n\n-- Sin argumentos\nesMalvado3' :: Integer -> Bool\nesMalvado3' = even . popCount \n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> esMalvado (10^30000)\n--    True\n--    (1.79 secs, 664,627,936 bytes)\n--    \u03bb> esMalvado2 (10^30000)\n--    True\n--    (1.79 secs, 664,626,992 bytes)\n--    \u03bb> esMalvado3 (10^30000)\n--    True\n--    (0.03 secs, 141,432 bytes)\n--    \n--    \u03bb> esMalvado (10^40000)\n--    False\n--    (2.95 secs, 1,162,091,464 bytes)\n--    \u03bb> esMalvado2 (10^40000)\n--    False\n--    (2.96 secs, 1,162,091,096 bytes)\n--    \u03bb> esMalvado3 (10^40000)\n--    False\n--    (0.04 secs, 155,248 bytes)\n\n-- 1\u00aa definici\u00f3n de malvados\n-- =========================\n\nmalvados :: [Integer]\nmalvados = [n | n <- [0..], esMalvado3 n]\n\n-- 2\u00aa definici\u00f3n de malvados\n-- =========================\n\nmalvados2 :: [Integer]\nmalvados2 = filter esMalvado3 [0..]\n\n-- 1\u00aa definici\u00f3n de posicionMalvada\n-- ================================\n\nposicionMalvada :: Integer -> Maybe Int\nposicionMalvada n\n  | y == n    = Just (length xs)\n  | otherwise = Nothing\n  where (xs,(y:_)) = span (<n) malvados\n\n-- 2\u00aa definici\u00f3n de posicionMalvada\nposicionMalvada2 :: Integer -> Maybe Int\nposicionMalvada2 n\n  | esMalvado n = elemIndex n malvados\n  | otherwise        = Nothing\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\n&#8230; Yo os ense\u00f1o, o pretendo ense\u00f1aros a que dud\u00e9is de todo: de lo<br \/>\nhumano y de lo divino, sin excluir vuestra propia existencia. <\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero malvado es un n\u00famero natural cuya expresi\u00f3n en base 2 contiene un n\u00famero par de unos. Por ejemplo, 6 es malvado porque su expresi\u00f3n en base 2 es 110 que tiene dos unos. Definir las funciones esMalvado :: Integer -> Bool malvados :: [Integer] posicionMalvada :: Integer -> Maybe Int tales que (esMalvado&#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":[5],"tags":[8,30,91,38,258,89,11,432,6],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4494"}],"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=4494"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4494\/revisions"}],"predecessor-version":[{"id":4529,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4494\/revisions\/4529"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4494"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}