進行中のクラッキング


57

これらのブルートフォースプログラムがパスワードを解読することを覚えていますか?より正確には、ある時点で、最初の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\!"

勝利基準

これはなので、バイト単位の最短コードが勝ちです!


LaikoniとFlp.Tkcのサンドボックスの提案と改善に感謝します。



1
出力の行を区切ることは必須ですか\r(アニメーションのようにそれらをすべて画面上で互いに置き換えます)、または\n許容できますか?

1
@ ais523 \nは完全に受け入れられます。のバージョン\rは見栄えが良いのでここにありますが、それらは必要ありません\r
ダダ

ランダム生成がパスワードを早めにクラックした場合、その時点で停止しても大丈夫ですか?
ジョナサンアラン

3
ランダムな文字がその場所の実際の文字であってはならないというルールに含めるべきではありませんか?そうしないと、ランダムな文字列が指定されたパスワードと一致する可能性がありますが、検索は続行され、映画ファンはグリッチとして評価します。
トム

回答:



29

HTML / JavaScript、170 168 167バイト

setInterval('o.textContent=i.value.replace(/./g,(c,i)=>new Date-d>++i*1e3?c:String.fromCharCode(Math.random()*95+32))',d=50)
<input id=i oninput=d=Date.now()><pre id=o>

編集:@ETHproductionsのおかげで2バイト保存されました。@jrichのおかげで1バイト節約されました。


これをテストしていませんがsetInterval、バイトを節約できる可能性があるeval'dの文字列を受け入れると思いますか?setInterval('o.textContent...',d=50)保存し、_=>引用符のペアを追加
-jrich

@jrichバイトカウントを更新するのを忘れていたので、便利でした!
ニール

20

ノード、145 142バイト

for(s=process.argv[2],d=new Date;s[a=(new Date-d)/1e3|0]+console.log(s.replace(/./g,(c,i)=>i<a?c:String.fromCharCode(32+Math.random()*95))););

これは少し長いようで、おそらくゴルフのための小さなスペースがあります。最後にセミコロンが必要であることに注意してください。これがないと、forステートメントには本体がないため、プログラムは構文エラーをスローします。

出力は毎秒20行を超えます。ちょっとしたバーディーは、それがおよそ12000だと私に言いました。コンピューターのConEmuターミナルエミュレーター(30 fpsで記録)での表示は次のとおりです。

ここに画像の説明を入力してください


10

05AB1E、26バイト

アプローチが異なるため、他の05AB1E回答とは異なる回答としてこれを投稿します

.põ¸ì¨vT·FyžQ.r¹gyg-£«}}¹»

.p                         Generate ordered prefix of input (e.g., ["a", "ab", "abc", "abcd", "abcde"] for "abcde")
  õ¸ì                      Prepend an empty string (e.g., result is ["", "a", "ab", ...])
     ¨                     Strip the last element (the same string as the input)
      v                    For each string in the array
       T·F                 For N in range(20)
          y                Push the current string
           žQ.r            Push all printable characters, shuffled
               ¹gyg-       Take the difference between the length of the input and the length of the current string -> x
                    £      Take the x first characters from the shuffled printable characters
                     «     Yield currentString + shuffledCharacters
                      }    End inner for
                       }   End outer for
                        ¹  Push input (last iteration)
                         » Join everything with newlines and implicitly display

オンラインでお試しください!


いい答え、私からの+1!注:それができる22のバイトとの新しい組み込みコマンドこれらの日:η代わりに.põš(どこšがリストとして付加されるか)õ¸ì(どこ¸ìがリストでラップされ、付加されるか); 2番目の入力が指定されていない場合は26です)の代わりに(プッシュ10、ダブル)。]代わりに}}]すべてのループ、if-elseステートメントなどを同時に閉じます)
ケビンCruijssen

8

BASH、99 93 92 91 88バイト

tr+ head+urandom

