Cisco Pingのシミュレーション


8

前提:

ネットワーキングの場合、すべてのデバイスが正しく接続されていることを確認するために、デバイスにpingを送信した可能性があります。ネットワーキングで人気のあるシスコである[引用が必要]の IOSには、次のようなコマンドがあります。

キャプチャー

画像ソース

あなたの課題は、この一部をグラフィカルに再現することです。スキップしている部分は、最初の行(Type escape sequence to abort.)全体と、IPアドレスと往復時間です。

まず、以下を出力します。

Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:

次に、送信されるエコー要求をシミュレートします。各要求は、2秒待機してから応答を生成することから始まります。成功したエコー応答はで表され!、失敗した応答はで表され.ます。実際にはパケットを送信しませんが、パケットの損失を表すために、プログラムは2つのオプションからランダムに選択し、それぞれの確率がゼロではないようにする必要があります。この行は空で始まり、各ティックは別の文字を追加します。

5番目のエコーの後、パーセンテージ行が出力され、プログラムが終了します。パーセント線は次の形式になります

Success rate is $p percent ($s/5)

どこ$p正規表現である0|20|40|60|80|100$s成功したエコーの数です。画面は、新しい状態を再描画するか、既存のエコーラインに追加することにより、待機時間ごとに更新する必要があります。これにはSendingラインが含まれます。

実行例:(ティックカウントは表示されるべきではなく、各タイムステップで出力がどのようになるかを明確にするためにあります)

#Tick 0
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:

#Tick 1
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.

#Tick 2
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!

#Tick 3
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.

#Tick 4
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!

#Tick 5
Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!.
Success rate is 40 percent (2/5)

入力:

使用可能な入力がありません。

出力:

適切な形式。最終出力の例は次のようになります。

Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
...!!
Success rate is 40 percent (2/5)    

ルール:

  • エコーラインに追加するか、ティックごとに画面を再描画する必要があります。
  • !そして、.同じようにそう、ちょうど両方可能である必要はありません。
  • 連続して実行すると、さまざまな結果を生成できる必要があります
  • あなたの出力のGIFやWebMSはクールです。ボーナスも何もありません。
  • 標準の抜け穴は禁止されています
  • これは

出力が視覚的に同じである場合、末尾のスペースを含む文字列を印刷できますか?
J.サレ

最後の行は改行で終了する必要がありますか?

@Rogemこれはオプションです。
Veskah

回答:


5

C(gcc)、172バイト

だから、私はこのものからなんと6バイトもずいぶんとばかげた策略で削った。でコンパイルし-DK=!sleep(2)-putchar(rand()%2?33:46)/46ます。sleep()システム標準ライブラリで定義されている関数によって異なります。ループまたは再帰しません。

p(n){puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");printf("\nSuccess rate is %i percent (%i/5)",n*20,n=K+K+K+K+K);}

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

説明

このソリューションは、3つの重要な実装/ランタイムの詳細に依存しています。まず、シグナルなどを介してsleep() 割り込みを行うことはできません。第二に、加算と減算は左から右の順に解決されます。第三に、への議論はprintf()右から左に解決されなければならない。

それが邪魔にならないように、このことを整理しましょう。

p(n){ // Unfortunately, I need a variable to store the RNG result.
    // This is straight-forward printing of a line.
    puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");
    // So, resolving right-to-left, we have a) the K preprocessor macros,
    // b) the assigment of their sum to n, c) the percentage equivalent of
    // the fraction n/5 and d) a constant format string.
    // The summation of the K's is where the magic happens.
    printf("\nSuccess rate is %i percent (%i/5)",n*20,n=K+K+K+K+K);
}

コンパイラー引数

-DK=!sleep(2)-putchar(rand()%2?33:46)/46

だから、左(すなわち、それは解決しなければならないように)から始まる、私たちは持っていますsleep()sleep()戻るときに残っている秒数を返すので、ユーザー(および他のプロセス)は親切であり、スリープを中断しないことが期待されます。私たちは、論理的補数を取る、と私たちのケースであるためsleep()、常に戻ります0、結果があります1。意義については後で詳しく説明します。

次に、と入力しputchar()ます。putchar()単一の1バイト文字を出力し、バイトの値を返します。したがって、内部でランダムな値を取得し、(恐ろしいエントロピーではありますが)50から50に分割するためにmodulo-2を計算し、それを3項条件付きで目的の文字に変換します- ! (33) および. (46)。次に、の戻り値をputchar()withで除算し46ます。

今、その部門はの0ために戻ります!1のために.-私たちは(から1を取るので!sleep())、そのから除算の結果を引きます。プレスト!

さて、少し問題があります。Cのバッファに物を書き込むとき(つまりstdout)、必ずしも受信側にすぐに書き込むとは限りません。実際、選択したディストリビューションでこれを実行していたところ、プログラムが終了した後にのみpingを出力することがわかりました。ただし、C の他のすべてのソリューションがそのスライドを許可していること、およびおそらく少なくとも1台のマシンがどこかに存在しそれを実行して他のすべての前提条件を満たしていることを前提とします(そして、カーネルでそれを常に「修正」することができます)。 。)、私はfflush()ing によってスコアを台無しにするつもりはありませんstdout


