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
.Réponses:
Pyth -
27 à24 octetsCela a l'air plutôt cool: D
Essayez-le en ligne ici (évidemment pas en temps réel, mais si vous le faites défiler d'une main ferme).
la source
HTML / JavaScript,
170168167 octetsEdit: 2 octets sauvegardés grâce à @ETHproductions. Sauvegardé 1 octet grâce à @jrich.
la source
setInterval
vais accepter qu'une chaîne soit évaluée, ce qui pourrait potentiellement sauver un octet?setInterval('o.textContent...',d=50)
enregistre le_=>
et ajoute une paire de citationsNode,
145142 octetsCela semble un peu long et il y a probablement une petite place pour jouer au golf. Notez que le point-virgule à la fin est requis; sans cela, le programme génère une erreur de syntaxe car l'
for
instruction n'a pas de corps.Sorties bien plus de 20 lignes par seconde; un petit oiseau m'a dit que c'était environ 12 mille. Voici à quoi ça ressemble dans l'émulateur de terminal ConEmu sur mon ordinateur (enregistré à 30 ips):
la source
05AB1E , 26 octets
Je poste ceci comme une réponse différente par rapport à l'autre réponse 05AB1E car l'approche est différente
Essayez-le en ligne!
la source
η
au lieu de.p
;õš
(oùš
est prepend as list) au lieu deõ¸ì
(où¸ì
est wrap in list et prepend);₂
(où₂
est 26 si aucune seconde entrée n'est donnée) au lieu deT·
(qui est push 10 et double);]
au lieu de}}
(où]
ferme toutes les boucles, les déclarations if-else, etc. en même temps)BASH,
99 93 92 9188 octetsavec
tr
+head
+urandom
(merci à @manatwork)
la source
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
n’est pas nécessaire.((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
semble fonctionner maintenant.05AB1E, 30 octets
Utilise le codage CP-1252 . Essayez-le en ligne!
Aidez-moi à jouer au golf, s'il vous plaît.
la source
C,
182176128126125 octetsGolfé:
Ungolfed:
J'ai entendu dire qu'il était possible de supprimer certaines normesJe suis juste un idiot, cela fonctionne très bien sans eux.#include
, mais je ne pouvais pas le faire fonctionner avec le compilateur MingW GCC que je venais de télécharger. Aussi ne pouvait pas comprendre comment#define b #include
utiliser sans utiliser plus d'espace que cela en valait la peine.la source
a,b,c,d;
parce que toutes les variables globales déclarées comme telles sont int et init par 0 également puisque vous ne renvoyez rien, vous devriez l'écrire dans main ()while(i++<x)
au lieu defor (...)
i
doit être égal à zéro chaque fois que la boucle for est exécutée à nouveau.for
remplaceri <x
aveci++<x
et enleveri++
Java 7,
271265207 octets-58 octets sauvegardés grâce à @ OliverGrégoire . ( N'oubliez pas de faire passer sa réponse encore plus courte à Java 8. )
Ungolfed:
Entrée:
abcde
sortie:
la source
x
:r+=(char)(33+Math.random()*94)
. ÉgalementThread.sleep(9)
pour sauvegarder un octet.r=s.substring(0,i/20)
au lieu de la boucle surj
.r.substring(0,i/20)
(assez stupide de moi), et le(char)(33+Math.random()*94)
(joli tour de votre part).WinDbg,
400391 octets-9 octets en simplifiant quelques maths
Cela ne semble certainement pas être le genre de choses que WinDbg est censé faire. ;)
La saisie s'effectue en entrant une chaîne ascii dans un emplacement de mémoire et en définissant cette adresse dans le pseudo-registre
$t0
. Par exemple:Le prng que j'utilise est quel que soit le contenu en mémoire, quelques octets au-delà de la chaîne d'entrée. Chrome.exe apparaît pour remplir l'espace mémoire après
0x2000000
avec des octets aléatoires, j'ai donc utilisé un vidage de chrome.exe. Inconnu s'il s'agit d'un uniforme, mais me semble assez aléatoire.Comment ça fonctionne:
Remarque: Certains octets peuvent être lus en utilisant la
j
place de.if
's, mais cela le fait fonctionner trop lentement sur ma machine et ne génère donc pas au moins 20 lignes par seconde. Ne sauvegardez donc pas ces octets.Exemple de sortie: http://pastebin.com/H4H74sAx
la source
R, 138 octets
Lit les entrées de stdin.
Compté environ 61 lignes sur ma machine entre chaque lettre supplémentaire dans le "mot de passe".
la source
Bash,
247245212207 octetsMerci beaucoup Bash d'être si sensible aux espaces ...
Quoi qu'il en soit, la sortie est donnée en temps réel sur des lignes séparées. Enregistrer en tant que
.sh
script et invoquer avec:bash <File Name>.sh <Input>
Par exemple, les
bash Cracking_In_Progress.sh okayerty
résultats suivants, enregistrés à 30 images par seconde:la source
Haskell (GHC), 202 octets
-5 octets sans action de retour en chariot
la source
>
fait-on à la fin de la sortie?MATL , 26 octets
Essayez-le en ligne!
Vous trouverez ci-dessous la sortie en temps réel du compilateur hors ligne. Notez que le format GIF animé a été enregistré à 20 ips pour conserver une taille réduite, mais la vitesse réelle est beaucoup plus grande.
Comment ça fonctionne
la source
Python3,
149141139 octetsEntrée de stdin.
Version Eyes (157 bytes):
la source
t=time.clock
, mais vous n’utilisez que t une fois dans le code. Le remplacer par justetime.clock
permettra d'économiser 3 octets. Même chose pour l'impression.for _ in range(l-x)
pouvez êtrefor _ in"a"*(l-x)
pour 2 octets.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
au lieu deprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Node.js, 134 octets
Similaire à @ETHproductions (emprunté certaines de ses optimisations), mais adopte par ailleurs une approche différente. Utilise les nœuds
Buffer
pour gérer la génération de caractères au lieu des longs caractèresString.fromCharCode
, ce qui présente l'avantagemap
supplémentaire de nous permettre d'utiliser sans trop de temps supplémentaire la conversion chaîne-> tableau-> chaîne.la source
Buffer
. Juste pour que vous sachiez, réaffecterDate
àD
ne sauve aucun octet; J'ai essayé ça moi-même.Python 3,
167166 octetsLit les entrées de stdin. Une version de 171 octets fonctionne sous Python 2 (remplacé
input
parraw_input
):Ungolfed:
la source
Dyalog APL ,
5958 octetsSolution
Nécessite
⎕IO←0
ce qui est la valeur par défaut sur de nombreux systèmes.Afficher
En ajustant la fenêtre sur deux lignes, nous obtenons l’illusion d’une transformation sur place:
Explication
Il s'agit d'un train de fonctions anonyme qui prend le mot de passe comme argument correct.
⊢⊣
renvoyer le mot de passe et rejeter le résultat de≢{
...}¨
la fonction ci-dessous, avec la longueur du mot de passe comme argument de gauche, appliquée à chacun des2⊃⎕AI
mise à l' heure (lit. troisième élément de A ccount I nformation)1E3+
ajouter une secondet←
attribuer cela à t⊣
rejeter que⍵{
...}⍣{t≤2⊃⎕AI}⍺
appliquer la fonction suivante (avec sous-chaîne comme ⍺ et longueur de mot de passe ⍵ ) à plusieurs reprises jusqu'à ce que le temps atteint jusqu'à t⍵⍴95
95 fois autant de fois qu'il y a de caractères dans le mot de passe?
entier aléatoire 0 ... 9432+
ajouter 32 (donnant ainsi ⍵ nombres entiers aléatoires compris entre 32 et 126)⎕UCS
convertir en caractère Unicode⍺,
ajouter la sous-chaîne en cours de traitement⍵↑
prenez seulement autant de caractères qu'il y a dans le mot de passe⎕←
sortie que sur une ligne séparée≢
retourne la longueur de la chaîne sortie (= la longueur du mot de passe)⍳∘≢
0 ... longueur-1↑¨
chacun prenant des personnages de⊂
le mot de passela source
Java, 159 octets
Même algorithme que la réponse de Kevin Cruijssen , seulement totalement optimisé pour Java 8.
Ungolfed:
la source
C #,
203197195190 octetsGolfé:
Ungolfed:
l
stocke la longueur d'entrée.StopWatch
etPath.GetRandomFileName()
font partie de .NET Framework.EDIT1:
Stopwatch
déclaration implicite .EDIT2:
l
initialisation fusionnée avec déclaration.EDIT3: Merci, @Chris.
la source
t++
peut être inséré quelque part dansif ()
if (w.Elapsed.Seconds > t++)
et enlevert++;
Scala,
259254248233232231227225 octetsUngolfed:
la source
ForceLang ,
322309 octetsla source
C ++ (gcc) ,
280278 octetsEssayez-le en ligne!
Il imprime simplement 20 chaînes aléatoires en attente de 50
std::chrono::milliseconds
entre elles (produisant ainsi exactement 20 lignes par seconde), puis passe à l'étape suivante "de craquage".la source
Go , 244 octets
Essayez-le en ligne! (tronque le résultat pour qu'il ne montre pas toutes les instances)
Ceci est ma première réponse Golang \ o /
(Filmé à 30fps)
Comment:
la source
PHP, 222 octets
Ungolfed
(Je sais que la vidéo est de la merde)
la source
$c=range(32,127)
et alors$r=chr($c[rand(0,94)])
, pourquoi pas juste$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";}
est de 149 octets, et je suis sûr qu'il peut encore êtreTcl , 295 octets
Premier golf pour moi en Tcl. Ce n'est pas une langue très golfable, puisque tout est traité ici comme une chaîne, les espaces sont donc un must ...
Ungolfed:
la source
-nonewline
leputs
paramètre?expr
à la fin; une suffit et vous pouvez aussi éviter les espaces autour>
expr
à la fin, je ne le vois pas.[set k [expr $k-1]]
peut être[incr k -1]
. Et chaque `<` peut être<
, aucun espace n'est requis.Kotlin, 188 octets
Golfé
Ungolfed
Renommer
System.currentTimeMillis
sauvegardé quelques octets!la source
QBIC ,
9288 octetsJe l'ai craqué!
Cela repose sur la fonction SLEEP de QBasic utilisant le littéral de code
$sleep 1|
et sur laLEFT$
fonction de QBasic car je n'ai pas encore implémenté cette fonction dans QBIC ...Réussi à supprimer quelques octets en remplaçant tous les caractères
20
part
et en les fixant à 20. Aussi, rationalisé un appel en aléatoire et une boucle FOR.Explication:
Output (un morceau de la section du milieu sur 'helloworld')
la source