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)