while ((${#1}-n));do
echo "${1::n=SECONDS}`tr -dc \ -~</dev/ur*|head -c$[${#1}-n]`"
done

(thx。to @manatwork)


5
[ "$n" = ${#1} ]((n==${#1})); ${1:0:$n}${1::n}
マナトワーク

@manatwork:おっ!
IPOR Sircer

1
さらに1つ:入力リダイレクトの前のスペース<は必要ありません。
マナトワーク

1
@manatwork- ((n==${#1}))>((${#1}-n))
Ipor Sircer

1
ロジックを逆にしたか、以前のテストを叩いたが、今${1::n=SECONDS}は動作しているようです。
マナトワーク


6

C、182の 176 128 126 125バイト

ゴルフ:

i;s;n;x;g(char*c){time(&s);while(c[++x]);do{n=time(0)-s;for(i=0;i<x;i++)putchar(i<n?c[i]:32+rand()%95);puts("");}while(n<x);}

ゴルフをしていない:

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int i,s,n,x;
void g(char* c) {
  time(&s); //Get the initial time
  while(c[++x]); // x = strlen(c) (happy about this one)
  do {
    n = time(0) - s; //seconds since beginning
    for(i = 0; i < x; i++)
      //after each second, print another char of the password
      putchar(i < n ? c[i] : 32 + rand() % 95);
    puts("");
  } while(n < x); //while we haven't printed the whole word
}

いくつかの標準をドロップすることは可能だと聞いたこと#includeがありますが、ダウンロードしたばかりのMingW GCCコンパイラで動作させることができませんでした。また、#define b #include必要以上のスペースを使用せずに方法を把握できませんでした。 私はただのバカです、彼らなしでうまくいきます。


X = 0が必要とされていない代わりに、このような他の人とそれを宣言a,b,c,d;あなたが何を返却されませんので、また0でそのように宣言されたすべてのグローバル変数がintとinitあるcuzをあなたは(メインでそれを書くべきです)
Mukulクマール

1
おかげで、静的スコープの初期化について知りませんでした。カンマではなくセミコロンだけで宣言しました。また、(int argc、char ** argv)を取得する必要があると思うので、mainを使用しませんでした。これは大量のバイトです。入力をパラメーターとして受け取り、少し奇妙なstdoutに出力しますが、関数としては問題ないことを願っています。
nmjcman101

1
while(i++<x) 代わりに使用for (...)
ムクルクマール

本当に良い考えですがi、forループが再び実行されるたびにゼロにする必要があります。
nmjcman101

次に同じでfor置き換えるi <xi++<xし、削除i++
Mukulクマー

5

Java 7、271 265 207バイト

void c(String s)throws Exception{for(int i=0,j,l=s.length();i<=l*20;i++){String r=s.substring(0,i/20);Thread.sleep(45);for(;j++<l;r+=(char)(32+Math.random()*95);System.out.println(r);if(s.equals(r))return;}}

@OliverGrégoireのおかげで-58バイトが節約されました。(彼のさらに短いJava 8の回答を支持することを忘れないでください。

ゴルフをしていない:

void c(String s) throws Exception{
  for(int i = 0, j, l = s.length(); i <= l*20; i++){
    String r = s.substring(0, i/20);
    Thread.sleep(45);
    for( ; j++ < l; r += (char)(32+Math.random()*95));
    System.out.println(r);
    if(s.equals(r)){
      return;
    }
  }
}

入力: abcde
出力:

ここに画像の説明を入力してください


1秒間に20行だけを印刷するように意図的に設計したかどうかはわかりませんが、ゴルフに役立つ場合は、1秒間に少なくとも 20行しか印刷する必要はありません。「毎秒20行」の数学を「毎秒変更」の数学に変更することが役立つかどうかはわかりません。
nmjcman101

必要ありませんxr+=(char)(33+Math.random()*94)。またThread.sleep(9)、バイトを保存します。
オリヴィエグレゴワール

1
また、r=s.substring(0,i/20)上のループの代わりにj
オリビエグレゴワール

私が行った重要な変更を考慮して、それらのコメントを考慮して回答を投稿することにしました。また、バイト数をかなり少なくするのはJava 8ソリューションです(Javaに関しては、ofc)。
オリビエグレゴワール

@OlivierGrégoireありがとう。そして、あなたの答えを支持しました。私はすべての変更を行ったわけではなく、r.substring(0,i/20)(私の愚かな)と(char)(33+Math.random()*94)(あなたからの素敵なトリック)だけを変更しました。
ケビンCruijssen

4

WinDbg、400 391バイト

.for(r$t1=@$t0;by(@$t1);r$t1=@$t1+1){};m@$t0 L@$t1-@$t0+1 @$t1+1;r$t4=2*@$t1+2-@$t0;r$t8=@$t4+f;r$t3=0;.for(r$t2=0;@$t2<@$t1-@$t0;da@$t0){.for(r$t7=@$t0+@$t2;by(@$t7);r$t7=@$t7+1;r$t8=@$t8+1){eb@$t7 by(@$t8)%5e+20};r$t9=0;.foreach(p {.echotime}){.if7==@$t9{ea@$t4"p";.if1>@$t3{r$t3=by(@$t4+7)}};r$t9=@$t9+1};j@$t3!=by(@$t4+7)'m@$t0+@$t4-@$t1+@$t2-1 L1 @$t0+@$t2;r$t2=@$t2+1;r$t3=by(@$t4+7)'}

数学を簡略化して-9バイト

これは間違いなく、WinDbgが意図している種類のものではないようです。;)

入力は、メモリ位置にアスキー文字列を入力し、そのアドレスを擬似レジスタに設定することにより取得され$t0ます。例えば:

r$t0 = 2000000
eza @$t0 "abcde"

私が使用しているprngは、メモリ内の内容が何であれ、入力文字列を数バイト超えています。Chrome.exeは0x2000000、ランダムに見える十分なバイトでメモリ領域を埋めるように見えるので、chrome.exeのダンプを使用しました。これが均一であるかどうかは不明ですが、私には十分にランダムに見えます。

使い方:

.for(r$t1=@$t0; by(@$t1); r$t1=@$t1+1){};         * From $t0, increment $t1 until the byte
                                                  * at $t1 is 0 to find length of input
m@$t0 L@$t1-@$t0+1 @$t1+1;                        * Duplicate input (memory 
                                                  * becomes: "input\0input\0")

r$t4=2*@$t1+2-@$t0;                               * Set $4 to the byte after \0 of the 
                                                  * duplicated input
r$t8=@$t4+f;                                      * Set $t8 to $t4+15, this is the prng
r$t3=0;                                           * Init $t3=0, this will hold the time

.for(r$t2=0; @$t2<@$t1-@$t0; da@$t0){             * For $t2=0, loop until it's input length,
                                                  * printing the string at $t0 after each
                                                  * loop. $t0 is where the password crack
                                                  * progress is written.
    .for(r$t7=@$t0+@$t2; by(@$t7); r$t7=@$t7+1;   * Loop over each uncracked char
                                   r$t8=@$t8+1){  * also incrementing prng ($t8)
        eb@$t7 by(@$t8)%5e+20                     * Write a visible ascii char onto the
                                                  * uncracked char position based on the 
                                                  * current byte of prng%0x5e+0x20 (prng%126+32)
    };

    r$t9=0;                                       * Set $t9=0 for updating current time
    .foreach(p {.echotime}){                      * For each (string) word in a statement
                                                  * like "Debugger (not debuggee) time: Mon 
                                                  * Nov 21 18:23:08.433 2016 (UTC - 8:00)"
        .if7==@$t9{                               * If the 7th word, ie- the current time
            ea@$t4"p";                            * Write the time at $t4
            .if1>@$t3{                            * If $t3 has not been set yet
                r$t3=by(@$t4+7)                   * ...save the current second in $t3
            }
        };
        r$t9=@$t9+1                               * Increment $t9 until it's 7
    };

    j@$t3!=by(@$t4+7)'                            * If the current second has changed
        m@$t0+@$t4-@$t1+@$t2-1 L1 @$t0+@$t2;      * Copy the cracked char from dupe input
        r$t2=@$t2+1;                              * Increment $t2 (loop ends when this is input length)
        r$t3=by(@$t4+7)                           * Save the new current second
    '
}                                                 * Final crack is printed by for loop

注:のj代わりにを使用して一部のバイトをゴルフすることもできます.ifが、そのためマシンでの実行が遅くなりすぎるため、少なくとも20行/秒が出力されないため、これらのバイトは保存されません。

サンプル出力:http : //pastebin.com/H4H74sAx


4

R、138バイト

z=Sys.time;n=nchar(x<-scan(,""));s=z();t=0;while(t<=n){t=t+z()-s;cat(substr(x,1,f<-floor(t)),intToUtf8(sample(32:126,n-f,T)),"\n",sep="")}

stdinから入力を読み取ります。

「パスワード」の各追加文字の間の私のマシンで約61行を数えました。


4

バッシュ、247の 245 212 207バイト

R()(echo $SECONDS);w=`R`;until [ "$a" = "$1" ];do for i in `seq 1 $[${#1}-${#a}]`;{ a+=`printf "\x$(printf %x $[$RANDOM%127+32])"`;};echo -e "$a\r";a=${1:0:q};((`R`-w>0))&&{ w=`R`;((q++));}||:;done;echo "$a"

空白に敏感なので、Bashに感謝します...

とにかく、出力はリアルタイムで別々の行に表示されます。.shスクリプトとして保存し、次を使用して呼び出します。

bash <File Name>.sh <Input>

たとえば、bash Cracking_In_Progress.sh okayerty1秒あたり30フレームで記録される次の出力になります。

出力例


4

Haskell(GHC)、202バイト

import System.Random
import Control.Concurrent
f s|l<-length s=mapM_(\n->putStr('\r':take n s)>>mapM(\_->toEnum<$>randomRIO(32,126))[1..l-n]>>=putStr>>threadDelay 50000)$[n|n<-[0..l-1],f<-[1..20]]++[l]

豪華なキャリッジリターンアクションなしの-5バイト

ここに画像の説明を入力してください


いいね!しかし>、出力の最後で何をしているのでしょうか?
マスト

3
@マストはプロンプトです。コードは最後に改行を出力しないため、プロンプトが表示されます。
アング

4

MATL、26バイト

`GZ`:)' ~'olGn4Mk-I$YrhD7M

オンラインでお試しください!

以下は、オフラインコンパイラからのリアルタイム出力です。アニメーションGIFは、サイズを小さく保つために20 fpsで記録されましたが、実際の速度ははるかに大きいことに注意してください。

ここに画像の説明を入力してください

使い方

           % Implicitly start timer
`          % Do...while
  G        %   Push input
  Z`       %   Push timer's current value, say t
  :)       %   Select the first t elements of the input, with t
           %   implicitly rounded down
  ' ~'     %   Push this string
  o        %   Convert to numbers, i.e. [32 126]
  l        %   Push 1
  Gn       %   Push input size, say n
  4Mk      %   Push floor(t), where t is the same value used above
  k        %   Subtract. Gives n-floor(t)
  I$Yr     %   Generate a row vector of n-floor(t) integers randomly
           %   chosen from 32 to 126
  h        %   Concatenate with the first characters of the input
  D        %   Display
  7M       %   Push the value n-floor(t) used above. This is used
           %   as loop condition: iz zero the loop is exited 
           % Implicit end

2
このコードはとても幸せです。:)
sethmlarson

@SethMichaelLarsonそれは、引用符のバランスが取れているためです。通常は発生しません:-)
ルイスメンドー

3

python3、149の 141 139バイト

import time,random
i,x=input(),0;l=len(i)
while x<l:x=int(time.clock());print(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))

stdinからの入力。

目のバージョン(157バイト):

import time,random
p,i,x=print,input(),0;l=len(i)
while x<l:x=int(time.clock());p(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)),end="\r")
p(i)

1
一度だけ行うことを「名前変更」しないことで、数バイト節約できると思います。たとえばt=time.clock、がありますが、コードでtを1回だけ使用します。それを単に置き換えると、time.clock3バイト節約されます。印刷についても同じです。
nmjcman101

@ nmjcman101おっと、前のバージョンから持ち越しました。ありがとう!
matsjoyce

また、あなたがfor _ in range(l-x)することができfor _ in"a"*(l-x)、2バイトのために。
nmjcman101

@ nmjcman101いいね!私はその1 ...覚えておく必要があります
matsjoyce

print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))代わりに試してくださいprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
x1Mike7x

