Medias 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 |
Definir las funciones
1 2 |
mediasDigitosDePi :: IO [Double] graficaMediasDigitosDePi :: Int -> IO () |
tales que
- mediasDigitosDePi es la sucesión cuyo n-ésimo elemento es la media de los n primeros dígitos de pi. Por ejemplo,
1 2 3 4 5 6 7 |
λ> xs <- mediasDigitosDePi λ> take 5 xs [1.0,2.5,2.0,2.75,4.0] λ> take 10 xs [1.0,2.5,2.0,2.75,4.0,3.6666666666666665,4.0,4.125,4.0,4.1] λ> take 10 <$> mediasDigitosDePi [1.0,2.5,2.0,2.75,4.0,3.6666666666666665,4.0,4.125,4.0,4.1] |
- (graficaMediasDigitosDePi n) dibuja la gráfica de los n primeros términos de mediasDigitosDePi. Por ejemplo,
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 |
import Data.Char (digitToInt) import Data.List (genericLength, inits, tails) import Graphics.Gnuplot.Simple ( Attribute (Key, PNG) , plotList ) -- Definición de mediasDigitosDePi -- =============================== mediasDigitosDePi :: IO [Double] mediasDigitosDePi = do (_:_:ds) <- readFile "Digitos_de_pi.txt" return (medias (digitos ds)) -- (digitos cs) es la lista de los digitos de cs. Por ejempplo, -- digitos "1415926535" == [1,4,1,5,9,2,6,5,3,5] digitos :: String -> [Int] digitos = map digitToInt -- (medias xs) es la lista de las medias de los segmentos iniciales de -- xs. Por ejemplo, -- λ> medias [1,4,1,5,9,2,6,5,3,5] -- [1.0,2.5,2.0,2.75,4.0,3.6666666666666665,4.0,4.125,4.0,4.1] medias :: [Int] -> [Double] medias xs = map media (tail (inits xs)) -- (media xs) es la media aritmética de xs. Por ejemplo, -- media [1,4,1,5,9] == 4.0 media :: [Int] -> Double media xs = fromIntegral (sum xs) / genericLength xs -- Definición de graficaMediasDigitosDePi -- ====================================== graficaMediasDigitosDePi :: Int -> IO () graficaMediasDigitosDePi n = do xs <- mediasDigitosDePi plotList [ Key Nothing , PNG ("Medias_de_digitos_de_pi_" ++ show n ++ ".png") ] (take n xs) |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Pensamiento
Es el mejor de los buenos
quien sabe que en esta vida
todo es cuestión de medida:
un poco más, algo menos.Antonio Machado