{"id":1880,"date":"2012-02-15T16:20:55","date_gmt":"2012-02-15T16:20:55","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=1880"},"modified":"2013-03-08T05:48:55","modified_gmt":"2013-03-08T05:48:55","slug":"i1m2011-ejercicios-de-examenes-del-curso-2010-11","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2011-ejercicios-de-examenes-del-curso-2010-11\/","title":{"rendered":"I1M2011: Ejercicios de ex\u00e1menes del curso 2010-11"},"content":{"rendered":"<p>En primera parte de la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-11\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se han explicado las soluciones de los ejercicios de la  <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2011G1\/images\/0\/0a\/Rel_16.hs\">16\u00aa relaci\u00f3n<\/a> sobre ejercicios de ex\u00e1menes del curso 2010-11 correspondientes a los 9 primeros temas del curso.   <\/p>\n<p>Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<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.List\r\nimport Test.QuickCheck\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir por recursi\u00f3n la funci\u00f3n \r\n--    sumaR :: Num b => (a -> b) -> [a] -> b\r\n-- tal que (suma f xs) es la suma de los valores obtenido aplicando la\r\n-- funci\u00f3n f a lo elementos de la lista xs. Por ejemplo,\r\n--    sumaR (*2)  [3,5,10]  ==  36\r\n--    sumaR (\/10) [3,5,10]  ==  1.8\r\n -- ---------------------------------------------------------------------\r\n\r\nsumaR :: Num b => (a -> b) -> [a] -> b\r\nsumaR f []     = 0\r\nsumaR f (x:xs) = f x + sumaR f xs \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir por plegado la funci\u00f3n \r\n--    sumaP :: Num b => (a -> b) -> [a] -> b\r\n-- tal que (suma f xs) es la suma de los valores obtenido aplicando la\r\n-- funci\u00f3n f a lo elementos de la lista xs. Por ejemplo,\r\n--    sumaP (*2)  [3,5,10]  ==  36\r\n--    sumaP (\/10) [3,5,10]  ==  1.8\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaP :: Num b => (a -> b) -> [a] -> b\r\nsumaP f = foldr (\\x y -> (f x) + y) 0\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. El enunciado del problema 1 de la Olimpiada\r\n-- Iberoamericana de Matem\u00e1tica Universitaria del 2006 es el siguiente:\r\n--    Sean m y n n\u00fameros enteros mayores que 1. Se definen los conjuntos \r\n--    P(m) = {1\/m, 2\/m,..., (m-1)\/m} y P(n) = {1\/n, 2\/n,..., (n-1)\/n}.\r\n--    Encontrar la distancia entre P(m) y P(n), que se define como\r\n--    m\u00edn {|a - b| : a en P(m), b en P(n)}.\r\n-- Definir la funci\u00f3n  \r\n--    distancia :: Float -> Float -> Float\r\n-- tal que (distancia m n) es la distancia entre P(m) y P(n). Por\r\n-- ejemplo, \r\n--    distancia 2 7 == 7.142857e-2\r\n--    distancia 2 8 == 0.0\r\n-- ---------------------------------------------------------------------\r\n\r\ndistancia :: Float -> Float -> Float\r\ndistancia m n = \r\n    minimum [abs (i\/m - j\/n) | i <- [1..m-1], j <- [1..n-1]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. El enunciado del problema 580 de \"N\u00fameros y\r\n-- algo m\u00e1s..\" es el siguiente: \r\n--    \u00bfCu\u00e1l es el menor n\u00famero que puede expresarse como la suma de 9,\r\n--    10 y 11 n\u00fameros consecutivos?  \r\n-- (El problema se encuentra en http:\/\/goo.gl\/1K3t7 )\r\n-- A lo largo de los distintos apartados de este ejercicio se resolver\u00e1\r\n-- el problema.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.1. Definir la funci\u00f3n\r\n--    consecutivosConSuma :: Int -> Int -> [[Int]]\r\n-- tal que (consecutivosConSuma x n) es la lista de listas de n n\u00fameros\r\n-- consecutivos cuya suma es x. Por ejemplo,\r\n--    consecutivosConSuma 12 3  ==  [[3,4,5]]\r\n--    consecutivosConSuma 10 3  ==  []\r\n-- ---------------------------------------------------------------------\r\n\r\nconsecutivosConSuma :: Int -> Int -> [[Int]]\r\nconsecutivosConSuma x n = \r\n    [[y..y+n-1] | y <- [1..x], sum [y..y+n-1] == x]\r\n\r\n-- Se puede hacer una definici\u00f3n sin b\u00fasqueda, ya que por la f\u00f3rmula de\r\n-- la suma de progresiones aritm\u00e9ticas, la expresi\u00f3n\r\n--    sum [y..y+n-1] == x\r\n-- se reduce a\r\n--    (y+(y+n-1))n\/2 = x\r\n-- De donde se puede despejar la y, ya que\r\n--    2yn+n^2-n = 2x\r\n--    y = (2x-n^2+n)\/2n\r\n-- De la anterior anterior se obtiene la siguiente definici\u00f3n de\r\n-- consecutivosConSuma que no utiliza b\u00fasqueda.\r\n\r\nconsecutivosConSuma' :: Int -> Int -> [[Int]]\r\nconsecutivosConSuma' x n\r\n    | z >= 0 && mod z (2*n) == 0 = [[y..y+n-1]]\r\n    | otherwise                  = []\r\n    where z = 2*x-n^2+n\r\n          y = div z (2*n)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.2. Definir la funci\u00f3n \r\n--    esSuma :: Int -> Int -> Bool\r\n-- tal que (esSuma x n) se verifica si x es la suma de n n\u00fameros\r\n-- naturales consecutivos. Por ejemplo,\r\n--    esSuma 12 3  ==  True\r\n--    esSuma 10 3  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nesSuma :: Int -> Int -> Bool\r\nesSuma x n = consecutivosConSuma x n \/= []\r\n\r\n-- Tambi\u00e9n puede definirse directamente sin necesidad de\r\n-- consecutivosConSuma como se muestra a continuaci\u00f3n.\r\nesSuma' :: Int -> Int -> Bool\r\nesSuma' x n = or [sum [y..y+n-1] == x | y <- [1..x]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.3. Definir la funci\u00f3n\r\n--    menorQueEsSuma :: [Int] -> Int\r\n-- tal que (menorQueEsSuma ns) es el menor n\u00famero que puede expresarse\r\n-- como suma de tantos n\u00fameros consecutivos como indica ns. Por ejemplo, \r\n--    menorQueEsSuma [3,4]  ==  18\r\n-- Lo que indica que 18 es el menor n\u00famero se puede escribir como suma\r\n-- de 3 y de 4 n\u00fameros consecutivos. En este caso, las sumas son \r\n-- 18 = 5+6+7 y 18 = 3+4+5+6.\r\n-- ---------------------------------------------------------------------\r\n\r\nmenorQueEsSuma :: [Int] -> Int\r\nmenorQueEsSuma ns = \r\n    head [x | x <- [1..], and [esSuma x n | n <- ns]]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4.4. Usando la funci\u00f3n menorQueEsSuma calcular el menor\r\n-- n\u00famero que puede expresarse como la suma de 9, 10 y 11 n\u00fameros\r\n-- consecutivos.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La soluci\u00f3n es\r\n--    *Main> menorQueEsSuma [9,10,11]\r\n--    495\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. (Problema 303 del proyecto Euler) Definir la funci\u00f3n\r\n--    multiplosRestringidos :: Int -> (Int -> Bool) -> [Int]\r\n-- tal que (multiplosRestringidos n x) es la lista de los m\u00faltiplos de n\r\n-- tales que todas sus cifras verifican la propiedad p. Por ejemplo, \r\n--    take 4 (multiplosRestringidos 5 (<=3))  ==  [10,20,30,100]\r\n--    take 5 (multiplosRestringidos 3 (<=4))  ==  [3,12,21,24,30]\r\n--    take 5 (multiplosRestringidos 3 even)   ==  [6,24,42,48,60]\r\n-- ---------------------------------------------------------------------\r\n\r\nmultiplosRestringidos :: Int -> (Int -> Bool) -> [Int]\r\nmultiplosRestringidos n p = \r\n    [y | y <- [n,2*n..], all p (cifras y)]\r\n\r\n-- (cifras n) es la lista de las cifras de n, Por ejemplo, \r\n--    cifras 327  ==  [3,2,7]\r\ncifras :: Int -> [Int]\r\ncifras n = [read [x] | x <- show n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir la funci\u00f3n\r\n--    sumaDeDosPrimos :: Int -> [(Int,Int)]\r\n-- tal que (sumaDeDosPrimos n) es la lista de las distintas\r\n-- descomposiciones de n como suma de dos n\u00fameros primos. Por ejemplo, \r\n--    sumaDeDosPrimos 30  ==  [(7,23),(11,19),(13,17)]\r\n-- Calcular, usando la funci\u00f3n sumaDeDosPrimos, el menor n\u00famero que\r\n-- puede escribirse de 10 formas distintas como suma de dos primos.\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaDeDosPrimos :: Int -> [(Int,Int)]\r\nsumaDeDosPrimos n = \r\n    [(x,n-x) | x <- primosN, x < n-x, elem (n-x) primosN]\r\n    where primosN = takeWhile (<=n) primos\r\n\r\nprimos :: [Int]\r\nprimos = criba [2..]\r\n    where criba []     = []\r\n          criba (n:ns) = n : criba (elimina n ns)\r\n          elimina n xs = [x | x <- xs, x `mod` n \/= 0]\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> head [x | x <- [1..], length (sumaDeDosPrimos x) == 10]\r\n--    114\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. [2 puntos] Definir la funci\u00f3n\r\n--    segmentos :: (a -> Bool) -> [a] -> [a]\r\n-- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos\r\n-- elementos verifican la propiedad p. Por ejemplo,\r\n--    segmentos even [1,2,0,4,5,6,48,7,2]  ==  [[],[2,0,4],[6,48],[2]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsegmentos :: (a -> Bool) -> [a] -> [[a]]\r\nsegmentos _ [] = []\r\nsegmentos p xs = \r\n    takeWhile p xs : (segmentos p (dropWhile (not.p) (dropWhile p xs)))\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En primera parte de la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se han explicado las soluciones de los ejercicios de la 16\u00aa relaci\u00f3n sobre ejercicios de ex\u00e1menes del curso 2010-11 correspondientes a los 9 primeros temas del curso. Los ejercicios, y sus soluciones, se muestran a continuaci\u00f3n.<\/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":[186],"tags":[295],"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\/1880"}],"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=1880"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1880\/revisions"}],"predecessor-version":[{"id":2857,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/1880\/revisions\/2857"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=1880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=1880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=1880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}