4

APL(Dyalog Unicode)147 138バイト

{5=≢⍵⊣⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:':⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}¨1↓¨,\?62

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

これは大きなDirect関数です。他の回答と同様に、TIOリンクは実行が完了した後にのみ出力されます。とはいえ、@Adámは便利なヘルパー関数を作成したので、タイムスタンプを視覚化できます。そのバージョンのコードはここにあります

この回答ではを使用しています⎕IO←0。これは、1から0までのすべてのI ndex Oの原点を設定します。

保存された9バイトを@ngnに感謝します(そして、私の説明を台無しにしてしまいました!今、私は再びそれをしなければなりません(ლಠ益ಠ)ლ

どうやって:

関数は1つの固定引数を受け取ります。 右側にます。

として、私たちは持ってい¨1↓¨,\?6⍴2ます。この式は?、0と1の間で()をランダムに6回選択します(6⍴22の6要素ベクトルを作成します)。結果は連結され(,\)、1から6要素のベクトルの6要素ベクトルを形成します(例:)1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0。それぞれの最初の要素が削除され(1↓¨)、次に、結果の各ベクトルが¨)として渡され、関数が6回実行されます。

{5=≢⍵⊣...:...}条件付きステートメントです。5つの要素がある場合(つまり、最後の反復である場合)、ガードの後に​​コードを実行します(:)。は、条件が最後に評価されることを保証するため、プログラムは常にガードの前に文字列を出力します。

{...⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'...}インデックス付きベクトル'.!'[⍵]で構成される2要素ベクトルを作成します。これは、成功と失敗、およびping文字列自体を出力します。次に、そのベクトルは正しい順序に反転(モナディック)され、次に混合され(モナディック)行列になります。その後、その行列はstdout(⎕←)に出力され、D e L ay(⎕DL)が追加されます。への引数⎕DLは、行列の要素数です()の、つまり2で、関数呼び出しの間に2秒の遅延を作成します。

{...:⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}出力する最後の文字列を作成します。引数(+/⍵)の要素を合計し、結果を引数として括弧内の暗黙の関数に渡します。この関数は、最初に文字列化された()引数の前に(ダイアディック,、その後に)文字'/5)'を追加し、それを文字列に追加します'percent ('。次に、結果の文字列を引数(×∘20)の20倍に追加し、それを残りの出力に追加します⎕←。これは、を介してstdoutに送信されます。


末尾の改行で結構です。私がモバイルを利用しているため、ここにコメントします
Veskah

⎕DL 2⊣⎕←⎕DL≢⎕←
...-

3

Java(JDK)、227バイト

()->{var o=System.out;int s=0,i=0;for(o.println("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");i++<5;Thread.sleep(2000))o.print(Math.random()>.5&&s++<9?"!":".");o.printf("\nSuccess rate is %d percent (%d/5)",s*20,s);}

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


動作中のping

動作中のping


説明した

()->{                               // Lambda taking no input
    var o=System.out;               // Assign System.out to a variable
    int s=0,i=0;                    // Initialise successes and loop ints
    for(o.println("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:");
                                    // ^Print opening line
        i++<5;                      // Loop five times
        Thread.sleep(2000))         // Sleep for 2 seconds at the end of each loop
            o.print(                // Print out..
                Math.random()>.5    // ..if random number is greater than .5 (50%)
                    &&s++<9?        // ..and incremented successes 
                        "!":".");   // ! for success and . for failure
    o.printf("\nSuccess rate is %d percent (%d/5)",s*20,s);
                                    //^Print formatted closing line
}

印刷はそこでキラーです:/
Adam

3

C#(Visual C#Interactive Compiler)、212バイト

int i,p;for(Write("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:\n");i++<5;Write(".!"[-p+(p+=new Random().Next(2))]))System.Threading.Thread.Sleep(2000);Write($"\nSuccess Rate is {p*20} percent ({p}/5)");

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


2
PPCGへようこそ!私は試用版をオンライン生成する自由を取りましたあなたのためのリンク。TIOがPPCGで回答を投稿するために提供するテンプレートを使用して回答を編集することをお勧めします(ただし、これは当然必須でありませ)。
J.サレ

これRandomをに保存する代わりにインラインで構築することで、これを299バイトに減らすことができますvar r。ここに私の提案へ
ロビンB

これがIndexOutOfBoundsExceptionsでクラッシュし続けます。
私の代名詞はmonicareinstateで、

@mypronounismonicareinstate修正済み。今月はどうして捕まらなかったのですか?
無視の

2

JavaScript + HTML、203 + 9 = 212バイト

<pre id=o
f=(x,y=0,g=z=>setTimeout(f,2e3,-~x,y+z),u=s=>o.innerText+=s)=>x?x<6?u(`.!`[n=new Date%2],g(n)):u(`
Success rate is ${y/20} percent (${y}/5)`):u`Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:`&g(0)

それを試してみてください

new Dateが十分にランダムでない場合は、Math.random()代わりに使用する8バイトを追加します(スニペットで適切に実行できるように他の変更が加えられています)。


2

PowerShell166 162 158バイト

'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'
0..4|%{sleep 2;write-host -no '.!'[($x=0,1|Random)];$d+=$x}
"
Success rate is $($d*20) percent ($d/5)"

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

TFeldに対するPythonの回答と本当に似ています。タイミングはTIO(プログラムの完了時にのみ出力されるTIO)では機能しませんが、ローカルで機能します。

最初の行は、パイプラインに配置された文字列です。中央線からループ04各反復は、sleepのためにINGの2次に、秒write-host-no改行。私たちは、!または.選択されたRandomライを書き出して、$xます。次に、に$d基づいて増分し$xます。

最後の行は、パイプラインに配置された別の(複数行の)文字列で、途中で少し計算してパーセンテージを出します。

-1バイトVeskahのおかげで
-3バイトCiaran_McCarthyのおかげで


成功行をバックティックn(コメントでエスケープする方法がわからない)の代わりに複数行の文字列にすると、バイトを節約できます。161バイト
Veskah

1
*20代わりに使用することで3バイトを削ることができます/5*100か?
Ciaran_McCarthy

@Veskahはい、ありがとうございます。
AdmBorkBork 2018年

@Ciaran_McCarthy聖なる牛、盲目的に明白なゴルフに感謝します。:)
AdmBorkBork 2018年

1

Pythonの3221の 220 216 209 208 201バイト

import time,random
p=print
p('Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:')
n=0
exec("time.sleep(2);i=random.choice('.!');n+=i<'#';p(end=i);"*5)
p(f'\nSuccess rate is {n*20} percent ({n}/5)')

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

タイミングはTIOでは機能しませんが、コンソールでは機能します。(実行終了時のTIO出力)

-7バイト、Erik the Outgolferのおかげ



@EriktheOutgolferありがとう!:)
TFeld 2018年

