Un número omirp es un número primo que forma un primo distinto al invertir el orden de sus dígitos.
Definir las funciones
|
esOmirp :: Integer -> Bool omirps :: [Integer] nOmirpsIntermedios :: Int -> Int |
tales que
- (esOmirp n) se verifica si n es un número omirp. Por ejemplo,
|
esOmirp 13 == True esOmirp 11 == False esOmirp 112207 == True |
- omirps es la lista de los números omirps. Por ejemplo,
|
take 15 omirps == [13,17,31,37,71,73,79,97,107,113] omirps !! 2000 == 112207 |
- (nOmirpsIntermedios n) es la cantidad de números omirps entre el n-ésimo número omirp y el obtenido al invertir el orden de sus dígitos. Por ejemplo,
|
nOmirpsIntermedios 2000 == 4750 |
Nota: Este ejercicio ha sido propuesto por Ángel Ruiz Campos.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import Data.Numbers.Primes (isPrime,primes) esOmirp :: Integer -> Bool esOmirp n = n /= rn && isPrime rn where rn = read . reverse . show $ n omirps :: [Integer] omirps = filter esOmirp primes nOmirpsIntermedios :: Int -> Int nOmirpsIntermedios n = length . filter esOmirp . takeWhile (< rx) . dropWhile (<= x) $ primes where x = omirps !! n rx = read . reverse . show $ x |
Se puede imprimir o compartir con