Primos magnánimos
Un número magnánimo es un número tal que las sumas obtenidas insertando un "+" entre sus dígitos en cualquier posición son números primos. Por ejemplo, 4001 es un número magnánimo porque los números 4+001=5, 40+01=41 y 400+1=401 son primos.
Definir las funciones
esMagnanimo :: Integer -> Bool primosMagnanimos :: [Integer]
tales que
- (esMagnanimo n) se verifica si n es un número magnánimo. Por ejemplo,
esMagnanimo 4001 == True esMagnanimo 2019 == False
- primosMagnanimos es la lista de los números primos magnánimos. Por ejemplo,
λ> take 20 primosMagnanimos [2,3,5,7,11,23,29,41,43,47,61,67,83,89,101,227,229,281,401,443]
Soluciones
import Data.Numbers.Primes (isPrime, primes) esMagnanimo :: Integer -> Bool esMagnanimo n = all isPrime [x + y | (x, y) <- divisionesNumero n] -- (divisionesNumero n) es la lista de las divisiones de n en dos -- números. Por ejemplo, -- divisionesNumero 1234 == [(1,234),(12,34),(123,4)] -- divisionesNumero 234 == [(2,34),(23,4)] -- divisionesNumero 34 == [(3,4)] -- divisionesNumero 4 == [] divisionesNumero :: Integer -> [(Integer,Integer)] divisionesNumero n = [(read xs, read ys) | (xs,ys) <- divisiones (show n)] -- (divisiones xs) es la lista de las divisiones de xs en dos listas no -- vacías. Por ejemplo, -- divisiones "abcd" == [("a","bcd"),("ab","cd"),("abc","d")] -- divisiones "bcd" == [("b","cd"),("bc","d")] -- divisiones "cd" == [("c","d")] -- divisiones "d" == [] -- divisiones "" == [] divisiones :: [a] -> [([a],[a])] divisiones [] = [] divisiones [_] = [] divisiones (x:xs) = ([x],xs) : [(x:is,ds) | (is,ds) <- divisiones xs] primosMagnanimos :: [Integer] primosMagnanimos = filter esMagnanimo primes