1

JavaScript、322 268 267 265バイト

(f=(a,t,s)=>a--?new Promise(r=>setTimeout(r,2e3,s+='!.'[~~(Math.random()<.5)],t(`Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:`))).then(_=>t(s)||f(a,t,s)):t(`Success rate is ${s=s.match(/!/g),s=s?s.length*2:''}0 percent (${s/2}/5)`))(5,_=>console.log(_),'')

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

JavaScript + HTML、299バイト

出力フォーマット要件を満たすため

(f=(a,t,s)=>a--?new Promise(r=>setTimeout(r,2e3,s+='!.'[~~(Math.random()<.5)])).then(_=>t(...s)&&f(a,t,s)):t(`\nSuccess rate is ${s=s.match(/!/g),s=s?s.length*2:''}0 percent (${s/2}/5)`))(5,t=(..._)=>p.innerHTML+=_.pop(),'',t(`Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:\n`))
<pre id=p></pre>


1

クリーン、305バイト

import StdEnv,Math.Random
s::!Int->Int
s _=code {
ccall sleep "I:I"
}
t::!Int->Int
t _=code {
ccall time "I:I"
}
Start#l=take 5(map((bitand)1)(genRandInt(t 0)))
=("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:\n",[if(e>0)'!''.'\\e<-l|s 2==0],"\nSuccess rate is ",20*sum l," percent (",sum l,"/5)")

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



1

PHP、161バイト

<?="Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
";for(;$x++<5;print$y?'!':'.')$z+=$y=rand()%2+sleep(2);echo"
Success rate is ",$z*20," percent ($z/5)";

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

$ php fakeping.php

Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:
.!.!.
Success rate is 40 percent (2/5)

1

C(gcc)176 174バイト

f(i,j){for(puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds"),j=i=5;sleep(2),i--;putchar(rand()%2?j--,33:46));printf("\nSuccess rate is %d percent (%d/5)",j*20,j);}

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

Rogemのおかげで2バイト節約

未ゴルフ:

f(i,j) {
    for (puts("Sending 5, 100-byte ICMP Echos, timeout is 2 seconds"),
            j = i = 5; sleep(0), i--;
            putchar(rand() % 2 ? j--, 33 : 46));
    printf("\nSuccess rate is %d percent (%d/5)",j * 20, j);
}

174と33し、46代わりに'!''.'、それぞれ。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.