Rappelez-vous ces programmes de force brute pour craquer mot de passe qui montrent chaque combinaison qu'ils tentent? Plus précisément, à un moment donné, les n premiers caractères sont fixes (ils ont été devinés avec succès) et tous les caractères possibles pour les autres sont testés. Vous en avez probablement déjà vu dans les films ou dans certains logiciels écrits par des personnes qui aiment les interfaces sophistiquées.
Désolé de décevoir, mais nous n'écrirons pas un programme pour déchiffrer un mot de passe, mais un seul pour reproduire la belle sortie.
Défi
Étant donné une chaîne contenant des caractères ascii imprimables mais pas de nouvelles lignes (code ascii 32 à 126 ou correspondant à l'expression régulière ^[ -~]{2,}$
), imprimez une sortie en respectant les règles suivantes:
- À la fois
t=n seconds
, lesn
premiers caractères imprimés sont lesn
premiers caractères de la chaîne de saisie. - Après les
n
caractères fixes, vous devez ajouter un caractère aléatoire formé sous forme de chaîne (choisi uniformément de manière pseudo-aléatoire dans la plage unicodejusqu'à
~
(code 32 à 126)) pour former une chaîne de la longueur du premier. - Vous devriez produire au moins (plus tard plus tard) 20 lignes par seconde: chacune d’elles aura les mêmes
n
premiers caractères, mais une fin aléatoire différente.
Ce que vous êtes censé faire n'est probablement pas encore très clair, alors prenons un exemple:
Exemple
Je n'imprimerai que 5 lignes différentes pour chaque seconde au lieu des 20 minimum pour que cela soit plus lisible.
Considérez l'entrée abcde
.
Pendant la première seconde, une sortie valide peut être quelque chose comme (complètement aléatoire):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Ensuite, t=1
le premier caractère de chaque chaîne suivante sera a
(le premier caractère de l’entrée):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Maintenant, t=2
les deux premiers caractères seront ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Maintenant, t=3
les trois premiers caractères seront abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Maintenant, t=4
les quatre premiers caractères seront abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Enfin, t=5
nous imprimons l’entrée (une seule fois):
abcde
Quelques précisions
- Vous ne devriez pas trop vous préoccuper de la précision de votre langue vers les secondes (c.-à-d. Si votre algorithme est correct mais que votre système / langue manque de précision, tout va bien).
- La première seconde peut être inférieure à une seconde (autrement dit, si vous lancez votre programme pendant une seconde, la première seconde peut ne représenter que le temps restant jusqu'à la fin de la seconde en cours). Autrement dit, vous n'avez pas à attendre le début d'une nouvelle seconde pour commencer à imprimer les sorties.
- Au moins 20 lignes par seconde : la manière la plus naturelle serait une boucle infinie avec un comportement spécial, une par seconde (ou un délai d'expiration, etc.), ce qui donnera probablement quelques milliers de lignes par seconde (et c'est parfaitement correct! ). Mais si vous avez une autre idée, n'hésitez pas à l'utiliser tant que vous imprimez au moins 20 lignes par seconde.
- L'entrée comportera toujours plus de 2 caractères.
- Vous pouvez considérer que la saisie ne comptera pas plus de 30 caractères si cela vous aide. (Mais si ça marche pour les plus longs, c'est pour le mieux)
- Le format de saisie doit être la représentation la plus naturelle d’une chaîne dans votre langue.
- Vous êtes autorisé à imprimer une nouvelle ligne de fin.
Exemple de code
Si vous ne comprenez toujours pas exactement ce que vous devez faire, vous pouvez exécuter le code suivant dans un terminal linux pour voir:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Critère gagnant
C'est du code-golf , donc le code le plus court en octets gagne!
Merci à Laikoni et à Flp.Tkc pour leurs suggestions et leurs améliorations dans le bac à sable.
\r
(les faisant se remplacer toutes à l'écran, comme dans l'animation), ou est-il \n
acceptable?
\n
est parfaitement acceptable. La version avec \r
est juste ici parce que ça a l'air mieux, mais vous n'en avez pas besoin \r
.