Pandigitales múltiplos de un número por una lista de números
Un número pandigital es un número que contiene todos los dígitos del 1 al 9 sólo una vez. Por ejemplo, 192384576 es un número pandigital.
El producto de un número natural x por una lista de números naturales ys es el número obtenido concatenando los productos de x por cada uno de los elementos de ys. Por ejemplo, el producto de 2 por [3,2,5] es 6410.
Un número pandigital x es un múltiplo si existe un y y un n > 1 tales que x es el producto de y por [1,2,3,…,n]. Por ejemplo, 192384576 es un pandigital múltiplo ya que
1 2 3 |
192 × 1 = 192 192 × 2 = 384 192 × 3 = 576 |
por tanto, 192384576 es el producto de 192 por [1,2,3]. Otro pandgital múltiplo es el 918273645 ya que es el producto de 9 por [1,2,3,4,5].
Definir la sucesión
1 |
pandigitalesMultiplos :: [Integer] |
tal que sus elementos son los números pandigitales múltiplos. Por ejemplo,
1 2 |
ghci> take 5 pandigitalesMultiplos [123456789,192384576,219438657,273546819,327654981] |
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 31 32 33 34 35 36 37 38 39 40 41 42 |
import Data.List (sort) pandigitalesMultiplos :: [Integer] pandigitalesMultiplos = sort [y | x <- [1..a], y <- productosCon9Digitos x, esPandigital y] where a = head [x | x <- [1..], producto x [1,2] > 987654321] -- (productosCon9Digitos x) es la lista de los productos de x por una -- lista [1,2,...,n] (con n > 1) que tienen 9 dígitos, Por ejemplo, -- productosCon9Digitos 3 == [369121518] -- productosCon9Digitos 2 == [] productosCon9Digitos :: Integer -> [Integer] productosCon9Digitos x | numeroDeDigitos z == 9 = [z] | otherwise = [] where z = head [y | n <- [2..], let y = producto x [1..n], numeroDeDigitos y >= 9] -- (producto x ys) es el producto de x por ys. Por ejemplo, -- producto 2 [3,2,5] == 6410 producto :: Integer -> [Integer] -> Integer producto x = read . concatMap (show . (x*)) -- (numeroDeDigitos x) es el número de dígitos de x. Por ejemplo, -- numeroDeDigitos 425 == 3 numeroDeDigitos :: Integer -> Int numeroDeDigitos = length . show -- (esPandigital x) se verifica si x es pandigital. Por ejemplo, -- esPandigital 192384576 == True -- esPandigital 192314576 == False -- esPandigital 1923145761 == False esPandigital :: Integer -> Bool esPandigital n = sort (show n) == "123456789" -- La lista de los pandigitales múltiplos se calcula por -- ghci> pandigitalesMultiplos -- [123456789, 192384576, 219438657, 273546819, 327654981, 672913458, -- 679213584, 692713854, 726914538, 729314586, 732914658, 769215384, -- 792315846, 793215864, 918273645, 926718534, 927318546, 932718654] |
4 Comentarios