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)] |