Ir al contenido principal

Pandigitales tridivibles

El número 4106357289 tiene la siguientes dos propiedades:

  • es pandigital, porque tiene todos los dígitos del 0 al 9 exactamente una vez y
  • es tridivisible, porque los sucesivos subnúmeros de tres dígitos (a partir del segundo) son divisibles por los sucesivos números primos; es decir, representado por d(i) el i-ésimo dígito, se tiene
d(2)d(3)d(4)  = 106 es divisible por 2
d(3)d(4)d(5)  = 063 es divisible por 3
d(4)d(5)d(6)  = 635 es divisible por 5
d(5)d(6)d(7)  = 357 es divisible por 7
d(6)d(7)d(8)  = 572 es divisible por 11
d(7)d(8)d(9)  = 728 es divisible por 13
d(8)d(9)d(10) = 289 es divisible por 17

Definir la constante

pandigitalesTridivisibles :: [Integer]

cuyos elementos son los números pandigitales tridivisibles. Por ejemplo,

head pandigitalesTridivisibles  ==  4106357289
sum pandigitalesTridivisibles   ==  16695334890

Soluciones

import Data.List ((\\))

pandigitalesTridivisibles :: [Integer]
pandigitalesTridivisibles =
    [entero [d1,d2,d3,d4,d5,d6,d7,d8,d9,d10]
     | d2 <- [0..9]
     , d3 <- [0..9] \\ [d2]
     , d4 <- [0..9] \\ [d2,d3]
     , divisible [d2,d3,d4] 2
     , d5 <- [0..9] \\ [d2,d3,d4]
     , divisible [d3,d4,d5] 3
     , d6 <- [0..9] \\ [d2,d3,d4,d5]
     , divisible [d4,d5,d6] 5
     , d7 <- [0..9] \\ [d2,d3,d4,d5,d6]
     , d8 <- [0..9] \\ [d2,d3,d4,d5,d6,d7]
     , divisible [d6,d7,d8] 11
     , divisible [d5,d6,d7] 7
     , d9 <- [0..9] \\ [d2,d3,d4,d5,d6,d7,d8]
     , divisible [d7,d8,d9] 13
     , d10 <- [0..9] \\ [d2,d3,d4,d5,d6,d7,d8,d9]
     , divisible [d8,d9,d10] 17
     , d1 <- [1..9] \\ [d2,d3,d4,d5,d6,d7,d8,d9,d10]
    ]

-- (entero ns) es el número cuyos dígitos son ns. Por ejemplo,
--    entero [3,2,5]  ==  325
entero :: [Integer] -> Integer
entero = read . concatMap show

divisible :: [Integer] -> Integer -> Bool
divisible xs n =
    entero xs `mod` n == 0