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


