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
1 2 |
esMagnanimo :: Integer -> Bool primosMagnanimos :: [Integer] |
tales que
- (esMagnanimo n) se verifica si n es un número magnánimo. Por ejemplo,
1 2 |
esMagnanimo 4001 == True esMagnanimo 2019 == False |
- primosMagnanimos es la lista de los números primos magnánimos. Por ejemplo,
1 2 |
λ> take 20 primosMagnanimos [2,3,5,7,11,23,29,41,43,47,61,67,83,89,101,227,229,281,401,443] |
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 |
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 |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Pensamiento
«Existe una distinción entre lo que se puede llamar un problema y lo que puede considerar un ejercicio. Este último sirve para entrenar al en alguna técnica o procedimiento, y requiere poco o ningún original. A diferencia de un ejercicio, un problema, si es apropiado para nivel, debe requerir pensamiento por parte del estudiante. Es imposible exagerar la importancia de los problemas en las matemáticas. Es por medio de los problemas que las matemáticas se desarrollan y se levantan por sí mismas. Cada nuevo descubrimiento en matemáticas es el resultado de un intento de resolver algún problema.»
5 Comentarios