{"id":6004,"date":"2021-01-25T06:00:49","date_gmt":"2021-01-25T04:00:49","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=6004"},"modified":"2021-02-01T08:53:30","modified_gmt":"2021-02-01T06:53:30","slug":"potencias-de-dos-mas-cercanas","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/potencias-de-dos-mas-cercanas\/","title":{"rendered":"Potencias de dos m\u00e1s cercanas"},"content":{"rendered":"<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\">\n   potenciasDeDosMasCercanas :: [Integer] -> [Integer]\n<\/pre>\n<p>tal que (potenciasDeDosMasCercanas xs) es la lista  sustituyendo cada elemento de xs por su potencia de dos m\u00e1s cercana (en el caso de que haya dos equidistantes se elige la menor). Por ejemplo,<\/p>\n<pre lang=\"text\">\n   potenciasDeDosMasCercanas2 [6,7,8,9,2021]  ==  [4,8,8,8,2048]\n<\/pre>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\n-- 1\u00aa soluci\u00f3n\n-- ===========\n\npotenciasDeDosMasCercanas :: [Integer] -> [Integer]\npotenciasDeDosMasCercanas = map potenciaDeDosMasCercana\n\n-- (potenciaDeDosMasCercana n) es la potencia de dos m\u00e1s cercana (en el\n-- caso de que haya dos equidistantes se elige la menor). Por ejemplo,\n--    potenciaDeDosMasCercana 6  ==  4\n--    potenciaDeDosMasCercana 7  ==  8\n--    potenciaDeDosMasCercana 8  ==  8\n--    potenciaDeDosMasCercana 9  ==  8\npotenciaDeDosMasCercana :: Integer -> Integer\npotenciaDeDosMasCercana n\n  | dx <= dy  = x\n  | otherwise = y\n  where (x,y) = potenciasDeDosCercanas n\n        dx    = n - x\n        dy    = y - n\n\n-- (potenciasDeDosMasCercanas n) es par formado por las dos potencias de\n-- dos m\u00e1s cercana a n. Por ejemplo,\n--    potenciasDeDosCercanas 6  ==  (4,8)\n--    potenciasDeDosCercanas 7  ==  (4,8)\n--    potenciasDeDosCercanas 8  ==  (4,8)\n--    potenciasDeDosCercanas 9  ==  (8,16)\npotenciasDeDosCercanas :: Integer -> (Integer, Integer)\npotenciasDeDosCercanas n =\n  (x `div` 2, x)\n  where x = menorPotenciaDeDosMayorOIgual n\n\n-- (menorPotenciaDeDosMayorOIgual n) es la menor potencia de dos mayor o\n-- igual que n. Por ejemplo,\n--    menorPotenciaDeDosMayorOIgual 6  ==  8\n--    menorPotenciaDeDosMayorOIgual 8  ==  8\nmenorPotenciaDeDosMayorOIgual :: Integer -> Integer\nmenorPotenciaDeDosMayorOIgual n =\n  head [2^x | x <- [0..], 2^x >= n]\n\n-- 2\u00aa soluci\u00f3n\n-- ===========\n\npotenciasDeDosMasCercanas2 :: [Integer] -> [Integer]\npotenciasDeDosMasCercanas2 = map potenciaDeDosMasCercana2\n\npotenciaDeDosMasCercana2 :: Integer -> Integer\npotenciaDeDosMasCercana2 n =\n  snd (min (n-x,x) (y-n,y))\n  where (x,y) = potenciasDeDosCercanas2 n\n\npotenciasDeDosCercanas2 :: Integer -> (Integer, Integer)\npotenciasDeDosCercanas2 n = (x `div` 2, x)\n  where (x:_) = dropWhile (<n) potenciasDeDos\n\n-- potenciasDeDos es la lista de las potencias de dos. Por ejemplo,\n--    take 11 potenciasDeDos  ==  [1,2,4,8,16,32,64,128,256,512,1024]\npotenciasDeDos :: [Integer]\npotenciasDeDos = iterate (*2) 1\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n-- La comparaci\u00f3n es\n--    \u03bb> maximum (potenciasDeDosMasCercanas [10^5..10^6])\n--    1048576\n--    (18.28 secs, 20,835,181,624 bytes)\n--    \u03bb> maximum (potenciasDeDosMasCercanas2 [10^5..10^6])\n--    1048576\n--    (2.44 secs, 830,307,736 bytes)\n<\/pre>\n<h4>Nuevas soluciones<\/h4>\n<ul>\n<li>En los comentarios se pueden escribir nuevas soluciones.\n<li>El c\u00f3digo se debe escribir entre una l\u00ednea con &#60;pre lang=&quot;haskell&quot;&#62; y otra con &#60;\/pre&#62;\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Definir la funci\u00f3n potenciasDeDosMasCercanas :: [Integer] -> [Integer] tal que (potenciasDeDosMasCercanas xs) es la lista sustituyendo cada elemento de xs por su potencia de dos m\u00e1s cercana (en el caso de que haya dos equidistantes se elige la menor). Por ejemplo, potenciasDeDosMasCercanas2 [6,7,8,9,2021] == [4,8,8,8,2048] Soluciones &#8212; 1\u00aa soluci\u00f3n &#8212; =========== potenciasDeDosMasCercanas :: [Integer] ->&#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,5],"tags":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6004"}],"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=6004"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6004\/revisions"}],"predecessor-version":[{"id":6038,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/6004\/revisions\/6038"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=6004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=6004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=6004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}