I1M2013: Ejercicios de definiciones por comprensión (3)
En la clase de hoy del curso Informática (de 1º de Grado en Matemáticas) se han comentado las soluciones de los ejercicios 15 a 19 de la 4ª relación sobre definiciones por comprensión.
Los ejercicios y sus soluciones se muestran a continuación
Haskell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
-- --------------------------------------------------------------------- -- Ejercicio 15.1. Definir la función unitarios tal (unitarios n) es -- la lista de números [n,nn, nnn, ....]. Por ejemplo. -- take 7 (unitarios 3) == [3,33,333,3333,33333,333333,3333333] -- take 3 (unitarios 1) == [1,11,111] -- --------------------------------------------------------------------- unitarios x = [x*(div (10^n-1) 9) | n <- [1 ..]] -- --------------------------------------------------------------------- -- Ejercicio 15.2. Definir la función multiplosUnitarios tal que -- (multiplosUnitarios x y n) es la lista de los n primeros múltiplos de -- x cuyo único dígito es y. Por ejemplo, -- multiplosUnitarios 7 1 2 == [111111,111111111111] -- multiplosUnitarios 11 3 5 == [33,3333,333333,33333333,3333333333] -- --------------------------------------------------------------------- multiplosUnitarios x y n = take n [z | z <- unitarios y, mod z x == 0] -- --------------------------------------------------------------------- -- Ejercicio 16. Definir la función primosEntre tal que (primosEntre x y) -- es la lista de los número primos entre x e y (ambos inclusive). Por -- ejemplo, -- primosEntre 11 44 == [11,13,17,19,23,29,31,37,41,43] -- --------------------------------------------------------------------- primosEntre x y = [n | n <- [x..y], primo n] -- (primo x) se verifica si x es primo. Por ejemplo, -- primo 30 == False -- primo 31 == True primo n = factores n == [1, n] -- --------------------------------------------------------------------- -- Ejercicio 17. Definir la función cortas tal que (cortas xs) es la -- lista de las palabras más cortas (es decir, de menor longitud) de la -- lista xs. Por ejemplo, -- ghci> cortas ["hoy", "es", "un", "buen", "dia", "de", "sol"] -- ["es","un","de"] -- --------------------------------------------------------------------- cortas xs = [x | x <- xs, length x == n] where n = minimum [length x | x <- xs] -- --------------------------------------------------------------------- -- Ejercicio 18. Un entero positivo n es libre de cuadrado si no es -- divisible por ningún m^2 > 1. Por ejemplo, 10 es libre de cuadrado -- (porque 10 = 2*5) y 12 no lo es (ya que es divisible por 2^2). -- -- Definir la función libresDeCuadrado tal que (libresDeCuadrado n) es -- la lista de los primeros n números libres de cuadrado. Por ejemplo, -- libresDeCuadrado 15 == [1,2,3,5,6,7,10,11,13,14,15,17,19,21,22] -- --------------------------------------------------------------------- libresDeCuadrado n = take n [n | n <- [1..], libreDeCuadrado n] -- (libreDeCuadrado n) se verifica si n es libre de cuadrado. Por -- ejemplo, -- libreDeCuadrado 10 == True -- libreDeCuadrado 12 == False libreDeCuadrado n = null [m | m <- [2..n], rem n (m^2) == 0] -- --------------------------------------------------------------------- -- Ejercicio 19. Definir la función masOcurrentes tal que -- (masOcurrentes xs) es la lista de los elementos de xs que ocurren el -- máximo número de veces. Por ejemplo, -- masOcurrentes [1,2,3,4,3,2,3,1,4] == [3,3,3] -- masOcurrentes [1,2,3,4,5,2,3,1,4] == [1,2,3,4,2,3,1,4] -- masOcurrentes "Salamanca" == "aaaa" -- --------------------------------------------------------------------- masOcurrentes xs = [x | x <- xs, ocurrencias x xs == m] where m = maximum [ocurrencias x xs | x <-xs] -- (ocurrencias x xs) es el número de ocurrencias de x en xs. Por -- ejemplo, -- ocurrencias 1 [1,2,3,4,3,2,3,1,4] == 2 ocurrencias x xs = length [x' | x' <- xs, x == x'] |