{"id":3934,"date":"2013-12-17T08:09:37","date_gmt":"2013-12-17T07:09:37","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3934"},"modified":"2014-01-06T11:56:40","modified_gmt":"2014-01-06T10:56:40","slug":"i1m2013-2o-examen-de-programacion-con-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-2o-examen-de-programacion-con-haskell\/","title":{"rendered":"I1M2013: 2\u00ba examen de programaci\u00f3n con Haskell"},"content":{"rendered":"<p>En la clase de hoy del curso <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\">Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas)<\/a> se ha realizado el 2\u00ba examen  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-- Inform\u00e1tica (1\u00ba del Grado en Matem\u00e1ticas)\r\n-- 2\u00ba examen de evaluaci\u00f3n continua (17 de diciembre de 2013)\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Test.QuickCheck\r\nimport Data.List (sort)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. [2.5 puntos] Definir la funci\u00f3n\r\n--    expandida :: [Int] -> [Int]\r\n-- tal que (expandida xs) es la lista obtenida duplicando cada uno de\r\n-- los elementos pares de xs. Por ejemplo,\r\n--    expandida [3,5,4,6,6,1,0]  ==  [3,5,4,4,6,6,6,6,1,0,0]\r\n--    expandida [3,5,4,6,8,1,0]  ==  [3,5,4,4,6,6,8,8,1,0,0]\r\n-- ---------------------------------------------------------------------\r\n\r\nexpandida :: [Int] -> [Int]\r\nexpandida [] = []\r\nexpandida (x:xs) | even x    = x : x : expandida xs\r\n                 | otherwise = x : expandida xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. [2.5 puntos] Comprobar con QuickCheck que el n\u00famero de\r\n-- elementos de (expandida xs) es el del n\u00famero de elementos de xs m\u00e1s\r\n-- el n\u00famero de elementos pares de xs.\r\n-- ---------------------------------------------------------------------\r\n\r\nprop_expandida :: [Int] -> Bool\r\nprop_expandida xs =\r\n    length (expandida xs) == length xs + length (filter even xs) \r\n\r\n-- La comprobaci\u00f3n es\r\n--    ghci> quickCheck prop_expandida\r\n--    +++ OK, passed 100 tests.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. [2.5 puntos] Definir la funci\u00f3n\r\n--    digitosOrdenados :: Integer -> Integer\r\n-- tal que (digitosOrdenados n) es el n\u00famero obtenido ordenando los\r\n-- d\u00edgitos de n de mayor a menor. Por ejemplo,\r\n--    digitosOrdenados 325724237  ==  775433222\r\n-- ---------------------------------------------------------------------\r\n\r\ndigitosOrdenados :: Integer -> Integer\r\ndigitosOrdenados n = read (ordenados (show n))\r\n\r\nordenados :: Ord a => [a] -> [a]\r\nordenados [] = []\r\nordenados (x:xs) = \r\n    ordenados mayores ++ [x] ++ ordenados menores\r\n    where mayores = [y | y <- xs, y > x]\r\n          menores = [y | y <- xs, y <= x]\r\n\r\n-- Nota: La funci\u00f3n digitosOrdenados puede definirse por composici\u00f3n\r\ndigitosOrdenados2 :: Integer -> Integer\r\ndigitosOrdenados2 = read . ordenados . show\r\n\r\n-- Nota: La funci\u00f3n digitosOrdenados puede definirse por composici\u00f3n y\r\n-- tambi\u00e9n usando sort en lugar de ordenados\r\ndigitosOrdenados3 :: Integer -> Integer\r\ndigitosOrdenados3 = read . reverse . sort . show\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. [2.5 puntos] Sea f la siguiente funci\u00f3n, aplicable a\r\n-- cualquier n\u00famero entero positivo: \r\n-- * Si el n\u00famero es par, se divide entre 2.\r\n-- * Si el n\u00famero es impar, se multiplica por 3 y se suma 1.\r\n-- \r\n-- La carrera de Collatz consiste en, dada una lista de n\u00fameros ns,\r\n-- sustituir cada n\u00famero n de ns por f(n) hasta que alguno sea igual a\r\n-- 1. Por ejemplo, la siguiente sucesi\u00f3n es una carrera de Collatz\r\n--    [ 3, 6,20, 49, 73]\r\n--    [10, 3,10,148,220]\r\n--    [ 5,10, 5, 74,110]\r\n--    [16, 5,16, 37, 55]\r\n--    [ 8,16, 8,112,166]\r\n--    [ 4, 8, 4, 56, 83]\r\n--    [ 2, 4, 2, 28,250]\r\n--    [ 1, 2, 1, 14,125]\r\n-- En esta carrera, los ganadores son 3 y 20.\r\n-- \r\n-- Definir la funci\u00f3n \r\n--    ganadores :: [Int] -> [Int]\r\n--    ganadores [3,6,20,49,73]  ==  [3,20]\r\n-- ---------------------------------------------------------------------\r\n\r\nganadores :: [Int] -> [Int]\r\nganadores xs = selecciona xs (final xs)\r\n\r\n-- (final xs) es el estado final de la carrera de Collatz a partir de\r\n-- xs. Por ejemplo,\r\n--    final [3,6,20,49,73]  ==  [1,2,1,14,125]\r\nfinal :: [Int] -> [Int]\r\nfinal xs | elem 1 xs = xs\r\n         | otherwise = final [siguiente x | x <- xs]\r\n\r\n-- (siguiente x) es el siguiente de x en la carrera de Collatz. Por\r\n-- ejemplo, \r\n--    siguiente 3  ==  10\r\n--    siguiente 6  ==  3\r\nsiguiente :: Int -> Int\r\nsiguiente x | even x    = x `div` 2\r\n            | otherwise = 3*x+1\r\n\r\n-- (selecciona xs ys) es la lista de los elementos de xs cuyos tales que\r\n-- los elementos de ys en la misma posici\u00f3n son iguales a 1. Por ejemplo,\r\n--    selecciona [3,6,20,49,73] [1,2,1,14,125]  ==  [3,20]\r\nselecciona :: [Int] -> [Int] -> [Int]\r\nselecciona xs ys =\r\n    [x | (x,y) <- zip xs ys, y == 1]\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas) se ha realizado el 2\u00ba examen del curso. Los ejercicios y sus soluciones se muestran a continuaci\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":[222],"tags":[270,300],"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\/3934"}],"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=3934"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3934\/revisions"}],"predecessor-version":[{"id":3935,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3934\/revisions\/3935"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}