Menu Close

Números apocalípticos

Un número apocalíptico es aquel número natural n tal que 2^n contiene la secuencia 666.

Definir las funciones

   esApocaliptico           :: Integer -> Bool
   apocalipticos            :: [Integer]
   mayorNoApocalipticoMenor :: Integer -> Maybe Integer
   grafica                  :: Integer -> IO ()

tales que

  • (esApocaliptico n) se verifica si n es un número apocalíptico. Por ejemplo,
     esApocaliptico 666    ==  True
     esApocaliptico 29784  ==  False
  • apocalipticos es la lista de los números apocalípticos. Por ejemplo,
     take 9 apocalipticos  ==  [157,192,218,220,222,224,226,243,245]
     apocalipticos !! 55   ==  666
  • (mayorNoApocalipticoMenor n) es justo el mayor número no apocalíptico menor que n. Por ejemplo,
     mayorNoApocalipticoMenor  40000  ==  Just 29784
     mayorNoApocalipticoMenor  29784  ==  Just 26667
  • (grafica n) dibuja las gráficas de los n primeros términos de la sucesión de los números apocalípticos junto con los de la sucesión a(n) = 3715+n. Por ejemplo, (grafica 3000) dibuja
    Numeros_apocalipticos_3000
    y (grafica 30000) dibuja
    Numeros_apocalipticos_30000

Nota: Este ejercicio ha sido propuesto por Ángel Ruiz Campos.

Soluciones

import Data.List (isInfixOf, find, genericTake)
import Graphics.Gnuplot.Simple
 
esApocaliptico :: Integer -> Bool
esApocaliptico = isInfixOf "666" . show . (2^)
 
apocalipticos :: [Integer]
apocalipticos = filter esApocaliptico [1..]
 
mayorNoApocalipticoMenor :: Integer -> Maybe Integer
mayorNoApocalipticoMenor n = find (not . esApocaliptico) [n-1,n-2..1]
 
grafica :: Integer -> IO ()
grafica n = 
  plotLists [ Key Nothing
            , PNG ("Numeros_apocalipticos_" ++ show n ++ ".png")
            ]
            [ genericTake n apocalipticos
            , [3715..3715+n-1] ]

5 soluciones de “Números apocalípticos

  1. alerodrod5
     
    import Graphics.Gnuplot.Simple
    esApocaliptico :: Integer -> Bool
    esApocaliptico x = contiene (cifras (2^x))
     
    contiene :: [Int] -> Bool
    contiene (x:y:z:xs) | x==6 = y==6 && z==6 || contiene (z:xs)
                        | otherwise = contiene (y:z:xs)
    contiene _ = False
     
     
    cifras :: Integer -> [Int]
    cifras x = [read [d] | d<- show x] 
     
    apocalipticos :: [Integer]
    apocalipticos = [x | x <- [9..] , esApocaliptico x]
     
    mayorNoApocalipticoMenor :: Integer -> Maybe Integer
    mayorNoApocalipticoMenor x = Just (head [n | n<-[x-1,x-2..0], not (esApocaliptico n)]) 
     
    a = [3715 + n| n<-[0..]]
     
    grafica :: Integer -> IO ()
    grafica x = plotLists [Key Nothing] [(take y apocalipticos), (take y a)]
      where y = fromIntegral x
  2. agumaragu1
    import Graphics.Gnuplot.Simple
    import Data.List (isPrefixOf)
    import Data.Maybe (listToMaybe)
     
    esApocaliptico :: Integer -> Bool
    esApocaliptico = contiene.show.(2^)
      where contiene xxs@(x:xs) = isPrefixOf "666" xxs || contiene xs
            contiene _ = False
     
    apocalipticos :: [Integer]
    apocalipticos = [x | x <- [157..], esApocaliptico x]
     
    mayorNoApocalipticoMenor :: Integer -> Maybe Integer
    mayorNoApocalipticoMenor n = listToMaybe [x | x <- [n-1 , n-2 .. 1], (not.esApocaliptico) x]
     
    grafica :: Integer -> IO ()
    grafica n = plotLists [] [take (fromInteger n) apocalipticos, [3715..3714+n]]
  3. jaibengue
    import Data.List (isInfixOf)
     
    esApocaliptico :: Integer -> Bool
    esApocaliptico = isInfixOf "666".show.(2^)
     
    mayorNoApocalipticoMenor :: Integer -> Maybe Integer
    mayorNoApocalipticoMenor 0 = Nothing
    mayorNoApocalipticoMenor n | esApocaliptico (n-1) = mayorNoApocalipticoMenor (n-1)
                               | otherwise            = Just (n-1)
  4. carbremor
    import Data.List
    esApocaliptico :: Integer -> Bool
    esApocaliptico n | contiene [6,6,6] (digitos (2^n)) == True     = True
                     | otherwise                                    = False
     
    contiene :: Eq a => [a] -> [a] -> Bool
    contiene xs ys = any (xs `isPrefixOf`) (tails ys)
     
    apocalipticos :: [Integer]
    apocalipticos = [n | n <- [157..], esApocaliptico n]
     
    mayorNoApocalipticoMenor :: Integer -> Maybe Integer
    mayorNoApocalipticoMenor 0 = Nothing
    mayorNoApocalipticoMenor n | esApocaliptico (n-1) = mayorNoApocalipticoMenor (n-1)
                               | otherwise            = Just (n-1)
     
     
    grafica :: Integer -> IO ()
    grafica x = plotLists [] [(take y apocalipticos), (take y sucesion)]
      where y = fromIntegral x
     
    sucesion = [3715 + n| n<-[0..]]
    • carbremor
       
      -- Se me había olvidado, definir digitos, pero como ya ha aparecido en anteriores ejercicios, pues la tenía compilada.
       
      digitos :: Integer -> [Integer]
      digitos x = [read [d] | d <- show x

Leave a Reply

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