¿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
.