これらのブルートフォースプログラムがパスワードを解読することを覚えていますか?より正確には、ある時点で、最初のn個の文字が固定され(それらは正常に推測された)、残りの文字のすべての可能な文字がテストされています。おそらく映画や、派手なインターフェイスが好きな人が書いたソフトウェアで見たことがあるでしょう。
がっかりして申し訳ありませんが、パスワードを解読するプログラムは作成しません。素敵な出力を再現するためのプログラムのみを作成します。
チャレンジ
印刷可能なascii文字を含むが改行を含まない文字列(asciiコード32〜126またはregexに一致^[ -~]{2,}$
)を指定すると、次の規則に従って出力を印刷します。
- 時点
t=n seconds
で、n
印刷されるn
最初の文字は入力文字列の最初の文字です。 n
固定文字の後に、ランダムな文字列(ユニコード範囲から
~
(コード32から126)まで一様に擬似ランダムに選択された)で形成された文字列を追加して、最初の文字の長さの文字列を形成する必要があります。- 少なくとも毎秒20行を出力する必要があります。各行の
n
最初の文字は同じですが、ランダムな終わりが異なります。
おそらく、あなたが何をすべきかはまだ明確ではないので、例を見てみましょう。
例
読みやすくするために、最小20行ではなく、1秒ごとに5行のみを印刷します。
入力を考慮してくださいabcde
。
最初の1秒間、有効な出力は次のようなものになります(完全にランダム)。
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
すると、t=1
次のすべての文字列a
の最初の文字は(入力の最初の文字)になります。
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
これでt=2
、最初の2文字は次のようになりますab
。
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
これでt=3
、最初の3文字は次のようになりますabc
。
abcvW
abc3G
abc(g
abc{@
abc@4
これでt=4
、最初の4文字は次のようになりますabcd
。
abcdD
abcdv
abcdj
abcd$
abcd6
最後にt=5
、入力を出力します(一度だけ):
abcde
いくつかの精度
- 秒に向かって言語の精度を気にする必要はありません(つまり、アルゴリズムは正しいが、システム/言語の精度が不足している場合は問題ありません)。
- 最初の1秒は1秒より短くすることができます(つまり、1秒の間にプログラムを起動した場合、最初の1秒は現在の秒の終わりまでの残り時間になります)。別の言い方をすれば、出力の印刷を開始するために新しい秒の開始を待つ必要はありません。
- 少なくとも20行/秒:より自然な方法は、1秒ごとに特別な動作を行う無限ループ(またはタイムアウトなど)であるため、おそらく1秒あたり数千行になります(それでも問題ありません! )。ただし、別のアイデアがある場合は、1秒あたり少なくとも20行を印刷する限り、自由に使用できます。
- 入力は常に2文字以上になります。
- 入力が役立つ場合は、入力が30文字を超えないようにすることができます。(しかし、それがより長いもののために働くなら、それは最高です)
- 入力形式は、言語の文字列の最も自然な表現でなければなりません。
- 末尾の改行を印刷できます。
コード例
それでも何をすべきかを正確に理解していない場合は、Linuxターミナルで次のコードを実行して確認できます。
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
勝利基準
これはcode-golfなので、バイト単位の最短コードが勝ちです!
LaikoniとFlp.Tkcのサンドボックスの提案と改善に感謝します。
\n
は完全に受け入れられます。のバージョン\r
は見栄えが良いのでここにありますが、それらは必要ありません\r
。