Cuadrados mediante concatenación de cuadrados en Haskell
La semana pasada, @republicofmath planteó en twitter la siguiente pregunta
4=2^2, 9=3^2, 4||9 = 49 = 7^2. 16=4^2, 81=9^2, 16||81= 1681=41^2. Others?
donde x||y es el número obtenido concatenando las cifras de x e y. A partir de esta pregunta he elaborado la siguiente relación de ejercicios para la asignatura de Informática de 1º del Grado en Matemáticas
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 81 82 |
-- --------------------------------------------------------------------- -- Ejercicio 1.1. Definir la función -- longitud :: Integer -> Integer -- tal que (longitud x) es el número de cifras del número x. Por -- ejemplo, -- longitud 3252 ==== 4 -- Indicación: Usar las funciones floor y log tales que (floor x) es la -- parte entera de x y (log x) es el logaritmo neperiano de x. -- --------------------------------------------------------------------- longitud :: Integer -> Integer longitud x = 1 + floor ((log x') / (log 10)) where x' = fromIntegral x -- --------------------------------------------------------------------- -- Ejercicio 1.2. Definir la función -- concatenacion :: Integer -> Integer -> Integer -- tal que (concatenacion x y) es el número obtenido concatenando los -- números x e y. Por ejemplo, -- concatenacion 3252 476 == 3252476 -- --------------------------------------------------------------------- -- 1ª definición (mediante aritmética): concatenacion_1 :: Integer -> Integer -> Integer concatenacion_1 x y = floor (p*10^(longitud y)+q) where p = fromIntegral x q = fromIntegral y -- 2ª definición (mediante cadenas): concatenacion_2 :: Integer -> Integer -> Integer concatenacion_2 x y = read (show x ++ show y) -- En lo que sigue, usamos la 1ª concatenacion :: Integer -> Integer -> Integer concatenacion = concatenacion_1 -- --------------------------------------------------------------------- -- Ejercicio 1.3. Definir la función -- esCuadrado :: Integer -> Bool -- tal que (esCuadrado x) se verifica si x es un cuadrado perfecto; es -- decir, si existe un y tal que y^2 es igual a x. Por ejemplo, -- esCuadrado 16 == True -- esCuadrado 17 == False -- --------------------------------------------------------------------- esCuadrado :: Integer -> Bool esCuadrado x = y^2 == x where y = round (sqrt (fromIntegral x)) -- Otra solución, menos eficiente, es esCuadrado' :: Integer -> Bool esCuadrado' x = [y | y <- [1..x], y^2 == x] /= [] -- --------------------------------------------------------------------- -- Ejercicio 1.4. Definir la constante -- cuadrados :: [Integer] -- de forma que su valor es lista de los números que son cuadrados -- perfectos. Por ejemplo, -- take 5 cuadrados == [1,4,9,16,25] -- --------------------------------------------------------------------- cuadrados :: [Integer] cuadrados = [x | x <- [1..], esCuadrado x] -- --------------------------------------------------------------------- -- Ejercicio 1.5. Definir la constante -- cuadradosConcatenados :: [(Integer,Integer,Integer)] -- de forma que su valor es la lista de ternas (x,y,z) de tres cuadrados -- perfectos tales que z es la concatenación de x e y. Por ejemplo, -- ghci> take 10 cuadradosConcatenados -- [(4,9,49),(16,81,1681),(36,100,36100),(1,225,1225),(4,225,4225), -- (81,225,81225),(144,400,144400),(225,625,225625),(49,729,49729), -- (4,900,4900)] -- --------------------------------------------------------------------- cuadradosConcatenados :: [(Integer,Integer,Integer)] cuadradosConcatenados = [(x,y,concatenacion x y) | y <- cuadrados, x <- [1..y], esCuadrado x, esCuadrado (concatenacion x y)] |