Sucesión de trazas de dígitos de pi
El fichero Digitos_de_pi.txt contiene el número pi con un millón de decimales; es decir,
1 |
3.1415926535897932384626433832 ... 83996346460422090106105779458151 |
Las matrices de orden 1×1, 2×2, …, 5×5 formadas por los primeros dígitos de pi son
1 2 3 4 5 |
( 3 ) ( 3 1 ) ( 3 1 4 ) ( 3 1 4 1 ) ( 3 1 4 1 5 ) ( 4 1 ) ( 1 5 9 ) ( 5 9 2 6 ) ( 9 2 6 5 3 ) ( 2 6 5 ) ( 5 3 5 8 ) ( 5 8 9 7 9 ) ( 9 7 9 3 ) ( 3 2 3 8 4 ) ( 6 2 6 4 3 ) |
y sus trazas (es decir, sumas de los elementos de la diagonal principal) son 3, 4, 13, 20 y 25, respectivamente.
Definir la función
1 |
trazas :: Int -> IO [Int] |
tal que (trazas n) es la lista de las trazas de las matrices de orden 1×1, 2×2, 3×3, …, nxn formadas por los primeros dígitos de pi. Por ejemplo,
1 2 3 4 5 6 7 |
λ> trazas 20 [3,4,13,20,25,30,19,32,41,59,62,64,58,75,62,60,80,99,78,108] λ> ts <- trazas 1000 λ> maximum ts 4644 λ> maximum <$> trazas 1000 4644 |
Soluciones
1 2 3 4 5 6 7 8 |
import Data.Char (digitToInt) import Data.Matrix (fromList, trace) trazas :: Int -> IO [Int] trazas n = do (d:_:ds) <- readFile "Digitos_de_pi.txt" let xs = map digitToInt (d:ds) return [trace (fromList k k xs) | k <- [1..n]] |
He modificado el archivo Dígitos_de_pi.txt para que aparezca todos los dígitos de pi sin el punto . que separa el 3 del 1 al principio: 3.14159… Es decir: 314159…