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
1 |
superPandigitales :: Integer -> [Integer] |
tal que (superPandigitales m) es la lista de los números super pandigitales de orden m. Por ejemplo,
1 2 3 |
take 3 (superPandigitales 3) == [11,19,21] take 3 (superPandigitales 4) == [75,99,114] take 3 (superPandigitales 5) == [978,1070,1138] |
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 |
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 = [0..b-1] `esSubconjunto` enBase b n -- (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) -- (esSubconjunto xs ys) se verifica si xs es un subconjunto de ys. Por -- ejemplo, -- esSubconjunto [1,5] [5,2,1] == True -- esSubconjunto [1,5] [5,2,3] == False esSubconjunto :: Eq a => [a] -> [a] -> Bool esSubconjunto xs ys = all (`elem` ys) xs |
3 Comentarios