Números dorados
Los dígitos del número 2375 se pueden separar en dos grupos de igual tamaño ([7,2] y [5,3]) tales que para los correspondientes números (72 y 53) se verifique que la diferencia de sus cuadrados sea el número original (es decir, 72^2 – 53^2 = 2375).
Un número x es dorado si sus dígitos se pueden separar en dos grupos de igual tamaño tales que para los correspondientes números (a y b) se verifique que la diferencia de sus cuadrados sea el número original (es decir, b^2 – a^2 = x).
Definir la función
1 |
esDorado :: Integer -> Bool |
tales que (esDorado x) se verifica si x es un número dorado. Por
ejemplo,
1 2 3 4 |
λ> esDorado 2375 True λ> take 5 [x | x <- [1..], esDorado x] [48,1023,1404,2325,2375] |
Soluciones
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 |
import Data.List (permutations) esDorado :: Integer -> Bool esDorado x = even (length (show x)) && or [b^2 - a^2 == x | (a,b) <- particionesNumero x] -- (particiones xs) es la lista de las formas de dividir xs en dos -- partes de igual longitud (se supone que xs tiene un número par de -- elementos). Por ejemplo, -- λ> particiones "abcd" -- [("ab","cd"),("ba","cd"),("cb","ad"),("bc","ad"),("ca","bd"), -- ("ac","bd"),("dc","ba"),("cd","ba"),("cb","da"),("db","ca"), -- ("bd","ca"),("bc","da"),("da","bc"),("ad","bc"),("ab","dc"), -- ("db","ac"),("bd","ac"),("ba","dc"),("da","cb"),("ad","cb"), -- ("ac","db"),("dc","ab"),("cd","ab"),("ca","db")] particiones :: [a] -> [([a],[a])] particiones xs = [splitAt m ys | ys <- permutations xs] where m = length xs `div` 2 -- (particionesNumero n) es la lista de las formas de dividir n en dos -- partes de igual longitud (se supone que n tiene un número par de -- dígitos). Por ejemplo, -- λ> particionesNumero 1234 -- [(12,34),(21,34),(32,14),(23,14),(31,24),(13,24),(43,21),(34,21), -- (32,41),(42,31),(24,31),(23,41),(41,23),(14,23),(12,43),(42,13), -- (24,13),(21,43),(41,32),(14,32),(13,42),(43,12),(34,12),(31,42)] particionesNumero :: Integer -> [(Integer,Integer)] particionesNumero n = [(read xs,read ys) | (xs,ys) <- particiones (show n)] |
Parece un poco forzado decir que el nº 1 tiene 2 dígitos (por eso de que
32^2 - 1^2 = 1023
). Si nos ceñimos a la definición: