La sucesión del reloj astronómico de Praga
La cadena infinita "1234321234321234321...", formada por la repetición de los dígitos 123432, tiene una propiedad (en la que se basa el funcionamiento del reloj astronómico de Praga: la cadena se puede partir en una sucesión de números, de forma que la suma de los dígitos de dichos números es la serie de los números naturales, como se observa a continuación:
1, 2, 3, 4, 32, 123, 43, 2123, 432, 1234, 32123, ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
Definir la lista
reloj :: [Integer]
cuyos elementos son los términos de la sucesión anterior. Por ejemplo,
λ> take 11 reloj [1,2,3,4,32,123,43,2123,432,1234,32123]
Soluciones
import Data.List (inits, tails) import Data.Char (digitToInt) reloj :: [Int] reloj = aux [1..] (cycle "123432") where aux (n:ns) xs = read ys : aux ns zs where (ys,zs) = prefijoSuma n xs -- (prefijoSuma n xs) es el par formado por el primer prefijo de xs cuyo -- suma es n y el resto de xs. Por ejemplo, -- prefijoSuma 6 "12343" == ("123","43") prefijoSuma :: Int -> String -> (String,String) prefijoSuma n xs = head [(us,vs) | (us,vs) <- zip (inits xs) (tails xs) , sumaD us == n] -- (sumaD xs) es la suma de los dígitos de xs. Por ejemplo, -- sumaD "123" == 6 sumaD :: String -> Int sumaD = sum . map digitToInt