Menu Close

Dígitos iniciales

Definir las funciones

   digitosIniciales        :: [Int]
   graficaDigitosIniciales :: Int -> IO ()

tales que

  • digitosIniciales es la lista de los dígitos iniciales de los números naturales. Por ejemplo,
     λ> take 100 digitosIniciales
     [0,1,2,3,4,5,6,7,8,9,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,
      3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,
      6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,
      9,9,9,9,9,9,9,9,9,9]
  • (graficaDigitosIniciales n) dibuja la gráfica de los primeros n términos de la sucesión digitosIniciales. Por ejemplo, (graficaDigitosIniciales 100) dibuja
    Digitos_iniciales_100
    y (graficaDigitosIniciales 1000) dibuja
    Digitos_iniciales_1000

Soluciones

import Graphics.Gnuplot.Simple
 
-- 1ª definición
-- =============
 
digitosIniciales :: [Int]
digitosIniciales = map digitoInicial [0..]
 
digitoInicial :: Integer -> Int
digitoInicial n = read [head (show n)]
 
-- 2ª definición
-- =============
 
digitosIniciales2 :: [Int]
digitosIniciales2 = map (read . return . head . show) [0..]
 
-- 3ª definición
-- =============
 
digitosIniciales3 :: [Int]
digitosIniciales3 = map digitoInicial3 [0..]
 
digitoInicial3 :: Integer -> Int
digitoInicial3 = fromInteger . until (< 10) (`div` 10)
 
-- 4ª definición
-- =============
 
digitosIniciales4 :: [Int]
digitosIniciales4 = map (fromInteger . until (< 10) (`div` 10)) [0..]
 
-- 5ª definición
-- =============
 
digitosIniciales5 :: [Int]
digitosIniciales5 =
  0 : concat [replicate k x | k <- [10^n | n <- [0..]]
                            , x <- [1..9]]
 
-- Comparación de eficiencia
-- =========================
 
--    λ> digitosIniciales !! (2*10^6)
--    2
--    (0.46 secs, 320,145,984 bytes)
--    λ> digitosIniciales2 !! (2*10^6)
--    2
--    (0.46 secs, 320,143,288 bytes)
--    λ> digitosIniciales3 !! (2*10^6)
--    2
--    (0.17 secs, 320,139,216 bytes)
--    λ> digitosIniciales4 !! (2*10^6)
--    2
--    (0.55 secs, 320,139,248 bytes)
--    λ> digitosIniciales5 !! (2*10^6)
--    2
--    (0.12 secs, 224,158,992 bytes)
 
graficaDigitosIniciales :: Int -> IO ()
graficaDigitosIniciales n =
  plotList [ Key Nothing
           , Title ("graficaDigitosIniciales " ++ show n)
           , PNG ("Digitos_iniciales_" ++ show n ++ ".png" )
           ]
           (take n digitosIniciales)

6 soluciones de “Dígitos iniciales

  1. angruicam1
    import Graphics.Gnuplot.Simple (plotList, Attribute (Title, Key))
     
    digitosIniciales :: [Int]
    digitosIniciales =
      0 : concat ([replicate (10^n) | n <- [0..]] <*> [1,2,3,4,5,6,7,8,9])
     
    graficaDigitosIniciales :: Int -> IO ()
    graficaDigitosIniciales n =
      plotList [Title ("graficaDigitosIniciales " ++ show n),
                Key Nothing]
               (take n digitosIniciales)
  2. carbremor
    import Graphics.Gnuplot.Simple
     
    digitosIniciales :: [Int]
    digitosIniciales = map digitoInicial [0..]
     
    digitoInicial :: Int -> Int
    digitoInicial n = head (digitos n)
     
    digitos :: Int -> [Int]
    digitos n = [read [d] | d <- show n]
     
    graficaDigitosIniciales :: Int -> IO ()
    graficaDigitosIniciales n =
      plotList [ Title ("graficaDigitosIniciales" ++ show n)
               , Key Nothing]
               (take n digitosIniciales)
  3. alerodrod5
    import Graphics.Gnuplot.Simple
     
    digitosIniciales :: [Int]
    digitosIniciales = map aux [0..]
      where aux x = x `div` 10^(length (show x) - 1)
     
    graficaDigitosIniciales :: Int -> IO ()
    graficaDigitosIniciales x =
      plotList [ Key Nothing
               , Title ("Grafica Digitos Iniciales" ++ show x)]
               (take x digitosIniciales)
  4. carbremor
    import Data.Char
     
    -- Otra de forma de obtener la lista de los dígitos iniciales de los
    -- números naturales: 
    digitosIniciales :: [Int]
    digitosIniciales = map (digitoInicial) [0..]
     
    digitoInicial :: Int -> Int
    digitoInicial n = until (< 10) (`div` 10) n
     
    graficaDigitosIniciales :: Int -> IO ()
    graficaDigitosIniciales n =
      plotList [ Title ("graficaDigitosIniciales" ++ show n)
               , Key Nothing]
               (take n digitosIniciales)
     
    -- También, podemos obtener la lista de los dígitos iniciales, de la
    -- siguiente forma: 
    digitoInicial2 :: Int -> Int
    digitoInicial2 n = digitToInt (head (show n))
     
    -- En cuanto a eficiencia,
    -- λ> digitoInicial (2^65+32)
    -- 3
    -- (0.01 secs, 77,608 bytes)
    -- λ> digitoInicial1 (2^65+32)
    -- 3
    -- (0.01 secs, 72,872 bytes)
    -- λ> digitoInicial2 (2^65+32)
    -- 3
    -- (0.02 secs, 72,856 bytes)
     
    -- Vemos, que la más eficiente podría ser la última, pero tampoco hay
    -- muchas diferencias.
  5. anadebla
    import Graphics.Gnuplot.Simple
     
    digitosInicialesA5 :: [Int]
    digitosInicialesA5 = aplica digitosC [1..]
     
    digitosC :: Int -> Int
    digitosC n = head [read [x] | x <- show n]
     
    aplica :: (Int -> Int) -> [Int] -> [Int]
    aplica f xs = 0 : [f x | x <- [1..]]
     
    graficaDigitosInicialesA5 :: Int -> IO ()
    graficaDigitosInicialesA5 n =
      plotList [Title ("Digitos Iniciales" ++ show n),
                Key Nothing]
               (take n digitosInicialesA5)
  6. Chema Cortés
    digitosIniciales :: [Int]
    digitosIniciales = 0 : concat (replicate <$> iterate (10*) 1 <*> [1..9])

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.