Sumas digitales de primos consecutivos
Definir la función
1 |
primosConsecutivosConSumasDigitalesPrimas :: Int -> [[Integer]] |
tal que (primosConsecutivosConSumasDigitalesPrimas k) es la sucesión de listas de k primos consecutivos tales que las sumas ordenadas de sus dígitos también son primos consecutivos. Por ejemplo,
1 2 3 4 5 6 7 8 |
λ> take 5 (primosConsecutivosConSumasDigitalesPrimas 2) [[2,3],[3,5],[5,7],[41,43],[43,47]] λ> take 5 (primosConsecutivosConSumasDigitalesPrimas 3) [[2,3,5],[3,5,7],[41,43,47],[191,193,197],[193,197,199]] λ> take 4 (primosConsecutivosConSumasDigitalesPrimas 4) [[2,3,5,7],[3,5,7,11],[191,193,197,199],[821,823,827,829]] λ> primosConsecutivosConSumasDigitalesPrimas 4 !! 50 [129197,129209,129221,129223] |
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 |
import Data.Char (digitToInt) import Data.List (isPrefixOf, sort, tails) import Data.Numbers.Primes primosConsecutivosConSumasDigitalesPrimas :: Int -> [[Integer]] primosConsecutivosConSumasDigitalesPrimas k = [xs | xs <- map (take k) (tails primes), primosConsecutivos (sort (map sumaDigital xs))] -- (digitos n) es la lista de los dígitos de n. Por ejemplo, -- digitos 325 == [3,2,5] digitos :: Integer -> [Integer] digitos n = [read [d] | d <- show n] -- (sumaDigital n) es la suma de los dígitos de n. Por ejemplo, -- sumaDigital 325 == 10 sumaDigital :: Integer -> Integer sumaDigital = sum . digitos -- (primosConsecutivos xs) se verifica si xs es una lista de primos -- consecutivos. Por ejemplo, -- primosConsecutivos [5,7,11] == True -- primosConsecutivos [5,7,17] == False primosConsecutivos :: [Integer] -> Bool primosConsecutivos (x:xs) = isPrefixOf (x:xs) (dropWhile (<x) primes) |
Referencias
Basado en el artículo DigitSums of some consecutive primes del blog Fun With Num3ers.
2 Comentarios