{"id":3606,"date":"2018-01-12T06:00:29","date_gmt":"2018-01-12T04:00:29","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=3606"},"modified":"2021-04-25T16:11:03","modified_gmt":"2021-04-25T14:11:03","slug":"numeros-malvados-y-odiosos","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/numeros-malvados-y-odiosos\/","title":{"rendered":"N\u00fameros malvados y odiosos"},"content":{"rendered":"<p>Un n\u00famero malvado es un n\u00famero natural cuya expresi\u00f3n en base 2 (binaria) contiene un n\u00famero par de unos.<\/p>\n<p>Un n\u00famero odioso es un n\u00famero natural cuya expresi\u00f3n en base 2 (binaria) contiene un n\u00famero impar de unos.<\/p>\n<p>Podemos representar los n\u00fameros malvados y odiosos mediante el siguiente tipo de dato<\/p>\n<pre lang=\"text\">\n  data MalvadoOdioso = Malvado | Odioso deriving Show\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n  malvadoOdioso :: Integer -> MalvadoOdioso\n<\/pre>\n<p>tal que (malvadoOdioso n) devuelve el tipo de n\u00famero que es n. Por ejemplo,<\/p>\n<pre lang=\"text\">\n   \u03bb> malvadoOdioso 11\n   Odioso\n   \u03bb> malvadoOdioso 12\n   Malvado\n   \u03bb> malvadoOdioso3 (10^20000000)\n   Odioso\n   \u03bb> malvadoOdioso3 (1+10^20000000)\n   Malvado\n<\/pre>\n<p><strong>Nota<\/strong>: Este ejercicio ha sido propuesto por \u00c1ngel Ruiz Campos.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List (genericLength)\nimport Data.Bits (popCount)\n\ndata MalvadoOdioso = Malvado | Odioso\n  deriving (Eq, Show)\n\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\nmalvadoOdioso :: Integer -> MalvadoOdioso\nmalvadoOdioso n | (even . numeroUnosBin) n = Malvado\n                | otherwise                = Odioso\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 = genericLength . filter (\/= 0) . intBin\n\n-- (intBin n) es el n\u00famero binario correspondiente al n\u00famero decimal n.\n-- Por ejemplo, \n--   intBin 11  ==  [1,1,0,1]\n--   intBin 12  ==  [0,0,1,1]\nintBin :: Integer -> [Integer]\nintBin n | n < 2     = [n]\n         | otherwise = n `mod` 2 : intBin (n `div` 2)\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\nmalvadoOdioso2 :: Integer -> MalvadoOdioso\nmalvadoOdioso2 n | (even . numeroIntBin) n = Malvado\n                 | otherwise               = Odioso\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 soluci\u00f3n\n-- ===========\n\nmalvadoOdioso3 :: Integer -> MalvadoOdioso\nmalvadoOdioso3 n | (even . popCount) n = Malvado\n                 | otherwise           = Odioso\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--   \u03bb> malvadoOdioso (10^40000)\n--   Odioso\n--   (3.25 secs, 1,167,416,968 bytes)\n--   \u03bb> malvadoOdioso2 (10^40000)\n--   Odioso\n--   (4.03 secs, 1,164,863,744 bytes)\n--   \u03bb> malvadoOdioso3 (10^40000)\n--   Odioso\n--   (0.00 secs, 165,312 bytes)\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Un n\u00famero malvado es un n\u00famero natural cuya expresi\u00f3n en base 2 (binaria) contiene un n\u00famero par de unos. Un n\u00famero odioso es un n\u00famero natural cuya expresi\u00f3n en base 2 (binaria) contiene un n\u00famero impar de unos. Podemos representar los n\u00fameros malvados y odiosos mediante el siguiente tipo de dato data MalvadoOdioso = Malvado&#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":[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\/3606"}],"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=3606"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3606\/revisions"}],"predecessor-version":[{"id":3779,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/3606\/revisions\/3779"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=3606"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=3606"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=3606"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}