Erinnern Sie sich an die Brute-Force-Programme, die Kennwörter knacken und alle Kombinationen anzeigen, die sie versuchen? Genauer gesagt, an einem Punkt sind die n ersten Zeichen festgelegt (sie wurden erfolgreich erraten), und jedes mögliche Zeichen für die übrigen Zeichen wird getestet. Wahrscheinlich haben Sie einige in Filmen oder in einer Software gesehen, die von Leuten geschrieben wurde, die ausgefallene Oberflächen mögen.
Es tut uns leid, Sie zu enttäuschen, aber wir werden kein Programm zum Knacken von Passwörtern schreiben, nur eines, um die schöne Ausgabe zu reproduzieren.
Herausforderung
Bei einer Zeichenfolge, die druckbare ASCII-Zeichen, aber keine Zeilenumbrüche enthält (ASCII-Code 32 bis 126 oder mit dem regulären ^[ -~]{2,}$
Ausdruck übereinstimmend ), wird eine Ausgabe nach folgenden Regeln gedruckt:
- Zur Zeit
t=n seconds
sind dien
ersten gedruckten Zeichen dien
ersten Zeichen der Eingabezeichenfolge. - Nach den
n
festen Zeichen sollten Sie eine Zeichenfolge anhängen, die aus einem zufälligen Zeichen besteht (einheitlich pseudozufällig ausgewählt aus dem Unicode-Bereichbis
~
(Code 32 bis 126)), um eine Zeichenfolge mit der Länge der anfänglichen Zeichenfolge zu bilden. - Sie sollten mindestens (dazu später mehr) 20 Zeilen pro Sekunde ausgeben : Jedes von ihnen hat die gleichen
n
ersten Zeichen, aber ein anderes zufälliges Ende.
Es ist wahrscheinlich noch nicht ganz klar, was Sie tun sollen. Lassen Sie uns ein Beispiel durchgehen:
Beispiel
Ich drucke nur 5 verschiedene Zeilen pro Sekunde anstatt der 20 Zeilen, um die Lesbarkeit zu verbessern.
Betrachten Sie die Eingabe abcde
.
Während der ersten Sekunde kann eine gültige Ausgabe so etwas wie (völlig zufällig) sein:
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Dann ist t=1
das erste Zeichen jeder folgenden Zeichenfolge a
(das erste Zeichen der Eingabe):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Nun sind t=2
die ersten beiden Zeichen ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Nun sind t=3
die ersten drei Zeichen abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Nun sind t=4
die ersten vier Zeichen abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Schließlich t=5
drucken wir die Eingabe (nur einmal):
abcde
Ein paar Präzisionen
- Sie sollten sich nicht zu sehr mit der Genauigkeit Ihrer Sprache auf die Sekunden konzentrieren (dh, wenn Ihr Algorithmus korrekt ist, Ihrem System / Ihrer Sprache jedoch die Genauigkeit fehlt, ist dies in Ordnung).
- Die erste Sekunde kann kürzer als eine Sekunde sein (Das heißt, wenn Sie Ihr Programm während einer Sekunde starten, kann die erste Sekunde nur die verbleibende Zeit bis zum Ende der aktuellen Sekunde sein). Oder anders ausgedrückt: Sie müssen nicht auf den Beginn einer neuen Sekunde warten, um mit dem Drucken der Ausgaben zu beginnen.
- Mindestens 20 Zeilen pro Sekunde : Der natürlichere Weg wäre eine Endlosschleife mit einem besonderen Verhalten pro Sekunde (oder einer Zeitüberschreitung oder was auch immer), so dass wahrscheinlich ein paar tausend Zeilen pro Sekunde entstehen (und das ist vollkommen in Ordnung!). ). Wenn Sie jedoch eine andere Idee haben, können Sie sie verwenden, solange Sie mindestens 20 Zeilen pro Sekunde drucken.
- Die Eingabe wird immer länger als 2 Zeichen sein.
- Sie können davon ausgehen, dass die Eingabe nicht länger als 30 Zeichen ist, wenn dies hilfreich ist. (Aber wenn es für längere funktioniert, ist es das Beste)
- Das Eingabeformat sollte die natürlichste Darstellung einer Zeichenfolge in Ihrer Sprache sein.
- Sie dürfen eine abschließende Newline drucken.
Codebeispiel
Wenn Sie immer noch nicht genau wissen, was Sie zu tun haben, können Sie den folgenden Code in einem Linux-Terminal ausführen, um zu sehen:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Gewinnkriterium
Das ist Code-Golf , also gewinnt der kürzeste Code in Byte!
Vielen Dank an Laikoni und Flp.Tkc für ihre Vorschläge und Verbesserungen im Sandkasten.
\r
(wobei sich alle wie in der Animation gegenseitig ersetzen müssen), oder ist dies \n
akzeptabel?
\n
ist vollkommen akzeptabel. Die Version mit \r
ist nur hier, weil sie besser aussieht, aber die braucht man nicht \r
.