3

Node.js、134バイト

for(s=[...process.argv[2]],n=new(d=Date);s[m=(new d-n)/1e3|0]+console.log(s.map((a,i)=>i<m?a:Buffer([Math.random()*95+32])).join``););

@ETHproductions(彼の最適化の一部を借用)に似ていますが、それ以外は異なるアプローチを取ります。longのBuffer代わりにNodeを使用して文字生成を処理しますString.fromCharCode。これは、mapstring-> array-> string変換のオーバーヘッドをあまりかけずに使用できるという副次的な利点があります。


いいですね、についてもっと学ぶ必要がありますBuffer。ご存知のように、に再割り当てDateDてもバイトは保存されません。私はそれを自分で試しました。
ETHproductions

3

Python 3、167 166バイト

import time,random
t=time.time
p,s=input(),t()
while t()-s<len(p):print(p[:int(t()-s)]+''.join(chr(random.randint(32,126))for _ in range(len(p)-int(t()-s))))
print(p)

stdinから入力を読み取ります。171バイトのバージョンは、Python 2(置き換えの下で実行inputしてraw_input):

import time,random
t=time.time
p,s=raw_input(),t()
while t()-s<len(p):print(p[:int(t()-s)]+''.join(chr(random.randint(32,126))for _ in range(len(p)-int(t()-s))))
print(p)

