{"id":3809,"date":"2013-11-08T17:18:05","date_gmt":"2013-11-08T16:18:05","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3809"},"modified":"2013-11-09T11:19:01","modified_gmt":"2013-11-09T10:19:01","slug":"i1m2013-ejercicios-de-definiciones-por-comprension-5","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-ejercicios-de-definiciones-por-comprension-5\/","title":{"rendered":"I1M2013: Ejercicios de definiciones por comprensi\u00f3n (5)"},"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 han comentado las soluciones de los ejercicios 8 a 14 de la 5\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n. <\/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-- Ejercicio 8. La bases de datos sobre actividades de personas pueden\r\n-- representarse mediante listas de elementos de la forma (a,b,c,d),\r\n-- donde a es el nombre de la persona, b su actividad, c su fecha de\r\n-- nacimiento y d la de su fallecimiento. Un ejemplo es la siguiente que\r\n-- usaremos a lo largo de este ejercicio,\r\n-- ---------------------------------------------------------------------\r\n\r\npersonas :: [(String,String,Int,Int)]\r\npersonas = [(\"Cervantes\",\"Literatura\",1547,1616),\r\n            (\"Velazquez\",\"Pintura\",1599,1660),\r\n            (\"Picasso\",\"Pintura\",1881,1973),\r\n            (\"Beethoven\",\"Musica\",1770,1823),\r\n            (\"Poincare\",\"Ciencia\",1854,1912),\r\n            (\"Quevedo\",\"Literatura\",1580,1654),\r\n            (\"Goya\",\"Pintura\",1746,1828),\r\n            (\"Einstein\",\"Ciencia\",1879,1955),\r\n            (\"Mozart\",\"Musica\",1756,1791),\r\n            (\"Botticelli\",\"Pintura\",1445,1510),\r\n            (\"Borromini\",\"Arquitectura\",1599,1667),\r\n            (\"Bach\",\"Musica\",1685,1750)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.1. Definir la funci\u00f3n nombres tal que (nombres bd) es\r\n-- la lista de los nombres de las personas de la base de datos bd. Por\r\n-- ejemplo,  \r\n--    ghci> nombres personas\r\n--     [\"Cervantes\",\"Velazquez\",\"Picasso\",\"Beethoven\",\"Poincare\",\r\n--      \"Quevedo\",\"Goya\",\"Einstein\",\"Mozart\",\"Botticelli\",\"Borromini\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nnombres :: [(String,String,Int,Int)] -> [String]\r\nnombres bd = [x | (x,_,_,_) <- bd]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.2. Definir la funci\u00f3n musicos tal que (musicos bd) es\r\n-- la lista de los nombres de los m\u00fasicos de la base de datos bd. Por\r\n-- ejemplo,  \r\n--    ghci> musicos personas\r\n--    [\"Beethoven\",\"Mozart\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nmusicos :: [(String,String,Int,Int)] -> [String]\r\nmusicos bd = [x | (x,\"Musica\",_,_) <- bd]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.3. Definir la funci\u00f3n seleccion tal que (seleccion bd m) \r\n-- es la lista de los nombres de las personas de la base de datos bd\r\n-- cuya actividad es m. Por ejemplo,  \r\n--    ghci> seleccion personas \"Pintura\"\r\n--    [\"Velazquez\",\"Picasso\",\"Goya\",\"Botticelli\"]\r\n--    ghci> seleccion personas \"Musica\"\r\n--    [\"Beethoven\",\"Mozart\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nseleccion :: [(String,String,Int,Int)] -> String -> [String]\r\nseleccion bd m = [ x | (x,m',_,_) <- bd, m == m' ]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.4. Definir, usando el apartado anterior, la funci\u00f3n\r\n-- musicos' tal que (musicos' bd) es la lista de los nombres de los\r\n-- m\u00fasicos de la base de datos bd. Por ejemplo,  \r\n--    ghci> musicos' personas\r\n--    [\"Beethoven\",\"Mozart\",\"Bach\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nmusicos' :: [(String,String,Int,Int)] -> [String]\r\nmusicos' bd = seleccion bd \"Musica\"\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8.5. Definir la funci\u00f3n vivas tal que (vivas bd a) es la\r\n-- lista de los nombres de las personas de la base de datos bd  que\r\n-- estaban vivas en el a\u00f1o a. Por ejemplo,  \r\n--    ghci> vivas personas 1600\r\n--    [\"Cervantes\",\"Velazquez\",\"Quevedo\",\"Borromini\"]\r\n-- ---------------------------------------------------------------------\r\n\r\nvivas :: [(String,String,Int,Int)] -> Int -> [String]\r\nvivas ps a = [x | (x,_,a1,a2) <- ps, a1 <= a, a <= a2]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9.1. En este esjercicio se consideran listas de ternas de\r\n-- la forma (nombre, edad, poblaci\u00f3n). \r\n-- \r\n-- Definir la funci\u00f3n puedenVotar tal que (puedenVotar t) es la\r\n-- lista de las personas de t que tienen edad para votar. Por ejemplo,\r\n--    ghci> :{\r\n--    *Main| puedenVotar [(\"Ana\", 16, \"Sevilla\"), (\"Juan\", 21, \"Coria\"), \r\n--    *Main|              (\"Alba\", 19, \"Camas\"), (\"Pedro\",18,\"Sevilla\")]\r\n--    *Main| :}\r\n--    [\"Juan\",\"Alba\",\"Pedro\"]\r\n-- ---------------------------------------------------------------------\r\n\r\npuedenVotar t = [x | (x,y,_) <- t, y >= 18]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9.2. Definir la funci\u00f3n puedenVotarEn tal que (puedenVotar\r\n-- t p) es la lista de las personas de t que pueden votar en la\r\n-- poblaci\u00f3n p. Por ejemplo, \r\n--    ghci> :{\r\n--    *Main| puedenVotarEn [(\"Ana\", 16, \"Sevilla\"), (\"Juan\", 21, \"Coria\"), \r\n--    *Main|                (\"Alba\", 19, \"Camas\"),(\"Pedro\",18,\"Sevilla\")] \r\n--    *Main|               \"Sevilla\"\r\n--    *Main| :}\r\n--    [\"Pedro\"]\r\n-- ---------------------------------------------------------------------\r\n\r\npuedenVotarEn t c = [x | (x,y,z) <- t, y >= 18, z == c]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10. Dos listas xs, ys de la misma longitud son\r\n-- perpendiculares si el producto escalar de ambas es 0, donde el\r\n-- producto escalar de dos listas de enteros xs e ys viene\r\n-- dado por la suma de los productos de los elementos correspondientes.\r\n-- \r\n-- Definir la funci\u00f3n perpendiculares tal que (perpendiculares xs yss)\r\n-- es la lista de los elementos de yss que son perpendiculares a xs.\r\n-- Por ejemplo,\r\n--    ghci> perpendiculares [1,0,1] [[0,1,0], [2,3,1], [-1,7,1],[3,1,0]]\r\n--    [[0,1,0],[-1,7,1]]\r\n-- ---------------------------------------------------------------------\r\n\r\nperpendiculares xs yss = [ys | ys <-yss, productoEscalar xs ys == 0]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 11. La suma de la serie\r\n--    1\/1^2 + 1\/2^2 + 1\/3^2 + 1\/4^2 + ...\r\n-- es pi^2\/6. Por tanto, pi se puede aproximar mediante la ra\u00edz cuadrada\r\n-- de 6 por la suma de la serie.\r\n-- \r\n-- Definir la funci\u00f3n aproximaPi tal que (aproximaPi n) es la aproximaci\u00f3n \r\n-- de pi obtenida mediante n t\u00e9rminos de la serie. Por ejemplo, \r\n--    aproximaPi 4    == 2.9226129861250305\r\n--    aproximaPi 1000 == 3.1406380562059946\r\n-- ---------------------------------------------------------------------\r\n\r\naproximaPi n = sqrt (6 * sum [1\/x^2 | x <- [1..n]])\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12.1. [Problema 357 del Project Euler] Un n\u00famero natural n\r\n-- es especial si para todo divisor d de n, d+n\/d es primo. Definir la\r\n-- funci\u00f3n  \r\n--    especial :: Integer -> Bool\r\n-- tal que (especial x) se verifica si x es especial. Por ejemplo,\r\n--    especial 30  ==  True\r\n--    especial 20  ==  False\r\n-- ---------------------------------------------------------------------\r\n\r\nespecial :: Integer -> Bool\r\nespecial x = and [esPrimo (d + x `div` d) | d <- divisores x]\r\n\r\n-- (divisores x) es la lista de los divisores de x. Por ejemplo,\r\n--    divisores 30  ==  [1,2,3,5,6,10,15,30]\r\ndivisores :: Integer -> [Integer]\r\ndivisores x = [d | d <- [1..x], x `rem` d == 0] \r\n\r\n-- (esPrimo x) se verifica si x es primo. Por ejemplo,\r\n--    esPrimo 7  ==  True\r\n--    esPrimo 8  ==  False\r\nesPrimo :: Integer -> Bool\r\nesPrimo x = divisores x == [1,x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 12.2. Definir la funci\u00f3n \r\n--    sumaEspeciales :: Integer -> Integer\r\n-- tal que (sumaEspeciales n) es la suma de los n\u00fameros especiales\r\n-- menores o iguales que n. Por ejemplo, \r\n--    sumaEspeciales 100  ==  401\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaEspeciales :: Integer -> Integer\r\nsumaEspeciales n = sum [x | x <- [1..n], especial x]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13.1. Un n\u00famero es muy compuesto si tiene m\u00e1s divisores que\r\n-- sus anteriores. Por ejemplo, 12 es muy compuesto porque tiene 6\r\n-- divisores (1, 2, 3, 4, 6, 12) y todos los n\u00fameros del 1 al 11 tienen\r\n-- menos de 6 divisores.  \r\n-- \r\n-- Definir la funci\u00f3n\r\n--    esMuyCompuesto :: Int -> Bool\r\n-- tal que (esMuyCompuesto x) se verifica si x es un n\u00famero muy\r\n-- compuesto. Por ejemplo,\r\n--    esMuyCompuesto 24  ==  True\r\n--    esMuyCompuesto 25  ==  False\r\n-- Calcular  el menor n\u00famero muy compuesto de 4 cifras.\r\n-- ---------------------------------------------------------------------\r\n\r\nesMuyCompuesto :: Int -> Bool\r\nesMuyCompuesto x = \r\n    and [numeroDivisores y < n | y <- [1..x-1]]\r\n    where n = numeroDivisores x\r\n\r\n-- (numeroDivisores x) es el n\u00famero de divisores de x. Por ejemplo,\r\n--    numeroDivisores 24  ==  8\r\nnumeroDivisores :: Int -> Int\r\nnumeroDivisores = length . divisores'\r\n\r\n-- (divisores' x) es la lista de los divisores de x. Por ejemplo,\r\n--    divisores 24  ==  [1,2,3,4,6,8,12,24]\r\ndivisores' :: Int -> [Int]\r\ndivisores' x = [y | y <- [1..x], mod x y == 0]\r\n\r\n-- Los primeros n\u00fameros muy compuestos son\r\n--    ghci> take 14 [x | x <- [1..], esMuyCompuesto x]\r\n--    [1,2,4,6,12,24,36,48,60,120,180,240,360,720]\r\n\r\n-- El c\u00e1lculo del menor n\u00famero muy compuesto de 4 cifras es\r\n--    ghci> head [x | x <- [1000..], esMuyCompuesto x]\r\n--    1260\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 13.2. Definir la funci\u00f3n\r\n--    muyCompuesto :: Int -> Int\r\n-- tal que (muyCompuesto n) es el n-\u00e9simo n\u00famero muy compuesto. Por\r\n-- ejemplo, \r\n--    muyCompuesto 10  ==  180\r\n-- ---------------------------------------------------------------------\r\n\r\nmuyCompuesto :: Int -> Int\r\nmuyCompuesto n =\r\n    [x | x <- [1..], esMuyCompuesto x] !! n\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14. Definir la funci\u00f3n  \r\n--     todosIguales :: Eq a => [a] -> Bool\r\n-- tal que (todosIguales xs) se verifica si los elementos de la \r\n-- lista xs son todos iguales. Por ejemplo,   \r\n--     todosIguales [1..5]    == False\r\n--     todosIguales [2,2,2]   == True\r\n--     todosIguales [\"a\",\"a\"] == True\r\n-- ---------------------------------------------------------------------\r\n\r\ntodosIguales:: Eq a => [a] -> Bool\r\ntodosIguales xs = and [x==y | (x,y) <- zip xs (tail xs)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14.1. Una lista social es una lista de n\u00fameros enteros \r\n-- x_1,...,x_n tales que para cada \u00edndice i se tiene que la suma de los \r\n-- divisores  propios de x_i es x_(i+1), para i=1,...,n\u22121 y la suma de\r\n-- los divisores propios de x_n es x_1. Por ejemplo,  \r\n-- [12496,14288,15472,14536,14264] es una lista social.\r\n-- \r\n-- Definir la funci\u00f3n \r\n--    esListaSocial :: [Int] -> Bool\r\n-- tal que (esListaSocial xs) se verifica si xs es una lista social. \r\n-- Por ejemplo, \r\n--    esListaSocial [12496, 14288, 15472, 14536, 14264] == True\r\n--    esListaSocial [12, 142, 154]                      == False\r\n-- ---------------------------------------------------------------------\r\n\r\nesListaSocial :: [Int] -> Bool\r\nesListaSocial xs = \r\n    (and [asociados x y | (x,y) <- zip xs (tail xs)]) &#038;&#038; \r\n    asociados (last xs) (head xs)\r\n    where asociados :: Int -> Int -> Bool                    \r\n          asociados x y = sum [k | k <- [1..x-1], rem x k == 0] == y\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 14.2. \u00bfExisten listas sociales de un \u00fanico elemento? Si\r\n-- crees que existen, busca una de ellas.\r\n-- ---------------------------------------------------------------------\r\n\r\nlistasSocialesUnitarias :: [[Int]]\r\nlistasSocialesUnitarias = [[n] | n <- [1..], esListaSocial [n]]\r\n\r\n-- El c\u00e1lculo es\r\n--    ghci> take 4 listasSocialesUnitarias\r\n--    [[6],[28],[496],[8128]]\r\n\r\n-- Se observa que [n] es una lista social syss n es un n\u00famero perfecto.\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 han comentado las soluciones de los ejercicios 8 a 14 de la 5\u00aa relaci\u00f3n sobre definiciones por comprensi\u00f3n. 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\/3809"}],"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=3809"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3809\/revisions"}],"predecessor-version":[{"id":3810,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3809\/revisions\/3810"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}