Rotaciones divisibles por 8
Las rotaciones de 928160 son 928160, 281609, 816092, 160928, 609281 y 92816 de las que 3 son divisibles por 8 (928160, 160928 y 92816).
Definir la función
1 |
nRotacionesDivisiblesPor8 :: Integer -> Int |
tal que (nRotacionesDivisiblesPor8 x) es el número de rotaciones de x divisibles por 8. Por ejemplo,
1 2 3 |
nRotacionesDivisiblesPor8 928160 == 3 nRotacionesDivisiblesPor8 43262488612 == 4 nRotacionesDivisiblesPor8 (read (take (10^4) (cycle "248"))) == 6666 |
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 |
-- 1ª definición -- ============= nRotacionesDivisiblesPor8 :: Integer -> Int nRotacionesDivisiblesPor8 x = length [y | y <- rotaciones x , y `mod` 8 == 0] -- rotaciones 1234 == [1234,2341,3412,4123] rotaciones :: Integer -> [Integer] rotaciones x = [read ys | ys <- rotacionesLista xs] where xs = show x -- rotacionesLista "abcd" == ["abcd","bcda","cdab","dabc"] rotacionesLista :: [a] -> [[a]] rotacionesLista xs = [zs ++ ys | k <- [0 .. length xs - 1] , let (ys,zs) = splitAt k xs] -- 2ª definición -- ============= nRotacionesDivisiblesPor8b :: Integer -> Int nRotacionesDivisiblesPor8b x = length [y | y <- tresDigitosConsecutivos x , y `mod` 8 == 0] -- tresDigitosConsecutivos 1234 == [123,234,341,412] tresDigitosConsecutivos :: Integer -> [Integer] tresDigitosConsecutivos x = [read (take 3 ys) | ys <- rotacionesLista (show x)] -- Comparación de eficiencia -- ========================= -- λ> nRotacionesDivisiblesPor8 (read (take (3*10^3) (cycle "248"))) -- 2000 -- (3.59 secs, 4,449,162,144 bytes) -- λ> nRotacionesDivisiblesPor8b (read (take (3*10^3) (cycle "248"))) -- 2000 -- (0.48 secs, 593,670,656 bytes) |
Buenas, considerando como tú que si un número de tres cifras o más es divisible por ocho si sus tres últimas cifras lo son, se me ocurre también esta función:
La demostración de esta propiedad (y algunas más) la podéis encontrar en el siguiente enlace: Criterios de divisibilidad.
Podemos modificar de la siguiente forma la función nRotacionesDivisiblesPor8 para trabajar sin argumentos:
Se puede seguir eliminando argumentos ya que
es equivalente a