ゴルフをしていない:

import random
import time

p = input()
start = time.time()
while time.time() - start < len(p): 
    print(
        p[:int(time.time() - start)] + 
        ''.join(chr(random.randint(32, 126)) for _ in range(len(p) - int(time.time()-start)))
    )
print(p)

3

Dyalog APL59 58 バイト

解決

⎕IO←0多くのシステムでデフォルトである必要があります。

⊢⊣≢{⍵{≢⎕←⍵↑⍺,⎕UCS 32+?⍵⍴95}⍣{t2⊃⎕AI}⍺⊣t1E3+2⊃⎕AI}¨⍳∘≢↑¨⊂

表示

ウィンドウを2行に調整すると、インプレース変換の錯覚が得られます。
Dyalog APLコードクラッキングアニメーション

説明

これは、パスワードを正しい引数としてとる匿名の関数トレインです。

⊢⊣ パスワードを返し、次の結果を破棄します

≢{... 以下の関数。パスワードの長さを左引数として、それぞれに適用されます。

2⊃⎕AI(の第三の要素点灯現在のアップタイムCCOUNT Iは nformation)

1E3+ 秒を追加

t←それをtに割り当てる

それを捨てる

⍵{... 稼働時間がtに達するまで}⍣{t≤2⊃⎕AI}⍺、次の関数(サブ文字列およびパスワード長)を繰り返し適用します

  ⍵⍴95 95は、パスワードに含まれる文字数だけ繰り返されます

  ? ランダムな整数0 ... 94

  32+32を追加します(したがって、32 ... 126の範囲でランダムな整数が生成されます)

  ⎕UCS Unicode文字に変換します

  ⍺, 現在処理されている部分文字列を追加します

  ⍵↑ パスワードにある文字だけを使用してください

  ⎕← 別の行に出力する

   出力された文字列の長さ(=パスワードの長さ)を返します

⍳∘≢ 0 ...長さ-1

↑¨それぞれのキャラクターを

パスワード


2

Java、159バイト

s->{for(int i=0,j,l=s.length();i<=l*99;i++){String r=s.substring(0,j=i/20);Thread.sleep(9);for(;j++<l;r+=(char)(32+Math.random()*95));System.out.println(r);}}

Kevin Cruijssenの答えと同じアルゴリズムで、Java 8向けに完全に最適化されています。

ゴルフをしていない:

public class Tmp {

  interface X {

    void f(String s) throws Exception;
  }
  static X f = s -> {
    for (int i = 0, j, l = s.length(); i <= l * 20; i++) {
      String r = s.substring(0, j = i / 20);
      Thread.sleep(48);
      for (; j++ < l; r += (char) (32 + Math.random() * 94));
      System.out.println(r);
    }
  };

  public static void main(String[] args) throws Exception {
    f.f("abcde");
  }
}

1

C#の、203の 197 195 190バイト

ゴルフ:

void F(string s){int l=s.Length,t=0;var w=Stopwatch.StartNew();do{if(w.Elapsed.Seconds>t)t++;Console.WriteLine($"{s.Substring(0,t)}{Path.GetRandomFileName().Substring(0,l-t)}");}while(t<l);}

ゴルフをしていない:

    void F(string s)
    {
        int l = s.Length, t = 0;
        var w = Stopwatch.StartNew();

        do
        {
            if (w.Elapsed.Seconds > t)
                t++;

            Console.WriteLine($"{s.Substring(0, t)}{Path.GetRandomFileName().Substring(0, l - t)}");
        } while (t < l);
    }

l 入力長を保存します。

StopWatchおよびPath.GetRandomFileName().NETフレームワークの一部です。

EDIT1:暗黙のStopwatch宣言。

EDIT2:l初期化は宣言とマージされました。

EDIT3:ありがとう、@クリス。


静的メソッドStopwatch.StartNew()を使用して、ストップウォッチの更新を保存し、明示的に開始する
クリス

@クリス、私はその方法、thxについて知りませんでした。
paldir

t++どこかに挿入できますif ()
ムクルクマール

@MukulKumar詳細を教えてください。
paldir

使用if (w.Elapsed.Seconds > t++)して削除t++;
Mukulクマール

1

スカラ、259 254 248 233 232 231 227 225バイト

import scala.concurrent.duration._;(b:String)=>{val d=b.length.seconds.fromNow;while(d.hasTimeLeft)println(b.zipWithIndex.map{case(f,g)=>if(g<b.length-d.timeLeft.toSeconds-1)f else(32+math.random*94)toChar}mkString);print(b)}

ゴルフをしていない:

import scala.concurrent.duration._;

(b:String) => {
    val d = b.length.seconds.fromNow;
    while(d.hasTimeLeft)
        println(
            b.zipWithIndex.map{
                case(f,g) => 
                    if(g<b.length-d.timeLeft.toSeconds-1)
                        f 
                    else
                        (32+math.random*94)toChar}
            mkString
        );

    print(b)
}

1

ForceLang322 309バイト

def s set
s g goto
s W io.writeln
s k io.readln()
s T timer.new()
def a T.poll()
label 1
s P math.floor a.mult 1e-6
if P=k.len
 W k
 exit()
s j 0
s t ""
if P=0
g 4
label 3
s v k.charAt j
s t t+v
s j 1+j
if j-P
g 3
label 4
if j=k.len
 W t
 g 1
s r 94.mult random.rand()
s v string.char 32+r
s t t+v
s j 1+j
g 4

使用したプログラミング言語のリンクを追加できますか?
ソロモンウッコ

@SolomonUckoここに行きます。
SuperJedi224

1

C ++(gcc)280 278バイト

#include<iostream>
#include<chrono>
#include<cstdlib>
#include<thread>
int i,n,t,q;void f(std::string s){for(t=s.size(),n=0;n<=t;n++)for(q=n<t?20:1;q--;std::this_thread::sleep_for(std::chrono::milliseconds(50)))for(std::cout<<"\n"<<s.substr(0,i=n);i++<t;)putchar(32+rand()%84);}

オンラインでお試しください!

std::chrono::milliseconds相互に50 を待機する20個のランダムな文字列を印刷し(したがって、毎秒正確に20行を出力します)、次の「クラッキング」ステップに進みます。


1

Go、244バイト

import(."fmt"
."math/rand"
."time")
func a(s string){Seed(Now().Unix())
for i:=0;i<len(s);i++{t:=Now().Truncate(Second).Add(Second)
for Now().Before(t){q:=[]rune(s)
for p:=len(q)-1;p>=i;p--{q[p]=rune(32+Intn(95))}
Println(string(q))}}
Print(s)}

オンラインでお試しください!(すべてのインスタンスが表示されないように結果を切り捨てます)

これは私の最初のGolangの回答です\ o /

ここに画像の説明を入力してください

(30fpsで撮影)

どうやって:

func a(s string) {                      //function a
Seed(Now().Unix())                      //Create a seed for the pRNG
for i := 0; i < len(s); i++ {           //set helper var i (this is the number of characters we'll keep)
t := Now().Truncate(Second).Add(Second) //set helper var t = 1 second from now
for Now().Before(t) {                   //while inside that 1 second window
q := []rune(s)                          //put each character in a rune slice and assign that to q
for p := len(q) - 1; p >= i; p-- {      //loops through the rune slice
q[p] = rune(32 + Intn(95))              //replace the character in position p with a random code point in [32,126]
}
Println(string(q))                      //print the rune slice as a string
}
}
Print(s)                                //finally, print the original string
}

0

PHP、222バイト

$a=$argv[1];$c=range(32,126);$t=time();$s=$t;$e=$t+strlen($a);while(time()<=$e){$l=time();$p=$l-$s;$x=substr($a,0,$p);$k=$e-$l;$r='';for($i=$k;$i>0;$i--)$r.=chr($c[rand(0,94)]);$o=$x.$r;echo"$o\n";if($o==$a&&$l==$e)break;}

非ゴルフ

<?php
$input = $argv[1];
$chars = range(32, 126); // count() is 95

$startTime = time();
$endTime = time() + strlen($input);

while (time() <= $endTime) {
    $plaintextAmountToPrint = time() - $startTime;

    $plain = substr($input, 0, $plaintextAmountToPrint);

    $cryptAmountToPrint = $endTime - time();

    $crypt = '';

    for ($i = $cryptAmountToPrint; $i > 0; $i--)
        $crypt .= chr($chars[rand(0, 94)]);

    $output = $plain . $crypt;

    echo $output . "\n";

    if ($output == $input && time() == $endTime)
        break;
}

(私はビデオががらくたであることを知っています) ここに画像の説明を入力してください


これはもっと多くのことができます。たとえば、$c=range(32,127)andの代わりに$r=chr($c[rand(0,94)])、なぜ$r=chr(rand(0,94)+32)ですか?
ザンダーホール

いい視点ね。それは私の最初のゴルフです:P
ニノŠkopac

<?$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";}は149バイトで、さらにゴルフができると確信しています
-Xanderhall

クール、あなたはその男を投稿する必要があります。
ニノシュコパック

答えを編集するだけで、変更して改善することができます。
ザンダーホール

0

Tcl、295バイト

Tclでの最初のゴルフ。非常にゴルフに適した言語ではありません。ここではすべてが文字列として扱われるため、通常は空白が必須です...

set l [string length $argv];set s [clock seconds];set r -1;while {$r<$l-1} {puts -nonewline [string range $argv 0 $r];set k $l;while {[set k [expr $k-1]]>$r} {puts -nonewline [format %c [expr int(rand()*95+32)]]};puts "";if {[expr [clock seconds]-$s]>[expr $r+1]} {set r [expr $r+1]}};puts $argv

ゴルフをしていない:

set l [string length $argv]
set s [clock seconds]
set r -1
while {$r < $l-1} {                                      # loop on time
  puts -nonewline [string range $argv 0 $r]
  set k $l
  while {[set k [expr $k-1]] > $r} {                     # loop on "unfound" chars
    puts -nonewline [format %c [expr int(rand()*95+32)]]
  }
  puts ""
  if {[expr [clock seconds]-$s] > [expr $r+1]} {         # advance time
    set r [expr $r+1]
  }
}
puts $argv

パラメーターを回避するため-nonewlineに、出力を変数に保存してからすべてを結合してみませんputsか?
セルジオ

expr最後に2つは必要ないと思います。1つで十分です。また、周囲のスペースを避けることもできます >
セルジオル

@sergiolに感謝します。周囲にスペースはありません>要約版をご覧ください。expr最後に使用する方法を教えてください、私はそれを見ることができません。
hdrz

2つの提案のデモ
-sergiol

1
[set k [expr $k-1]]することができます[incr k -1]。そして、すべての `<`には<、スペースは不要です。
セルジオ

0

Kotlin、188バイト

ゴルフ

val x=readLine()!!;val n=System::currentTimeMillis;val t=n();do{val s=(n()-t)/1000;x.mapIndexed{i,c->print(if(i<s)c else((Math.random()*(126-32))+32).toChar())};println()}while(s<x.length)

非ゴルフ

val input = readLine()!!
val time = System::currentTimeMillis
val startTime = time()
do {
    val crackIndex = (time() - startTime) / 1000
    input.mapIndexed{ i, letter ->
        print(
            if (i < crackIndex) letter else ((Math.random()*(126-32))+32).toChar()
        )
    }
    println()
} while(crackIndex < input.length)

ここに画像の説明を入力してください

名前を変更System.currentTimeMillisすると、かなりのバイトが節約されました!


0

QBIC92 88バイト

割れた!

t=20;_LA|[a*t-t|B=$left$|(A,b/t)[a|B=B+$CHR$|(_r94|+32)]?$left$|(B,a)~b%t=0|$sleep 1|}?A

これは、コードリテラルを使用したQBasicのSLEEP関数$sleep 1|と、QBasicのLEFT$関数にまだ依存していないため、QBasicの関数に依存しています...

すべて代入して数バイトをこすりするマネージド20ためのをtしても20にそれを設定し、ループFORランダムにコールし、合理化。

説明:

' Get cmd line param with 'password' and the length of that string, set t to 20
t=20;_LA|

' loop from 1 (implicitly) to (#chars-1) * 20 cracks per char
[a*-t|

'have our crack-display start with the first N chars of
'the password, where N is the number of seconds passed   
B=$left$|(A,b/t)

' loop to add the 'crack-visual'
' It's too long, but we'll trim it down to the original length
[a|B=B+$CHR$|(_r92|+34)]?$left$|(B,a)

' if we've done 20 cracks, sleep for 1 second
~b%20=0|$sleep 1|}

' We've cracked it!
?A

出力(「helloworld」の中間セクションの一部)

hewnoluZfs
heb!mrc2g@
hee+yh"5ut
he0?V+O)Uu
heqf(#M/BM
hez|DGX%a8
he<_n[6-.+
helkxQ#g%,
hel&^A9$I8
hel43{b5]t
helszK50%F
hel`kdy ;b
hel Vr6Z}s
helLIR7*7o 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.