{"id":4546,"date":"2019-01-17T06:00:40","date_gmt":"2019-01-17T04:00:40","guid":{"rendered":"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/?p=4546"},"modified":"2019-01-24T08:01:40","modified_gmt":"2019-01-24T06:01:40","slug":"posiciones-del-2019-en-el-numero-pi","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/posiciones-del-2019-en-el-numero-pi\/","title":{"rendered":"Posiciones del 2019 en el n\u00famero pi"},"content":{"rendered":"<p>El fichero <a href=\"http:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-content\/uploads\/2019\/01\/Digitos_de_pi.txt\">Digitos_de_pi.txt<\/a> contiene el n\u00famero pi con un mill\u00f3n de decimales; es decir,<\/p>\n<pre lang=\"text\"> \n   3.1415926535897932384626433832 ... 83996346460422090106105779458151\n<\/pre>\n<p>Definir la funci\u00f3n<\/p>\n<pre lang=\"text\"> \n   posiciones :: String -> Int -> IO [Int]\n<\/pre>\n<p>tal que (posicion cs k) es es la lista de las posiciones iniciales de cs en la sucesi\u00f3n formada por los k primeros d\u00edgitos decimales del n\u00famero pi. Por ejemplo,<\/p>\n<pre lang=\"text\">  \n   \u03bb> posiciones \"141\" 1000\n   [0,294]\n   \u03bb> posiciones \"4159\" 10000\n   [1,5797,6955,9599]\n<\/pre>\n<p>Calcular la primera posici\u00f3n de 2019 en los decimales de pi  y el n\u00famero de veces que aparece 2019 en en el primer mill\u00f3n de decimales de pi.<\/p>\n<h4>Soluciones<\/h4>\n<pre lang=\"haskell\">\nimport Data.List ( isPrefixOf\n                 , findIndices\n                 , tails  \n                 )\n\n-- 1\u00aa definici\u00f3n\n-- =============\n\nposiciones :: String -> Int -> IO [Int]\nposiciones cs k = do\n  ds <- readFile \"Digitos_de_pi.txt\"\n  return (posicionesEnLista cs (take (k-1) (drop 2 ds)))\n\n--    posicionesEnLista \"23\" \"234235523\"  ==  [0,3,7]\nposicionesEnLista :: Eq a => [a] -> [a] -> [Int]\nposicionesEnLista xs ys = reverse (aux ys 0 [])\n  where aux []      _ ns = ns\n        aux (y:ys') n ns | xs `isPrefixOf` (y:ys') = aux ys' (n+1) (n:ns)\n                         | otherwise               = aux ys' (n+1) ns\n\n-- 2\u00aa definici\u00f3n\n-- =============\n\nposiciones2 :: String -> Int -> IO [Int]\nposiciones2 cs k = do\n  ds <- readFile \"Digitos_de_pi.txt\"\n  return (findIndices (cs `isPrefixOf`) (tails (take (k-1) (drop 2 ds))))\n\n-- Comparaci\u00f3n de eficiencia\n-- =========================\n\n--    \u03bb> length <$> posiciones \"2019\" (10^6)\n--    112\n--    (1.73 secs, 352,481,272 bytes)\n--    \u03bb> length <$> posiciones2 \"2019\" (10^6)\n--    112\n--    (0.16 secs, 144,476,384 bytes)\n\n-- El c\u00e1lculo es\n--    \u03bb> ps <- posiciones \"2019\" (10^6)\n--    \u03bb> head ps\n--    243\n--    \u03bb> length ps\n--    112\n-- Por tanto, la posici\u00f3n de la primera ocurrencia es 243 y hay 112\n-- ocurrencias. Otra forma de hacer los c\u00e1lculos anteriores es\n--    \u03bb> head <$> posiciones \"2019\" (10^6)\n--    243\n--    \u03bb> length <$> posiciones \"2019\" (10^6)\n--    112\n<\/pre>\n<h4>Pensamiento<\/h4>\n<blockquote><p>\nAprendi\u00f3 tantas cosas, que no tuvo tiempo para pensar en ninguna de ellas.<\/p>\n<p>Antonio Machado\n<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>El fichero Digitos_de_pi.txt contiene el n\u00famero pi con un mill\u00f3n de decimales; es decir, 3.1415926535897932384626433832 &#8230; 83996346460422090106105779458151 Definir la funci\u00f3n posiciones :: String -> Int -> IO [Int] tal que (posicion cs k) es es la lista de las posiciones iniciales de cs en la sucesi\u00f3n formada por los k primeros d\u00edgitos decimales del n\u00famero&#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":[7],"tags":[46,369,436,170,370,6,371,75],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4546"}],"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=4546"}],"version-history":[{"count":6,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4546\/revisions"}],"predecessor-version":[{"id":4633,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/posts\/4546\/revisions\/4633"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/media?parent=4546"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/categories?post=4546"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/exercitium\/wp-json\/wp\/v2\/tags?post=4546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}