{"id":3404,"date":"2013-06-13T11:05:10","date_gmt":"2013-06-13T11:05:10","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3404"},"modified":"2013-09-21T12:44:53","modified_gmt":"2013-09-21T10:44:53","slug":"i1m2012-6%c2%ba-examen-de-la-evaluacion-continua","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-6%c2%ba-examen-de-la-evaluacion-continua\/","title":{"rendered":"I1M2012: 6\u00ba examen de la evaluaci\u00f3n continua"},"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 6\u00ba examen de la evaluaci\u00f3n continua.<\/p>\n<p>\nA continuaci\u00f3n se muestra el examen junto con su soluci\u00f3n:<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\nimport Data.Array\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. [2 puntos] Un n\u00famero es creciente si cada una de sus\r\n-- cifras es mayor o igual que su anterior. Definir la funci\u00f3n\r\n--    numerosCrecientes :: [Integer] -> [Integer]\r\n-- tal que (numerosCrecientes xs) es la lista de los n\u00fameros crecientes\r\n-- de xs. Por ejemplo,\r\n--    ghci> numerosCrecientes [21..50]\r\n--    [22,23,24,25,26,27,28,29,33,34,35,36,37,38,39,44,45,46,47,48,49]\r\n-- Usando la definici\u00f3n de numerosCrecientes calcular la cantidad de\r\n-- n\u00fameros crecientes de 3 cifras.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa definici\u00f3n (por comprensi\u00f3n):\r\nnumerosCrecientes :: [Integer] -> [Integer]\r\nnumerosCrecientes xs = [n | n <- xs, esCreciente (cifras n)]\r\n\r\n-- (esCreciente xs) se verifica si xs es una sucesi\u00f3n cerciente. Por\r\n-- ejemplo, \r\n--    esCreciente [3,5,5,12]  ==  True\r\n--    esCreciente [3,5,4,12]  ==  False\r\nesCreciente :: Ord a => [a] -> Bool\r\nesCreciente (x:y:zs) = x <= y &#038;&#038; esCreciente (y:zs) \r\nesCreciente _        = True\r\n\r\n-- (cifras x) es la lista de las cifras del n\u00famero x. Por ejemplo,\r\n--    cifras 325  ==  [3,2,5]\r\ncifras :: Integer -> [Integer]\r\ncifras x = [read [d] | d <- show x]         \r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> length (numerosCrecientes [100..999])\r\n--    165\r\n\r\n-- 2\u00aa definici\u00f3n (por filtrado):  \r\nnumerosCrecientes2 :: [Integer] -> [Integer]\r\nnumerosCrecientes2 = filter (\\n -> esCreciente (cifras n))\r\n\r\n-- 3\u00aa definici\u00f3n (por recursi\u00f3n):\r\nnumerosCrecientes3 :: [Integer] -> [Integer]\r\nnumerosCrecientes3 [] = []\r\nnumerosCrecientes3 (n:ns)\r\n  | esCreciente (cifras n) = n : numerosCrecientes3 ns\r\n  | otherwise              = numerosCrecientes3 ns\r\n\r\n-- 4\u00aa definici\u00f3n (por plegado):\r\nnumerosCrecientes4 :: [Integer] -> [Integer]\r\nnumerosCrecientes4 = foldr f []\r\n  where f n ns | esCreciente (cifras n) = n : ns\r\n               | otherwise              = ns\r\n          \r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. [2 puntos] Definir la funci\u00f3n\r\n--    sublistasIguales :: Eq a => [a] -> [[a]]\r\n-- tal que (sublistasIguales xs) es la listas de elementos consecutivos\r\n-- de xs que son iguales. Por ejemplo,\r\n--    ghci> sublistasIguales [1,5,5,10,7,7,7,2,3,7] \r\n--    [[1],[5,5],[10],[7,7,7],[2],[3],[7]]\r\n-- ---------------------------------------------------------------------\r\n\r\n-- 1\u00aa definici\u00f3n:\r\nsublistasIguales :: Eq a => [a] -> [[a]]\r\nsublistasIguales [] = []\r\nsublistasIguales (x:xs) =\r\n  (x : takeWhile (==x) xs) : sublistasIguales (dropWhile (==x) xs)\r\n\r\n-- 2\u00aa definici\u00f3n:\r\nsublistasIguales2 :: Eq a => [a] -> [[a]]\r\nsublistasIguales2 []     = []\r\nsublistasIguales2 [x]    = [[x]]\r\nsublistasIguales2 (x:y:zs)\r\n  | x == u    = (x:u:us):vss\r\n  | otherwise = [x]:((u:us):vss)           \r\n  where ((u:us):vss) = sublistasIguales2 (y:zs)\r\n\r\n-- ----------------------------------------------------------------------\r\n-- Ejercicio 3. [2 puntos] Los \u00e1rboles binarios se pueden representar\r\n-- con el de dato algebraico\r\n--    data Arbol a = H\r\n--                 | N a (Arbol a) (Arbol a)\r\n--                 deriving Show\r\n-- Por ejemplo, los \u00e1rboles \r\n--         9                9                \r\n--        \/ \\              \/ \\    \r\n--       \/   \\            \/   \\   \r\n--      8     6          8     6  \r\n--     \/ \\   \/ \\        \/ \\   \/ \\ \r\n--    3   2 4   5      3   2 4   7\r\n-- se pueden representar por\r\n--    ej1, ej2:: Arbol Int\r\n--    ej1 = N 9 (N 8 (N 3 H H) (N 2 H H)) (N 6 (N 4 H H) (N 5 H H))\r\n--    ej2 = N 9 (N 8 (N 3 H H) (N 2 H H)) (N 6 (N 4 H H) (N 7 H H))\r\n-- Un \u00e1rbol binario ordenado es un \u00e1rbol binario (ABO) en el que los\r\n-- valores de cada nodo es mayor o igual que los valores de sus\r\n-- hijos. Por ejemplo, ej1 es un ABO, pero ej2 no lo es. \r\n-- \r\n-- Definir la funci\u00f3n esABO\r\n--    esABO :: Ord t => Arbol t -> Bool\r\n-- tal que (esABO a) se verifica si a es un \u00e1rbol binario ordenado. Por\r\n-- ejemplo. \r\n--    esABO ej1 == True\r\n--    esABO ej2 == False    \r\n-- ---------------------------------------------------------------------\r\n\r\ndata Arbol a = H\r\n             | N a (Arbol a) (Arbol a)\r\n             deriving Show\r\n\r\nej1, ej2 :: Arbol Int\r\nej1 = N 9 (N 8 (N 3 H H) (N 2 H H))\r\n          (N 6 (N 4 H H) (N 5 H H))\r\n\r\nej2 = N 9 (N 8 (N 3 H H) (N 2 H H))\r\n          (N 6 (N 4 H H) (N 7 H H))\r\n\r\n-- 1\u00aa definici\u00f3n\r\nesABO :: Ord a => Arbol a -> Bool\r\nesABO H                       = True\r\nesABO (N x H H)               = True\r\nesABO (N x m1@(N x1 a1 b1) H) = x >= x1 && esABO m1\r\nesABO (N x H m2@(N x2 a2 b2)) = x >= x2 && esABO m2\r\nesABO (N x m1@(N x1 a1 b1) m2@(N x2 a2 b2)) = \r\n      x >= x1 && esABO m1 && x >= x2 && esABO m2\r\n\r\n-- 2\u00aa definici\u00f3n\r\nesABO2 :: Ord a => Arbol a -> Bool\r\nesABO2 H         = True\r\nesABO2 (N x i d) = mayor x i && mayor x d && esABO2 i && esABO2 d \r\n       where  mayor x H         = True\r\n              mayor x (N y _ _) = x >= y\r\n    \r\n-- ----------------------------------------------------------------------\r\n-- Ejercicio 4. [2 puntos] Definir la funci\u00f3n \r\n--    paresEspecialesDePrimos :: Integer -> [(Integer,Integer)]\r\n-- tal que (paresEspecialesDePrimos n) es la lista de los pares de\r\n-- primos (p,q) tales que p < q y q-p es divisible por n. Por ejemplo,\r\n--    ghci> take 9 (paresEspecialesDePrimos 2)\r\n--    [(3,5),(3,7),(5,7),(3,11),(5,11),(7,11),(3,13),(5,13),(7,13)]\r\n--    ghci> take 9 (paresEspecialesDePrimos 3)\r\n--    [(2,5),(2,11),(5,11),(7,13),(2,17),(5,17),(11,17),(7,19),(13,19)]\r\n-- ---------------------------------------------------------------------\r\n\r\nparesEspecialesDePrimos :: Integer -> [(Integer,Integer)]\r\nparesEspecialesDePrimos n =\r\n  [(p,q) | (p,q) <- paresPrimos, rem (q-p) n == 0]\r\n\r\n-- paresPrimos es la lista de los pares de primos (p,q) tales que p < q. \r\n-- Por ejemplo,\r\n--    ghci> take 9 paresPrimos\r\n--    [(2,3),(2,5),(3,5),(2,7),(3,7),(5,7),(2,11),(3,11),(5,11)]\r\nparesPrimos :: [(Integer,Integer)]\r\nparesPrimos = [(p,q) | q <- primos, p <- takeWhile (<q) primos]\r\n\r\n-- primos es la lista de primos. Por ejemplo,\r\n--    take 9 primos  ==  [2,3,5,7,11,13,17,19,23]\r\nprimos :: [Integer]\r\nprimos = criba [2..]\r\n\r\ncriba :: [Integer] -> [Integer]\r\ncriba (p:xs) = p : criba [x | x <- xs, x `mod` p \/= 0]\r\n\r\n-- ----------------------------------------------------------------------\r\n-- Ejercicio 5. Las matrices enteras se pueden representar mediante\r\n-- tablas con \u00edndices enteros:\r\n--    type Matriz = Array (Int,Int) Int\r\n-- \r\n-- Definir la funci\u00f3n\r\n--    ampliaColumnas :: Matriz -> Matriz -> Matriz\r\n-- tal que (ampliaColumnas p q) es la matriz construida a\u00f1adiendo las\r\n-- columnas de la matriz q a continuaci\u00f3n de las de p (se supone que\r\n-- tienen el mismo n\u00famero de filas). Por ejemplo, si p y q representa\r\n-- las dos primeras matrices, entonces (ampliaColumnas p q) es la\r\n-- tercera  \r\n--    |0 1|    |4 5 6|    |0 1 4 5 6| \r\n--    |2 3|    |7 8 9|    |2 3 7 8 9|\r\n-- --------------------------------------------------------------------- \r\n\r\ntype Matriz = Array (Int,Int) Int\r\n\r\nampliaColumnas :: Matriz -> Matriz -> Matriz\r\nampliaColumnas p1 p2 =\r\n  array ((1,1),(m,n1+n2)) [((i,j), f i j) | i <- [1..m], j <- [1..n1+n2]]\r\n    where ((_,_),(m,n1)) = bounds p1\r\n          ((_,_),(_,n2)) = bounds p2\r\n          f i j | j <= n1   = p1!(i,j)\r\n                | otherwise = p2!(i,j-n1) \r\n\r\n-- Ejemplo\r\n--    ghci> let p = listArray ((1,1),(2,2)) [0..3] :: Matriz\r\n--    ghci> let q = listArray ((1,1),(2,3)) [4..9] :: Matriz\r\n--    ghci> ampliaColumnas p q\r\n--    array ((1,1),(2,5)) \r\n--          [((1,1),0),((1,2),1),((1,3),4),((1,4),5),((1,5),6),\r\n--           ((2,1),2),((2,2),3),((2,3),7),((2,4),8),((2,5),9)]\r\n<\/pre>\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 6\u00ba examen de la evaluaci\u00f3n continua. A continuaci\u00f3n se muestra el examen junto con su soluci\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":[197],"tags":[65,270,298],"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\/3404"}],"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=3404"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3404\/revisions"}],"predecessor-version":[{"id":3658,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3404\/revisions\/3658"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}