{"id":3779,"date":"2013-10-25T16:36:52","date_gmt":"2013-10-25T14:36:52","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3779"},"modified":"2013-10-29T06:38:50","modified_gmt":"2013-10-29T05:38:50","slug":"i1m2013-ejercicios-de-definiciones-por-comprension-4","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-ejercicios-de-definiciones-por-comprension-4\/","title":{"rendered":"I1M2013: Ejercicios de definiciones por comprensi\u00f3n (4)"},"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 dos \u00faltimos ejercicios de la 4\u00aa relaci\u00f3n y de los 7 primeros de la 5\u00aa relaci\u00f3n. Ambas son sobre definiciones por comprensi\u00f3n. <\/p>\n<p>Los ejercicios de la 4\u00aa relaci\u00f3n y sus soluciones se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 20.1. Definir la funci\u00f3n numDiv tal que (numDiv x) es el\r\n-- n\u00famero de divisores del n\u00famero natural x. Por ejemplo, \r\n--    numDiv 11 == 2 \r\n--    numDiv 12 == 6 \r\n-- ---------------------------------------------------------------------\r\n\r\nnumDiv x = length [n | n <- [1..x], rem x n == 0]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 20.2. Definir la funci\u00f3n entre tal que (entre a b c) es la\r\n-- lista de los naturales entre a y b con, al menos, c divisores. Por\r\n-- ejemplo,  \r\n--    entre 11 16 5 == [12, 16]\r\n-- ---------------------------------------------------------------------\r\n\r\nentre a b c = [x | x <- [a..b], numDiv x >= c]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 21.1. Definir la funci\u00f3n conPos tal que (conPos xs) es la\r\n-- lista obtenida a partir de xs especificando las posiciones de sus\r\n-- elementos. Por ejemplo, \r\n--    conPos [1,5,0,7] == [(1,0),(5,1),(0,2),(7,3)]\r\n-- ---------------------------------------------------------------------\r\n\r\nconPos xs = zip xs [0..]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 21.2. Definir la funci\u00f3n tal que (pares cs) es la cadena\r\n-- formada por los caracteres en posici\u00f3n par de cs. Por ejemplo, \r\n--    pares \"el cielo sobre berlin\" == \"e il or eln\"\r\n-- ---------------------------------------------------------------------\r\n\r\npares cs = [c | (c,n) <- conPos cs, even n]\r\n<\/pre>\n<p>Los ejercicios de la 5\u00aa relaci\u00f3n y sus soluciones se muestran a continuaci\u00f3n<\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.1. Una terna (x,y,z) de enteros positivos es pitag\u00f3rica\r\n-- si x^2 + y^2 = z^2. Usando una lista por comprensi\u00f3n, definir la\r\n-- funci\u00f3n \r\n--    pitagoricas :: Int -> [(Int,Int,Int)]\r\n-- tal que (pitagoricas n) es la lista de todas las ternas pitag\u00f3ricas\r\n-- cuyas componentes est\u00e1n entre 1 y n. Por ejemplo, \r\n--    pitagoricas 10  ==  [(3,4,5),(4,3,5),(6,8,10),(8,6,10)]\r\n-- ---------------------------------------------------------------------\r\n\r\npitagoricas :: Int -> [(Int,Int,Int)]\r\npitagoricas n = [(x,y,z) | x <- [1..n],\r\n                           y <- [1..n],\r\n                           z <- [1..n],\r\n                           x^2 + y^2 == z^2]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.2. Definir la funci\u00f3n \r\n--    numeroDePares :: (Int,Int,Int) -> Int\r\n-- tal que (numeroDePares t) es el n\u00famero de elementos pares de la terna\r\n-- t. Por ejemplo,\r\n--    numeroDePares (3,5,7)  ==  0\r\n--    numeroDePares (3,6,7)  ==  1\r\n--    numeroDePares (3,6,4)  ==  2\r\n--    numeroDePares (4,6,4)  ==  3\r\n-- ---------------------------------------------------------------------\r\n\r\nnumeroDePares :: (Int,Int,Int) -> Int\r\nnumeroDePares (x,y,z) = length [1 | n <- [x,y,z], even n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.3. Definir la funci\u00f3n\r\n--    conjetura :: Int -> Bool\r\n-- tal que (conjetura n) se verifica si todas las ternas pitag\u00f3ricas\r\n-- cuyas componentes est\u00e1n entre 1 y n tiene un n\u00famero impar de n\u00fameros\r\n-- pares. Por ejemplo,\r\n--    conjetura 10  ==  True\r\n-- ---------------------------------------------------------------------\r\n\r\nconjetura :: Int -> Bool\r\nconjetura n = and [odd (numeroDePares t) | t <- pitagoricas n]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1.4. Demostrar la conjetura para todas las ternas\r\n-- pitag\u00f3ricas. \r\n-- ---------------------------------------------------------------------\r\n\r\n-- Sea (x,y,z) una terna pitag\u00f3rica. Entonces x^2+y^2=z^2. Pueden darse\r\n-- 4 casos:\r\n-- \r\n-- Caso 1: x e y son pares. Entonces, x^2, y^2 y z^2 tambi\u00e9n lo\r\n-- son. Luego el n\u00famero de componentes pares es 3 que es impar.\r\n-- \r\n-- Caso 2: x es par e y es impar. Entonces, x^2 es par, y^2 es impar y\r\n-- z^2 es impar. Luego el n\u00famero de componentes pares es 1 que es impar.\r\n-- \r\n-- Caso 3: x es impar e y es par. An\u00e1logo al caso 2.\r\n-- \r\n-- Caso 4: x e y son impares. Entonces, x^2 e y^2 tambi\u00e9n son impares y\r\n-- z^2 es par. Luego el n\u00famero de componentes pares es 1 que es impar.\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.1. (Problema 9 del Proyecto Euler). Una terna pitag\u00f3rica\r\n-- es una terna de n\u00fameros naturales (a,b,c) tal que a<b<c y\r\n-- a^2+b^2=c^2. Por ejemplo (3,4,5) es una terna pitag\u00f3rica. \r\n-- \r\n-- Definir la funci\u00f3n \r\n--    ternasPitagoricas :: Integer -> [[Integer]]\r\n-- tal que (ternasPitagoricas x) es la lista de las ternas pitag\u00f3ricas\r\n-- cuya suma es x. Por ejemplo,\r\n--    ternasPitagoricas 12  ==  [(3,4,5)]\r\n--    ternasPitagoricas 60  ==  [(10,24,26),(15,20,25)]\r\n-- ---------------------------------------------------------------------\r\n\r\nternasPitagoricas :: Integer -> [(Integer,Integer,Integer)]\r\nternasPitagoricas x = [(a,b,c) | a <- [1..x], \r\n                                 b <- [a+1..x], \r\n                                 c <- [x-a-b], \r\n                                 a^2 + b^2 == c^2]\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2.2. Definir la constante euler9 tal que euler9 es producto\r\n-- abc donde (a,b,c) es la \u00fanica terna pitag\u00f3rica tal que a+b+c=1000. \r\n-- Calcular el valor de euler9.\r\n-- ---------------------------------------------------------------------\r\n\r\neuler9 = a*b*c\r\n    where (a,b,c) = head (ternasPitagoricas 1000)\r\n\r\n-- El c\u00e1lculo del valor de euler9 es\r\n--    ghci> euler9\r\n--    31875000\r\n\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<\/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 dos \u00faltimos ejercicios de la 4\u00aa relaci\u00f3n y de los 7 primeros de la 5\u00aa relaci\u00f3n. Ambas son sobre definiciones por comprensi\u00f3n. Los ejercicios de la 4\u00aa relaci\u00f3n y sus soluciones se muestran a&#8230;<\/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\/3779"}],"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=3779"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3779\/revisions"}],"predecessor-version":[{"id":3781,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3779\/revisions\/3781"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}