{"id":3655,"date":"2013-09-13T08:00:31","date_gmt":"2013-09-13T06:00:31","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3655"},"modified":"2013-09-21T12:40:46","modified_gmt":"2013-09-21T10:40:46","slug":"i1m2012-examen-de-la-2a-convocatoria-del-curso","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-examen-de-la-2a-convocatoria-del-curso\/","title":{"rendered":"I1M2012: Examen de la 2\u00aa convocatoria del curso"},"content":{"rendered":"<p>En la clase de hoy de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-12\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se ha realizado el examen de la segunda convocatoria del curso.<\/p>\n<p>\nA continuaci\u00f3n se muestra el examen junto con su soluci\u00f3n:<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- Inform\u00e1tica (1\u00ba del Grado en Matem\u00e1ticas)\r\n-- Examen de la 2\u00aa convocatoria (13 de septiembre de 2013)\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Data.List\r\nimport Data.Array\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.1. [1 punto] Las notas se pueden agrupar de distinta\r\n-- formas. Una es por la puntuaci\u00f3n; por ejemplo,\r\n--    [(4,[\"juan\",\"ana\"]),(9,[\"rosa\",\"luis\",\"mar\"])]\r\n-- Otra es por nombre; por ejemplo,\r\n--    [(\"ana\",4),(\"juan\",4),(\"luis\",9),(\"mar\",9),(\"rosa\",9)]\r\n-- \r\n-- Definir la funci\u00f3n\r\n--    transformaPaN :: [(Int,[String])] -> [(String,Int)]\r\n-- tal que (transformaPaN xs) es la agrupaci\u00f3n de notas por nombre\r\n-- correspondiente a la agrupaci\u00f3n de notas por puntuaci\u00f3n xs. Por\r\n-- ejemplo, \r\n--    > transformaPaN [(4,[\"juan\",\"ana\"]),(9,[\"rosa\",\"luis\",\"mar\"])]\r\n--    [(\"ana\",4),(\"juan\",4),(\"luis\",9),(\"mar\",9),(\"rosa\",9)]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa definici\u00f3n (por comprensi\u00f3n):\r\ntransformaPaN :: [(Int,[String])] -> [(String,Int)]\r\ntransformaPaN xs = sort [(a,n) | (n,as) <- xs, a <- as]\r\n\r\n-- 2\u00aa definici\u00f3n (por recursi\u00f3n):\r\ntransformaPaN2 :: [(Int,[String])] -> [(String,Int)]\r\ntransformaPaN2 []          = []\r\ntransformaPaN2 ((n,xs):ys) = [(x,n)|x<-xs] ++ transformaPaN2 ys\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.2. [1 punto] Definir la funci\u00f3n\r\n--    transformaNaP :: [(String,Int)] -> [(Int,[String])] \r\n-- tal que (transformaPaN xs) es la agrupaci\u00f3n de notas por puntuaci\u00f3n\r\n-- correspondiente a la agrupaci\u00f3n de notas por nombre xs. Por\r\n-- ejemplo, \r\n--    > transformaNaP [(\"ana\",4),(\"juan\",4),(\"luis\",9),(\"mar\",9),(\"rosa\",9)]\r\n--    [(4,[\"ana\",\"juan\"]),(9,[\"luis\",\"mar\",\"rosa\"])]\r\n-- ---------------------------------------------------------------------\r\n\r\ntransformaNaP :: [(String,Int)] -> [(Int,[String])] \r\ntransformaNaP xs = [(n, [a | (a,n') <- xs, n' == n]) | n <- notas]\r\n    where notas = sort (nub [n | (_,n) <- xs]) \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. [2 puntos] Definir la funci\u00f3n\r\n--    multiplosCon9 :: Integer -> [Integer]\r\n-- tal que (multiplosCon9 n) es la lista de los m\u00faltiplos de n cuya\r\n-- \u00fanica cifra es 9. Por ejemplo,\r\n--    take 3 (multiplosCon9 3)  ==  [9,99,999]\r\n--    take 3 (multiplosCon9 7)  ==  [999999,999999999999,999999999999999999]\r\n-- Calcular el menor m\u00faltiplo de 2013 formado s\u00f3lo por nueves.\r\n-- ---------------------------------------------------------------------\r\n          \r\nmultiplosCon9 :: Integer -> [Integer]\r\nmultiplosCon9 n = [x | x <- numerosCon9, rem x n == 0]\r\n\r\n-- numerosCon9 es la lista de los n\u00famero cuyas cifras son todas iguales\r\n-- a 9. Por ejemplo,\r\n--    take 5 numerosCon9  ==  [9,99,999,9999,99999]\r\nnumerosCon9 :: [Integer]\r\nnumerosCon9 = [10^n-1 | n <- [1..]]\r\n\r\n-- 2\u00aa definici\u00f3n (por recursi\u00f3n):\r\nnumerosCon9R :: [Integer]\r\nnumerosCon9R = 9 : sig 9\r\n    where sig x = (10*x+9) : sig (10*x+9)\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> head (multiplosCon9 2013)\r\n--    999999999999999999999999999999999999999999999999999999999999\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. [2 puntos] Una sucesi\u00f3n es suave si valor absoluto de la\r\n-- diferencia de sus t\u00e9rminos consecutivos es 1. Definir la funci\u00f3n \r\n--    suaves :: Int -> [[Int]]\r\n-- tal que (suaves n) es la lista de las sucesiones suaves de longitud n\r\n-- cuyo \u00faltimo t\u00e9rmino es 0. Por ejemplo,\r\n--    suaves 2  ==  [[1,0],[-1,0]]\r\n--    suaves 3  ==  [[2,1,0],[0,1,0],[0,-1,0],[-2,-1,0]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsuaves :: Int -> [[Int]]\r\nsuaves 0 = []\r\nsuaves 1 = [[0]]\r\nsuaves n = concat [[x+1:x:xs,x-1:x:xs] | (x:xs) <- suaves (n-1)] \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. [2 puntos] Los \u00e1rboles binarios se pueden representar\r\n-- mediante el tipo Arbol definido por \r\n--    data Arbol a = H a \r\n--                 | N a (Arbol a) (Arbol a)\r\n--                 deriving Show\r\n-- Por ejemplo, el \u00e1rbol\r\n--          1\r\n--         \/ \\ \r\n--        \/   \\\r\n--       4     6\r\n--      \/ \\   \/ \\\r\n--     0   7 4   3\r\n-- se puede definir por \r\n--    ej1 :: Arbol Int\r\n--    ej1 = N 1 (N 4 (H 0) (H 7)) (N 6 (H 4) (H 3))\r\n--\r\n-- Definir la funci\u00f3n\r\n--    algunoArbol :: Arbol t -> (t -> Bool) -> Bool\r\n-- tal que (algunoArbol a p) se verifica si alg\u00fan elemento del \u00e1rbol a\r\n-- cumple la propiedad p. Por ejemplo,\r\n--    algunoArbol ej1 (>9)  ==  False\r\n--    algunoArbol ej1 (>5)  ==  True\r\n-- ---------------------------------------------------------------------\r\n\r\ndata Arbol a = H a \r\n             | N a (Arbol a) (Arbol a)\r\n             deriving Show\r\n\r\nej1 :: Arbol Int\r\nej1 = N 1 (N 4 (H 0) (H 7)) (N 6 (H 4) (H 3))\r\n\r\nalgunoArbol :: Arbol a -> (a -> Bool) -> Bool\r\nalgunoArbol (H x) p     = p x\r\nalgunoArbol (N x i d) p = p x || algunoArbol i p || algunoArbol d p\r\n\r\n-- ----------------------------------------------------------------------\r\n-- Ejercicio 5. [2 puntos] Las matrices enteras se pueden representar\r\n-- mediante tablas con \u00edndices enteros:\r\n--    type Matriz = Array (Int,Int) Int\r\n-- \r\n-- Definir la funci\u00f3n\r\n--    matrizPorBloques :: Matriz -> Matriz -> Matriz -> Matriz -> Matriz\r\n-- tal que (matrizPorBloques p1 p2 p3 p4) es la matriz cuadrada de orden\r\n-- 2nx2n construida con las matrices cuadradas de orden nxn p1, p2 p3 y\r\n-- p4 de forma que p1 es su bloque superior izquierda, p2 es su bloque\r\n-- superior derecha, p3 es su bloque inferior izquierda y p4 es su bloque\r\n-- inferior derecha. Por ejemplo, si p1, p2, p3 y p4 son las matrices\r\n-- definidas por\r\n--    p1, p2, p3, p4 :: Matriz\r\n--    p1 = listArray ((1,1),(2,2)) [1,2,3,4]\r\n--    p2 = listArray ((1,1),(2,2)) [6,5,7,8]\r\n--    p3 = listArray ((1,1),(2,2)) [0,6,7,1]\r\n--    p4 = listArray ((1,1),(2,2)) [5,2,8,3]\r\n-- entonces\r\n--    ghci> matrizPorBloques p1 p2 p3 p4\r\n--    array ((1,1),(4,4)) [((1,1),1),((1,2),2),((1,3),6),((1,4),5),\r\n--                         ((2,1),3),((2,2),4),((2,3),7),((2,4),8),\r\n--                         ((3,1),0),((3,2),6),((3,3),5),((3,4),2),\r\n--                         ((4,1),7),((4,2),1),((4,3),8),((4,4),3)]\r\n-- --------------------------------------------------------------------- \r\n\r\ntype Matriz = Array (Int,Int) Int\r\n\r\np1, p2, p3, p4 :: Matriz\r\np1 = listArray ((1,1),(2,2)) [1,2,3,4]\r\np2 = listArray ((1,1),(2,2)) [6,5,7,8]\r\np3 = listArray ((1,1),(2,2)) [0,6,7,1]\r\np4 = listArray ((1,1),(2,2)) [5,2,8,3]\r\n\r\nmatrizPorBloques :: Matriz -> Matriz -> Matriz -> Matriz -> Matriz\r\nmatrizPorBloques p1 p2 p3 p4 =\r\n    array ((1,1),(m,m)) [((i,j), f i j) | i <- [1..m], j <- [1..m]]\r\n    where ((_,_),(n,_)) = bounds p1\r\n          m = 2*n\r\n          f i j | i <= n &#038;&#038; j <= n = p1!(i,j)\r\n                | i <= n &#038;&#038; j >  n = p2!(i,j-n)\r\n                | i >  n && j <= n = p3!(i-n,j)\r\n                | i >  n && j >  n = p4!(i-n,j-n)                             \r\n<\/pre>\n<p>El examen se ha agregado al libro <a href=\"http:\/\/www.cs.us.es\/~jalonso\/publicaciones\/2013-Examenes_de_PF_con_Haskell.pdf\">Ex\u00e1menes de programaci\u00f3n funcional con Haskell (2009-13)<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se ha realizado el examen de la segunda convocatoria del curso. A continuaci\u00f3n se muestra el examen junto con su soluci\u00f3n:<\/p>\n","protected":false},"author":2,"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":[197],"tags":[270,298,194],"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\/3655"}],"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=3655"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3655\/revisions"}],"predecessor-version":[{"id":3657,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3655\/revisions\/3657"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}