¿Recuerdas esos programas de fuerza bruta para descifrar contraseñas que muestran todas las combinaciones que están intentando? Más precisamente, en un punto, los n primeros caracteres son fijos (se han adivinado con éxito), y se están probando todos los caracteres posibles para los restantes. Probablemente has visto algunas en películas o en algún software escrito por personas a las que les gustan las interfaces sofisticadas.
Lamento decepcionarlo, pero no escribiremos un programa para descifrar la contraseña, solo uno para reproducir la salida agradable.
Desafío
Dada una cadena que contiene caracteres ascii imprimibles pero sin líneas nuevas (código ascii 32 a 126 o que coinciden con la expresión regular ^[ -~]{2,}$
), imprima una salida siguiendo estas reglas:
- En ese momento
t=n seconds
, losn
primeros caracteres impresos son losn
primeros caracteres de la cadena de entrada. - Después de los
n
caracteres fijos, debe agregar un carácter aleatorio formado en cadena (elegido uniformemente pseudoaleatoriamente del rango unicodea
~
(código 32 a 126)) para formar una cadena de la longitud del inicial. - Debería generar al menos (más sobre eso más adelante) 20 líneas por segundo: cada una de ellas tendrá los mismos
n
primeros caracteres, pero un final aleatorio diferente.
Probablemente aún no esté muy claro lo que se supone que debes hacer, así que veamos un ejemplo:
Ejemplo
Imprimiré solo 5 líneas diferentes por cada segundo en lugar del mínimo de 20 solo para que sea más legible.
Considere la entrada abcde
.
Durante el primer segundo, una salida válida puede ser algo como (completamente al azar):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Entonces, t=1
el primer carácter de cada cadena siguiente será a
(el primer carácter de la entrada):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Ahora, t=2
los dos primeros caracteres serán ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Ahora, t=3
los primeros tres caracteres serán abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Ahora, t=4
los primeros cuatro caracteres serán abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Finalmente, t=5
imprimimos la entrada (solo una vez):
abcde
Algunas precisiones
- No debe molestarse demasiado con la precisión de su idioma hacia los segundos (es decir, si su algoritmo es correcto pero su sistema / idioma carece de precisión, entonces está bien).
- El primer segundo puede ser más corto que un segundo (es decir, si inicia su programa durante un segundo, el primer segundo puede ser solo el tiempo restante hasta el final del segundo actual). O dicho de otra manera, no tiene que esperar el inicio de un nuevo segundo para comenzar a imprimir las salidas.
- Al menos 20 líneas por segundo : la forma más natural sería un bucle infinito con un comportamiento especial, uno por segundo (o un tiempo de espera, o lo que sea), por lo que resultará en unos pocos miles de líneas por segundo (¡y eso está perfectamente bien! ) Pero si tiene otra idea, siéntase libre de usarla siempre que imprima al menos 20 líneas por segundo.
- La entrada siempre tendrá más de 2 caracteres de longitud.
- Puede considerar que la entrada no tendrá más de 30 caracteres si ayuda. (Pero si funciona para los más largos, es lo mejor)
- El formato de entrada debe ser la representación más natural de una cadena en su idioma.
- Se le permite imprimir una nueva línea final.
Ejemplo de código
Si aún no comprende exactamente lo que tiene que hacer, puede ejecutar el siguiente código en un terminal de Linux para ver:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Criterio ganador
Este es el código de golf , por lo que gana el código más corto en bytes.
Gracias a Laikoni y Flp.Tkc por sus sugerencias y mejoras en el sandbox.
\r
(haciendo que todas se reemplacen entre sí en la pantalla como en la animación), o es\n
aceptable?\n
es perfectamente aceptable. La versión con\r
está aquí porque se ve mejor, pero no los necesitas\r
.Respuestas:
Pyth -
2724 bytesEsto realmente se ve muy bien: D
Pruébelo en línea aquí (obviamente no en tiempo real, pero si lo desplaza hacia abajo con una mano firme).
fuente
HTML / JavaScript,
170168167 bytesEditar: Guardado 2 bytes gracias a @ETHproductions. Guardado 1 byte gracias a @jrich.
fuente
setInterval
que aceptará una cadena para evaluar, lo que podría salvar un byte.setInterval('o.textContent...',d=50)
guarda el_=>
y agrega un par de citasNodo,
145142 bytesEsto parece un poco largo, y probablemente haya un pequeño espacio para jugar al golf. Tenga en cuenta que se requiere el punto y coma al final; sin él, el programa arroja un error de sintaxis porque la
for
declaración no tiene cuerpo.Produce más de 20 líneas por segundo; un pajarito me dijo que son aproximadamente 12 mil. Así es como se ve en el emulador de terminal ConEmu en mi computadora (grabado a 30 fps):
fuente
05AB1E , 26 bytes
Publico esto como una respuesta diferente con respecto a la otra respuesta 05AB1E ya que el enfoque es diferente
Pruébalo en línea!
fuente
η
en lugar de.p
;õš
(dondeš
se antepone como lista) en lugar deõ¸ì
(donde¸ì
se ajusta en la lista y anteponer);₂
(donde₂
es 26 si no se da una segunda entrada) en lugar deT·
(que es presionar 10 y doble);]
en lugar de}}
(donde]
cierra todos los bucles, declaraciones if-else, etc. al mismo tiempo)BASH,
99 93 92 9188 bytescon
tr
+head
+urandom
(gracias a @manatwork)
fuente
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
no se necesita el espacio frente a la redirección de entrada .((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
parece funcionar ahora.05AB1E, 30 bytes
Utiliza la codificación CP-1252 . Pruébalo en línea!
Por favor, ayúdame a jugar golf.
fuente
C,
182176128126125 bytesGolfizado:
Sin golf:
Escuché que es posible eliminar algunosSolo soy un idiota, funciona bien sin ellos.#include
s estándar , pero no pude hacer que funcione en el compilador MingW GCC que acabo de descargar. Tampoco podía imaginar cómo hacerlo#define b #include
sin usar más espacio del que valía la pena.fuente
a,b,c,d;
porque todas las variables globales declaradas así son int e init por 0 también ya que no devuelve nada, debe escribirlo en main ()while(i++<x)
lugar defor (...)
i
debe ser cero cada vez que el ciclo for se ejecute nuevamente.for
reemplazari <x
coni++<x
y eliminari++
Java 7,
271265207 bytes-58 bytes guardados gracias a @ OliverGrégoire . ( No olvides votar su respuesta Java 8 aún más corta ) .
Sin golf:
Entrada:
abcde
Salida:
fuente
x
:r+=(char)(33+Math.random()*94)
. TambiénThread.sleep(9)
para guardar un byte.r=s.substring(0,i/20)
lugar del bucle activadoj
.r.substring(0,i/20)
(bastante estúpido de mi parte) y el(char)(33+Math.random()*94)
(buen truco tuyo).WinDbg,
400391 bytes-9 bytes simplificando algunas matemáticas
Esto definitivamente no parece ser el tipo de cosas que WinDbg pretende hacer. ;)
La entrada se toma ingresando una cadena ASCII en una ubicación de memoria y configurando esa dirección en el pseudo-registro
$t0
. P.ej:El prng que estoy usando es cualquiera que sea el contenido en memoria, algunos bytes más allá de la cadena de entrada. Chrome.exe parece llenar el espacio de memoria después
0x2000000
con bytes de aspecto aleatorio suficiente, así que utilicé un volcado de chrome.exe. Se desconoce si esto es uniforme, pero me parece lo suficientemente aleatorio.Cómo funciona:
Nota: Algunos bytes se pueden jugar usando en
j
lugar de los.if
's, pero eso hace que se ejecute muy lentamente en mi máquina, por lo que no genera al menos 20 líneas por segundo, por lo que no guarda esos bytes.Salida de muestra: http://pastebin.com/H4H74sAx
fuente
R, 138 bytes
Lee la entrada de stdin.
Conté aproximadamente 61 líneas en mi máquina entre cada letra adicional en la "contraseña".
fuente
Bash,
247245212207 bytesMuchas gracias Bash por ser tan sensible al espacio en blanco ...
De todos modos, la salida se da en tiempo real en líneas separadas. Guardar como
.sh
script e invocar con:bash <File Name>.sh <Input>
Por ejemplo,
bash Cracking_In_Progress.sh okayerty
da como resultado la siguiente salida, grabada a 30 cuadros por segundo:fuente
Haskell (GHC), 202 bytes
-5 bytes sin acción de retorno de carro elegante
fuente
>
haciendo eso al final de la salida?MATL , 26 bytes
Pruébalo en línea!
A continuación se muestra la salida en tiempo real del compilador fuera de línea. Tenga en cuenta que el GIF animado se grabó a 20 fps para mantener su tamaño pequeño, pero la velocidad real es mucho mayor.
Cómo funciona
fuente
Python3,
149141139 bytesEntrada de stdin.
Versión de Eyes (157 bytes):
fuente
t=time.clock
, sí, pero solo usa t una vez en el código. Reemplazarlo con solotime.clock
ahorrará 3 bytes. Lo mismo para imprimir.for _ in range(l-x)
puede serfor _ in"a"*(l-x)
por 2 bytes.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
lugar deprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Nodo.js, 134 bytes
Similar a @ETHproductions (tomó prestadas algunas de sus optimizaciones), pero por lo demás adopta un enfoque diferente. Utiliza los nodos
Buffer
para manejar la generación de caracteres en lugar de los largosString.fromCharCode
, lo que tiene el beneficio adicional de permitirnos usarmap
sin demasiada sobrecarga de conversión de cadena-> matriz-> cadena.fuente
Buffer
. Para que lo sepas, la reasignaciónDate
aD
no guarda ningún byte; Lo intenté yo mismo.Python 3,
167166 bytesLee la entrada de stdin. Una versión de 171 bytes se ejecuta en Python 2 (reemplazado
input
porraw_input
):Sin golf:
fuente
Dyalog APL ,
5958 bytesSolución
Requiere
⎕IO←0
cuál es el predeterminado en muchos sistemas.Monitor
Al ajustar la ventana a dos líneas, obtenemos la ilusión de una transformación in situ:
Explicación
Este es un tren de funciones anónimo que toma la contraseña como argumento correcto.
⊢⊣
devolver la contraseña y descartar el resultado de≢{
...}¨
la siguiente función, con la longitud de la contraseña como argumento izquierdo, aplicada a cada uno de2⊃⎕AI
corriente hasta los tiempos (lit. tercer elemento de un UENTA I nformación)1E3+
agrega un segundot←
asignar eso a t⊣
descartar eso⍵{
...}⍣{t≤2⊃⎕AI}⍺
aplique la siguiente función (con una subcadena como ⍺ y la longitud de la contraseña como ⍵ ) repetidamente hasta que el tiempo de actividad alcance t⍵⍴95
95 repetido tantas veces como haya caracteres en la contraseña?
entero aleatorio 0 ... 9432+
suma 32 (lo que produce ⍵ enteros aleatorios en el rango 32 ... 126)⎕UCS
convertir a carácter Unicode⍺,
anteponer la subcadena procesada actualmente⍵↑
tomar solo tantos caracteres como haya en la contraseña⎕←
salida que en una línea separada≢
devolver la longitud de la cadena de salida (= la longitud de la contraseña)⍳∘≢
0 ... longitud-1↑¨
cada uno tomando personajes de⊂
la contraseñafuente
Java, 159 bytes
Mismo algoritmo que la respuesta de Kevin Cruijssen , solo totalmente optimizado para Java 8.
Sin golf:
fuente
C #,
203197195190 bytesGolfizado:
Sin golf:
l
almacena la longitud de entrada.StopWatch
yPath.GetRandomFileName()
son partes de .NET framework.EDIT1:
Stopwatch
Declaración implícita .EDIT2:
l
inicialización fusionada con declaración.EDITAR3: Gracias, @Chris.
fuente
t++
se pueden insertar en algún lugarif ()
if (w.Elapsed.Seconds > t++)
y quitart++;
Scala,
259254248233232231227225 bytesSin golf:
fuente
ForceLang ,
322309 bytesfuente
C ++ (gcc) ,
280278 bytesPruébalo en línea!
Simplemente imprime 20 cadenas aleatorias esperando 50
std::chrono::milliseconds
entre sí (generando exactamente 20 líneas por segundo) y luego continúa con el siguiente paso de "craqueo".fuente
Go , 244 bytes
Pruébalo en línea! (trunca el resultado para que no muestre todas las instancias)
Esta es mi primera respuesta de Golang \ o /
(Filmado a 30 fps)
Cómo:
fuente
PHP, 222 bytes
Sin golf
(Sé que el video es una mierda)
fuente
$c=range(32,127)
y luego$r=chr($c[rand(0,94)])
, ¿por qué no solo$r=chr(rand(0,94)+32)
?<?$l=strlen($a=$argv[1]);$e=$l+$s=time();while(time()<=$e&&$o!=$a){$o=substr($a,0,time()-$s);while(strlen($o)<$l)$o.=chr(rand(0,94)+32);echo "$o\n";}
es de 149 bytes, y estoy seguro de que se puede jugar másTcl , 295 bytes
Primero golf para mí en Tcl. No es un lenguaje muy golfable, ya que aquí todo se trata como cadenas, por lo que el espacio en blanco suele ser obligatorio ...
Sin golf:
fuente
-nonewline
elputs
parámetro?expr
al final; uno es suficiente, y también puedes evitar los espacios alrededor>
expr
al final, no puedo verlo.[set k [expr $k-1]]
puede ser[incr k -1]
. Y cada `<` puede ser<
, no se requieren espacios.Kotlin, 188 bytes
Golfed
Sin golf
¡El cambio de nombre
System.currentTimeMillis
ahorró bastantes bytes!fuente
QBIC ,
9288 bytes¡Lo he roto!
Esto se basa en la función SLEEP de QBasic usando el código literal
$sleep 1|
, y en laLEFT$
función de QBasic porque todavía no he implementado esa función en QBIC ...Se las arregló para raspar algunos bytes sustituyendo todos los
20
'st
y configurándolo en 20. Además, simplificó una llamada al azar y un bucle FOR.Explicación:
Salida (una parte de la sección central en 'helloworld')
fuente