Ir al contenido principal

Números super pandigitales

Un entero positivo n es pandigital en base b si su expresión en base b contiene todos los dígitos de 0 a b-1 al menos una vez. Por ejemplo,

  • el 2 es pandigital en base 2 porque 2 en base 2 es 10,
  • el 11 es pandigital en base 3 porque 11 en base 3 es 102 y
  • el 75 es pandigital en base 4 porque 75 en base 4 es 1023.

Un número n es super pandigital de orden m si es pandigital en todas las bases desde 2 hasta m. Por ejemplo, 978 es super pandigital de orden 5 pues

  • en base 2 es: 1111010010
  • en base 3 es: 1100020
  • en base 4 es: 33102
  • en base 5 es: 12403

Definir la función

superPandigitales :: Integer -> [Integer]

tal que (superPandigitales m) es la lista de los números super pandigitales de orden m. Por ejemplo,

take 3 (superPandigitales 3) == [11,19,21]
take 3 (superPandigitales 4) == [75,99,114]
take 3 (superPandigitales 5) == [978,1070,1138]

Soluciones

superPandigitales :: Integer -> [Integer]
superPandigitales m =
  [n | n <- [1..]
     , and [pandigitalBase b n | b <- [2..m]]]

-- (pandigitalBase b n) se verifica si n es pandigital en base la base
-- b. Por ejemplo,
--    pandigitalBase 4 75  ==  True
--    pandigitalBase 4 76  ==  False
pandigitalBase :: Integer -> Integer -> Bool
pandigitalBase b n = sort (nub (enBase b n)) == [0..b-1]

-- (enBase b n) es la lista de los dígitos de n en base b. Por ejemplo,
--    enBase 4 75  ==  [3,2,0,1]
--    enBase 4 76  ==  [0,3,0,1]
enBase :: Integer -> Integer -> [Integer]
enBase b n | n < b     = [n]
           | otherwise = n `mod` b : enBase b (n `div` b)