{"id":1197,"date":"2011-02-10T07:00:33","date_gmt":"2011-02-10T07:00:33","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1197"},"modified":"2013-03-08T05:50:03","modified_gmt":"2013-03-08T05:50:03","slug":"el-proximo-despues-de-1811-con-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/el-proximo-despues-de-1811-con-haskell\/","title":{"rendered":"&#8220;El pr\u00f3ximo despu\u00e9s de 1811&#8221; con Haskell"},"content":{"rendered":"<p>El enunciado del <a href=\"http:\/\/simplementenumeros.blogspot.com\/2011\/02\/610-el-proximo-despues-de-1811.html\">problema de hoy<\/a> de <a href=\"http:\/\/simplementenumeros.blogspot.com\">N\u00fameros y algo m\u00e1s &#8230;<\/a> es el siguiente<\/p>\n<blockquote><p>\n1811 fue el \u00faltimo a\u00f1o que no teniendo ceros en su composici\u00f3n, tanto su suma digital como su producto digital est\u00e1n incluidos como cadenas dentro del n\u00famero <\/p>\n<p>Suma digital (1811)     = 1+8+1+1 = 11<br \/>\nProducto d\u00edgital (1811) = 1x8x1x1 =  8 <\/p>\n<p>\u00bfCu\u00e1l es pr\u00f3ximo a\u00f1o sin ceros en que esto ocurrir\u00e1?\n<\/p><\/blockquote>\n<p>A partir del problema he escrito la siguinte relaci\u00f3n de ejercicios para la asignatura de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-10\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a>.<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas auxiliares                                --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Data.Char\r\nimport Data.List\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n\r\n--    cifras :: Int -> [Int]\r\n-- tal que (cifras x) es la lista de las cifras de x. Por ejemplo,\r\n--    cifras 1811  ==  [1,8,1,1]\r\n-- ---------------------------------------------------------------------\r\n\r\ncifras :: Int -> [Int]\r\ncifras x = [digitToInt y | y <- show x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n\r\n--    sumaDigital :: Int -> Int\r\n-- tal que (sumaDigital x) es la suma de las cifras de x. Por ejemplo,\r\n--    sumaDigital 1811  ==  11\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaDigital :: Int -> Int\r\nsumaDigital = sum . cifras\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n\r\n--    productoDigital :: Int -> Int\r\n-- tal que (sumaDigital x) es la suma de las cifras de x. Por ejemplo,\r\n--    productoDigital 1811  ==  8\r\n-- ---------------------------------------------------------------------\r\n\r\nproductoDigital :: Int -> Int\r\nproductoDigital = product . cifras\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n\r\n--    esSubcadena :: Eq a => [a] -> [a] -> Bool\r\n-- tal que (esSubcadena xs ys) se verifica si xs es subcadena de xs. Por\r\n-- ejemplo, \r\n--    esSubcadena \"11\" \"18113\"  ==  True\r\n--    esSubcadena \"83\" \"18113\"  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\n-- Una definici\u00f3n, usando inits y tails, es\r\nesSubcadena1 :: Eq a => [a] -> [a] -> Bool\r\nesSubcadena1 xs ys = or [elem xs (inits zs) | zs <- tails ys]\r\n\r\n-- Otra definici\u00f3n, usando isPrefixOf, es\r\nesSubcadena2 :: Eq a => [a] -> [a] -> Bool\r\nesSubcadena2 xs ys = or [isPrefixOf xs zs | zs <- tails ys]\r\n\r\n-- Otra definici\u00f3n, usando isInfixOf, es\r\nesSubcadena3 :: Eq a => [a] -> [a] -> Bool\r\nesSubcadena3 = isInfixOf\r\n\r\n-- En lo sucesivo, usaremos la tercera definici\u00f3n\r\nesSubcadena :: Eq a => [a] -> [a] -> Bool\r\nesSubcadena = esSubcadena3\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la constante\r\n--    numerosEspeciales :: [Int]\r\n-- tal que numerosEspeciales es la lista de los n\u00fameros que no teniendo\r\n-- ceros en su composici\u00f3n, tanto su suma digital como su producto\r\n-- digital est\u00e1n incluidos como cadenas dentro del n\u00famero. Por ejemplo,\r\n--    take 10 numerosEspeciales  ==  [1,2,3,4,5,6,7,8,9,119]\r\n-- ---------------------------------------------------------------------\r\n\r\nnumerosEspeciales :: [Int]\r\nnumerosEspeciales = \r\n    [x | x <- [1..],\r\n         let cifras' = cifras x,\r\n         notElem 0 cifras',\r\n         esSubcadena (cifras (sumaDigital x)) cifras',\r\n         esSubcadena (cifras (productoDigital x)) cifras']\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir, usando numerosEspeciales, la funci\u00f3n\r\n--    siguienteNumeroEspecial :: Int -> Int\r\n-- tal que (siguienteNumeroEspecial x) es el menor n\u00famero especial mayor\r\n-- que x. Por ejemplo,\r\n--    siguienteNumeroEspecial 9  ==  119\r\n-- ---------------------------------------------------------------------\r\n\r\nsiguienteNumeroEspecial :: Int -> Int\r\nsiguienteNumeroEspecial x =\r\n    head (dropWhile (<=x) numerosEspeciales)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Calcular el pr\u00f3ximo a\u00f1o a\u00f1o que no teniendo ceros en su\r\n-- composici\u00f3n, tanto su suma digital como su producto digital est\u00e1n\r\n-- incluidos como cadenas dentro del n\u00famero.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> siguienteNumeroEspecial 2011\r\n--    3612\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El enunciado del problema de hoy de N\u00fameros y algo m\u00e1s &#8230; es el siguiente 1811 fue el \u00faltimo a\u00f1o que no teniendo ceros en su composici\u00f3n, tanto su suma digital como su producto digital est\u00e1n incluidos como cadenas dentro del n\u00famero Suma digital (1811) = 1+8+1+1 = 11 Producto d\u00edgital (1811) = 1x8x1x1 =&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","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":[108,270],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1197"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=1197"}],"version-history":[{"count":4,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1197\/revisions"}],"predecessor-version":[{"id":2934,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1197\/revisions\/2934"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}