Un problema de las olimpiadas rusas en Haskell
En el blog Números y algo más plantean hoy un problema de las olimpiadas rusas cuyo enunciado es el siguiente
Si escribimos todos los números enteros empezando por el uno, uno al lado del otro (o sea, 1234567891011121314…), ¿qué dígito ocupa la posición 206788?
Basándome en este problema he escrito la siguiente relación de ejercicios de Haskell para la asignatura de Informática de 1º del Grado en Matemáticas como ejemplo de uso de cadenas infinitas.
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 |
-- --------------------------------------------------------------------- -- Librería auxiliar -- -- --------------------------------------------------------------------- import Data.Char -- --------------------------------------------------------------------- -- Ejercicio 1. Definir la constante -- cadenaDeNaturales :: String -- tal que cadenaDeNaturales es la cadena obtenida escribiendo todos los -- números enteros empezando por el uno. Por ejemplo, -- take 19 cadenaDeNaturales == "1234567891011121314" -- --------------------------------------------------------------------- cadenaDeNaturales :: String cadenaDeNaturales = concat [show n | n <- [1..]] -- --------------------------------------------------------------------- -- Ejercicio 2. Definir la función -- digito :: Int -> Int -- tal que (digito n) es el dígito que ocupa la posición n en la cadena -- de los naturales (el número de las posiciones empieza por 1). Por -- ejemplo, -- digito 10 == 1 -- digito 11 == 0 -- --------------------------------------------------------------------- digito :: Int -> Int digito n = digitToInt (cadenaDeNaturales !! (n-1)) -- --------------------------------------------------------------------- -- Ejercicio 3. Calcular el dígito que ocupa la posición 206788 en la -- cadena de los naturales. -- --------------------------------------------------------------------- -- El cálculo es -- ghci> digito 206788 -- 7 |