{"id":2272,"date":"2012-11-06T17:44:30","date_gmt":"2012-11-06T17:44:30","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=2272"},"modified":"2013-03-08T05:47:40","modified_gmt":"2013-03-08T05:47:40","slug":"i1m2012-ejercicios-de-definiciones-por-comprension-5","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-de-definiciones-por-comprension-5\/","title":{"rendered":"I1M2012: 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-12\">Inform\u00e1tica (de 1\u00ba de Grado en Matem\u00e1ticas)<\/a> se han comentado las soluciones de los ejercicios 3 a 8 de la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/ejerciciosI1M2012G2\/images\/a\/a9\/Rel_5.hs\">5\u00aa relaci\u00f3n<\/a> 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 3. El producto escalar de dos listas de enteros xs y ys de\r\n-- longitud n viene dado por la suma de los productos de los elementos\r\n-- correspondientes. \r\n-- \r\n-- Definir por comprensi\u00f3n la funci\u00f3n \r\n--    productoEscalar :: [Int] -> [Int] -> Int\r\n-- tal que (productoEscalar xs ys) es el producto escalar de las listas\r\n-- xs e ys. Por ejemplo,\r\n--    productoEscalar [1,2,3] [4,5,6]  ==  32\r\n-- ---------------------------------------------------------------------\r\n\r\nproductoEscalar :: [Int] -> [Int] -> Int\r\nproductoEscalar xs ys = sum [x*y | (x,y) <- zip xs ys]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir, por comprensi\u00f3n, la funci\u00f3n\r\n--    sumaConsecutivos :: [Int] -> [Int]\r\n-- tal que (sumaConsecutivos xs) es la suma de los pares de elementos\r\n-- consecutivos de la lista xs. Por ejemplo,\r\n--    sumaConsecutivos [3,1,5,2]  ==  [4,6,7]\r\n--    sumaConsecutivos [3]        ==  []\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaConsecutivos :: [Int] -> [Int]\r\nsumaConsecutivos xs = [x+y | (x,y) <- zip xs (tail xs)]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. En el tema se ha definido la funci\u00f3n \r\n--    posiciones :: Eq a => a -> [a] -> [Int]\r\n-- tal que (posiciones x xs) es la lista de las posiciones ocupadas por\r\n-- el elemento x en la lista xs. Por ejemplo,\r\n--    posiciones 5 [1,5,3,5,5,7]  ==  [1,3,4]\r\n-- \r\n-- Definir, usando la funci\u00f3n busca (definida en el tema 5), la funci\u00f3n\r\n--    posiciones' :: Eq a => a -> [a] -> [Int]\r\n-- tl que posiciones' sea equivalente a posiciones.\r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n de posiciones es\r\nposiciones :: Eq a => a -> [a] -> [Int]\r\nposiciones x xs = \r\n    [i | (x',i) <- zip xs [0..n], x == x']\r\n    where n = length xs - 1\r\n\r\n-- La definici\u00f3n de busca es\r\nbusca :: Eq a => a -> [(a, b)] -> [b]\r\nbusca c t = [v | (c', v) <- t, c' == c]\r\n\r\n-- La redefinici\u00f3n de posiciones es\r\nposiciones' :: Eq a => a -> [a] -> [Int]\r\nposiciones' x xs = busca x (zip xs [0..])\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Los polinomios pueden representarse de forma dispersa o\r\n-- densa. Por ejemplo, el polinomio 6x^4-5x^2+4x-7 se puede representar\r\n-- de forma dispersa por [6,0,-5,4,-7] y de forma densa por\r\n-- [(4,6),(2,-5),(1,4),(0,-7)].  \r\n-- \r\n-- Definir la funci\u00f3n \r\n--    densa :: [Int] -> [(Int,Int)]\r\n-- tal que (densa xs) es la representaci\u00f3n densa del polinomio cuya\r\n-- representaci\u00f3n dispersa es xs. Por ejemplo, \r\n--   densa [6,0,-5,4,-7]  ==  [(4,6),(2,-5),(1,4),(0,-7)]\r\n--   densa [6,0,0,3,0,4]  ==  [(5,6),(2,3),(0,4)]\r\n-- ---------------------------------------------------------------------\r\n\r\ndensa :: [Int] -> [(Int,Int)]\r\ndensa xs = [(x,y) | (x,y) <- zip [n-1,n-2..0] xs, y \/= 0]\r\n    where n = length xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. La funci\u00f3n \r\n--    pares :: [a] -> [b] -> [(a,b)]\r\n-- definida por\r\n--    pares xs ys = [(x,y) | x <- xs, y <- ys]\r\n-- toma como argumento dos listas y devuelve la listas de los pares con\r\n-- el primer elemento de la primera lista y el segundo de la\r\n-- segunda. Por ejemplo,\r\n--    ghci> pares [1..3] [4..6]\r\n--    [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]\r\n-- \r\n-- Definir, usando dos listas por comprensi\u00f3n con un generador cada una,\r\n-- la funci\u00f3n \r\n--    pares' :: [a] -> [b] -> [(a,b)]\r\n-- tal que pares' sea equivalente a pares.\r\n-- \r\n-- Indicaci\u00f3n: Utilizar la funci\u00f3n predefinida concat y encajar una\r\n-- lista por comprensi\u00f3n dentro de la otra. \r\n-- ---------------------------------------------------------------------\r\n\r\n-- La definici\u00f3n de pares es\r\npares :: [a] -> [b] -> [(a,b)]\r\npares xs ys = [(x,y) | x <- xs, y <- ys]\r\n\r\n-- La redefinici\u00f3n de pares es\r\npares' :: [a] -> [b] -> [(a,b)]\r\npares' xs ys = concat [[(x,y) | y <- ys] | x <- xs]\r\n\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<\/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 3 a 8 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":"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":[1],"tags":[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\/2272"}],"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=2272"}],"version-history":[{"count":3,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2272\/revisions"}],"predecessor-version":[{"id":2758,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/2272\/revisions\/2758"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=2272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=2272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=2272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}