Múltiplos palíndromos
Los números 545, 5995 y 15151 son los tres menores palíndromos (capicúas) que son divisibles por 109.
Definir las funciones
multiplosPalindromos :: Integer -> [Integer] multiplosPalindromosMenores :: Integer -> Integer -> [Integer]
tales que
- (multiplosPalindromos n) es la lista de los palíndromos divisibles por n. Por ejemplo,
take 5 (multiplosPalindromos 109) == [545,5995,15151,64746,74447]
- (multiplosPalindromosMenoresx n) es la lista de los palíndromos divisibles por n, menores que x. Por ejemplo,
λ> multiplosPalindromosMenores (10^5) 109 [545,5995,15151,64746,74447,79897,84148,89598,99299]
Nota: Este ejercicio está basado en el problema 655 del Proyecto Euler.
Soluciones
-- 1ª definición de multiplosPalindromos -- ===================================== multiplosPalindromos :: Integer -> [Integer] multiplosPalindromos n = [x | x <- multiplos n , esPalindromo x] -- (esPalindromo n) se verifica si n es palíndromo. Por ejemplo, -- esPalindromo 32523 == True -- esPalindromo 32533 == False esPalindromo :: Integer -> Bool esPalindromo n = reverse xs == xs where xs = show n -- (multiplos n) es la lista de los múltiplos de n. Por ejemplo, -- take 12 (multiplos 5) == [5,10,15,20,25,30,35,40,45,50,55,60] multiplos :: Integer -> [Integer] multiplos n = [n,2*n..] -- 2ª definición de multiplosPalindromos -- ===================================== multiplosPalindromos2 :: Integer -> [Integer] multiplosPalindromos2 = filter esPalindromo . multiplos -- 1ª definición de multiplosPalindromosMenores -- ============================================ multiplosPalindromosMenores :: Integer -> Integer -> [Integer] multiplosPalindromosMenores x n = takeWhile (<x) (multiplosPalindromos n) -- 2ª definición de multiplosPalindromosMenores -- ============================================ multiplosPalindromosMenores2 :: Integer -> Integer -> [Integer] multiplosPalindromosMenores2 x = takeWhile (<x) . multiplosPalindromos