0votos

Acceso Concedido en Haskell

por josejuan hace 6 años

El problema creo es muy fácil (no difícil), no se en que cursos se dan series, pero con eso basta, tiene coste O(log n) y pueden calcularse nºs absurdamente grandes (ej. 10^60000) en uno o dos segundos. No pongo la explicación para hacer pensar al resto.

Ayuda al agente a acceder

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
import System.Environment (getArgs) 
 
-- El coste del algoritmo es O(log n) donde 'n' es el número que indica 
-- la computadora a hackear 
jamesBondKey :: Integral a => a -> [a] 
jamesBondKey = c 1 
  where c _ 0 = [] 
        c p b = if r == 0 then bs else p:bs 
                where (d, r) = divMod b 2 
                      bs = c (p + p + p) d 
 
-- ¡OJO! el nº de entrada es la POTENCIA DE 10, es decir, si pones 1000 el número calculado es 10^1000 
-- y devuelvo la longitud (el nº de potencias) para poder probar números absurdamente grandes 
main = getArgs >>= print . length . jamesBondKey . (10^) . read . head 
 
{-- 
 
    Por ejemplo, obtener la contraseña si el ordenador nos da el número 
 
        10^60000, es decir, "un uno seguido de 60.000 ceros" 
 
    le toma 1.39 segundos. 
 
    [josejuan@centella accesoConcendido]$ time -f "%E, %M" ./accesoConcedido 60000 
    69725 
    0:01.39, 10756 
 
 
--} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.