Simulieren Sie einen Cisco Ping

8

Prämisse:

Für diejenigen im Netzwerk haben Sie höchstwahrscheinlich einen Ping an oder von einem Gerät gesendet, um sicherzustellen, dass alles richtig verbunden ist. Cisco, ein beliebtes Unternehmen in der Vernetzung [Bearbeiten] , hat einen Befehl für sie in ihrem IOS , dass wie folgt aussieht:

Erfassung

( Bildquelle )

Ihre Herausforderung besteht darin, einen Teil davon grafisch nachzubilden. Die Teile, die wir überspringen, sind Type escape sequence to abort.zusammen mit der IP-Adresse und den Umlaufzeiten die erste Zeile ( ).

Sie geben zunächst Folgendes aus:

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

Anschließend simulieren Sie die ausgehenden Echoanforderungen. Jede Anforderung beginnt mit einer Wartezeit von 2 Sekunden und der Generierung der Antwort. Eine erfolgreiche Echoantwort wird durch a dargestellt !, eine fehlgeschlagene durch .. Wir werden eigentlich keine Pakete senden, aber um den Paketverlust darzustellen, muss Ihr Programm zufällig zwischen den beiden Optionen mit einer Wahrscheinlichkeit ungleich Null für jede auswählen. Diese Zeile beginnt leer und jedes Häkchen fügt ein weiteres Zeichen hinzu.

Nach dem fünften Echo wird die Prozentzeile ausgegeben und das Programm sollte dann beendet werden. Die Prozentzeile hat das Format

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

Wo $pist in Regex 0|20|40|60|80|100und $sist die Anzahl der erfolgreichen Echos. Der Bildschirm muss nach jeder Wartezeit aktualisiert werden, indem entweder der neue Status neu gezeichnet oder an die vorhandene Echozeile angehängt wird. Dies schließt die SendingZeile ein.

Beispiellauf: (Die Anzahl der Ticks sollte nicht angezeigt werden und dient dazu zu verdeutlichen, wie die Ausgabe bei jedem Zeitschritt aussehen soll.)

#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)

Eingang:

Keine verwendbare Eingabe bereitgestellt.

Ausgabe:

Jedes vernünftige Format. Eine beispielhafte endgültige Ausgabe sieht folgendermaßen aus:

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

Regeln:

  • Sie müssen entweder an die Echolinie anhängen oder den Bildschirm nach jedem Häkchen neu zeichnen.
  • !und .müssen nicht gleich wahrscheinlich sein, nur beides möglich.
  • Aufeinanderfolgende Läufe müssen unterschiedliche Ergebnisse erzielen können
  • Gifs oder Webms Ihrer Ausgabe wären cool. Kein Bonus oder irgendetwas dafür.
  • Standardschlupflöcher verboten
  • Das ist
Veskah
quelle
Dürfen wir die Zeichenfolgen mit nachgestellten Leerzeichen drucken, wenn die Ausgabe visuell identisch ist?
J. Sallé
Sollte die letzte Zeile durch einen Zeilenvorschub beendet werden?
@ Rogem Es ist optional.
Veskah

Antworten:

5

C (gcc) , 172 Bytes

Also habe ich satte 6 Bytes von diesem Ding mit einigen ziemlich lächerlichen Tricks rasiert. Kompilieren mit -DK=!sleep(2)-putchar(rand()%2?33:46)/46. Hängt von der sleep()Funktion ab, die in den Systemstandardbibliotheken definiert wird. Schleift oder rekursiert nicht.

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);}

Probieren Sie es online aus!

Erläuterung

Diese Lösung hängt von drei kritischen Implementierungs- / Laufzeitdetails ab. Erstens sleep() darf das nicht unterbrochen werden , zB über ein Signal. Zweitens werden die Additionen und Subtraktionen in der Reihenfolge von links nach rechts aufgelöst. Drittens müssen die Argumente von printf()rechts nach links gelöst werden.

Wenn das aus dem Weg ist, lassen Sie uns diese Sache durchgehen.

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);
}

Das Compiler-Argument

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

Also, von links beginnend (dh wie es sich auflösen sollte) haben wir sleep(). sleep()Gibt die Anzahl der Sekunden zurück, die bei der Rückkehr verbleiben. Wir erwarten daher, dass der Benutzer (und andere Prozesse) freundlich sind und unseren Schlaf nicht unterbrechen. Wir nehmen die logische Ergänzung, und weil in unserem Fall sleep()immer zurückkehren wird 0, ist das Ergebnis 1. Mehr zur Bedeutung später.

Als nächstes treten wir ein putchar(). putchar()Gibt ein einzelnes 1-Byte-Zeichen aus und gibt den Wert des Bytes zurück. Also erhalten wir einen zufälligen Wert, berechnen Modulo-2 für eine schöne 50-50-Aufteilung (wenn auch mit schrecklicher Entropie) und konditionieren ihn dann ternär in unsere gewünschten Zeichen - ! (33) und . (46). Dann teilen wir den Rückgabewert von putchar()mit 46.

Nun wird diese Division 0für !und 1für zurückkehren .- also nehmen wir 1 (von !sleep()) und subtrahieren das Ergebnis der Division davon. Presto!

Okay, es gibt ein kleines Problem. Wenn Sie Dinge in einen Puffer in C (dh stdout) schreiben , wird dieser nicht unbedingt sofort auf die empfangende Seite geschrieben. Als ich dies auf einer Distribution meiner Wahl ausführte, stellte ich fest, dass die Pings erst gedruckt werden, nachdem das Programm beendet wurde. Angesichts der Tatsache, dass alle anderen Lösungen in C diese Folie zulassen und dass es wahrscheinlich irgendwo mindestens eine Maschine gibt, die dies tut , erfüllt dies alle anderen Voraussetzungen (und man könnte dies immer nur im Kernel "beheben". .), Ich werde mich nicht mit meiner Punktzahl fflush()anlegen, indem ich ing stdout.


quelle
4

APL (Dyalog Unicode) , 147 138 Bytes

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

Probieren Sie es online aus!

Dies ist eine große direkte Funktion. Wie bei anderen Antworten wird die TIO-Verbindung erst ausgegeben, nachdem die Ausführung abgeschlossen ist. Trotzdem hat @ Adám eine praktische Hilfsfunktion erstellt, mit der die Zeitstempel visualisiert werden können. Diese Version des Codes finden Sie hier .

Diese Antwort Anwendungen ⎕IO←0, die setzt den I ndex O Rigin alles von 1 auf 0.

Vielen Dank an @ngn für die 9 gespeicherten Bytes (und für die Zerstörung meiner Erklärung! Jetzt muss ich es erneut tun (ლಠ益ಠ)ლ)

Wie:

Die Funktion erhält 1 festes Argument, das sich rechts befindet.

Wie haben wir ¨1↓¨,\?6⍴2. Dieser Ausdruck wählt ( ?) zufällig zwischen 0 und 1 6 Mal ( 6⍴2erzeugt einen 6-Element-Vektor von 2). Die Ergebnisse werden verkettet ( ,\), um einen 6-Element-Vektor von 1 bis 6 Elementvektoren (z 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0. B. :) zu bilden . Das erste Element von jedem wird gelöscht ( 1↓¨), und dann wird jeder resultierende Vektor als ( ¨) übergeben, wobei die Funktion sechsmal ausgeführt wird.

{5=≢⍵⊣...:...}ist eine bedingte Aussage. Wenn es 5 Elemente hat (auch bekannt als die letzte Iteration), wird der Code nach dem Guard ( :) ausgeführt. Die versichert wird der Zustand sein , das letzte , was ausgewertet werden , so wird das Programm der Zeichenfolge vor der Wache immer drucken.

{...⎕DL≢⎕←↑⌽'.!'[⍵]'Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:'...}Erstellt einen aus dem indizierten Vektor gebildeten Vektor mit zwei Elementen '.!'[⍵], der die Erfolge und Misserfolge sowie die Ping-Zeichenfolge selbst ausgibt. Dieser Vektor wird dann in der richtigen Reihenfolge umgekehrt (monadisch ) und dann in eine Matrix gemischt (monadisch ). Diese Matrix wird dann an stdout ( ⎕←) ausgegeben und ein D e L ay ( ⎕DL) wird hinzugefügt. Das Argument für ⎕DList die Anzahl der Elemente in der Matrix ( ), nämlich 2, wodurch eine Verzögerung von 2 Sekunden zwischen Funktionsaufrufen entsteht.

{...:⎕←('Success rate is',×∘20,'percent (','/5)',⍨⍕)+/⍵}Erstellt die letzte auszugebende Zeichenfolge. Es summiert die Elemente des Arguments ( +/⍵) und übergibt das Ergebnis als Argument an die implizite Funktion in der Klammer. Diese Funktion stellt zuerst das Argument stringified ( ) mit der Zeichenfolge voran (dyadisch ,, gefolgt von ) und hängt es dann an die Zeichenfolge an . Als nächstes wird die resultierende Zeichenfolge an das 20-fache des Arguments ( ) angehängt und dann an den Rest der Ausgabe angehängt, die über an stdout gesendet wird .'/5)''percent ('×∘20⎕←

J. Sallé
quelle
Nachgestellte Newline ist in Ordnung. Kommentar hier, weil ich auf dem Handy bin
Veskah
⎕DL 2⊣⎕←... -> ⎕DL≢⎕←...
ngn
3

Java (JDK) , 227 Byte

()->{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);}

Probieren Sie es online aus!


Der Ping in Aktion

Der Ping in Aktion


Erklärt

()->{                               // 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
}
Luke Stevens
quelle
Drucken ist der Mörder dort: /
Adam
3

C # (Visual C # Interactive Compiler) , 212 Byte

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)");

Probieren Sie es online aus!

Verkörperung der Unwissenheit
quelle
2
Willkommen bei PPCG! Ich habe mir erlaubt, ein Try It Online zu erstellen! Link für Sie. Ich schlage vor, Sie bearbeiten Ihre Antwort mit der Vorlage, die TIO zum Posten von Antworten in PPCG bereitstellt (obwohl dies natürlich nicht erforderlich ist ).
J. Sallé
Sie können dies durch Inline-Konstruktion auf 299 Byte reduzieren, Randomanstatt es zu speichern var r. Hier ist ein Link zu meinem Vorschlag
Robin B
Dies stürzt für mich immer wieder mit IndexOutOfBoundsExceptions ab.
Mein Pronomen ist monicareinstate
@mypronounismonicareinstate Behoben. Wie habe ich das vor Monaten nicht gefangen?
Verkörperung der Unwissenheit
2

JavaScript + HTML, 203 + 9 = 212 Bytes

<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)

Versuch es

Wenn dies new Datenicht zufällig genug ist, fügen Sie Math.random()stattdessen 8 Bytes hinzu (einige andere Änderungen wurden vorgenommen, damit es in einem Snippet ordnungsgemäß ausgeführt werden kann):

Zottelig
quelle
2

PowerShell , 166 162 158 Byte

'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)"

Probieren Sie es online aus!

Wirklich ähnlich der Python-Antwort auf TFeld. Das Timing funktioniert nicht mit TIO (TIO wird nur nach Abschluss des Programms ausgegeben), sondern lokal.

Die erste Zeile ist nur eine Zeichenfolge in der Pipeline. Die mittlere Zeile wird von 0bis zu 4jeder Iteration sleepfür 2Sekunden und dann write-hostmit einer -noneuen Zeile wiederholt. Wir schreiben entweder ein !oder .ausgewählt Randomly und gespeichert in $x. Wir erhöhen dann $dbasierend auf $x.

Die letzte Zeile ist eine weitere (mehrzeilige) Zeichenfolge, die in der Pipeline platziert ist. In der Mitte befindet sich ein wenig Berechnung, um den Prozentsatz zu ermitteln.

-1 Byte dank Veskah
-3 Byte dank Ciaran_McCarthy

AdmBorkBork
quelle
Wenn Sie die Erfolgszeile in eine mehrzeilige Zeichenfolge verwandeln, anstatt das Back-Tick n zu verwenden (ich weiß nicht, wie ich sie in Kommentaren umgehen kann), sollte ein Byte gespeichert werden. 161 Bytes
Veskah
1
Können Sie 3 Bytes von der Verwendung *20anstelle von rasieren /5*100?
Ciaran_McCarthy
@ Veskah Ja, danke.
AdmBorkBork
@Ciaran_McCarthy Heilige Kuh, danke für das blendend offensichtliche Golf. :)
AdmBorkBork
1

Python 3 , 221 220 216 209 208 201 Bytes

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)')

Probieren Sie es online aus!

Das Timing funktioniert nicht in TIO, sondern in der Konsole. (TIO-Ausgänge am Ende der Ausführung)

-7 Bytes, danke an Erik den Outgolfer

TFeld
quelle
201 Bytes .
Erik der Outgolfer
@EriktheOutgolfer Danke! :)
TFeld
1

JavaScript, 322 268 267 265 Bytes

(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(_),'')

Probieren Sie es online aus!

JavaScript + HTML, 299 Bytes

Um die Anforderungen an die Ausgabeformatierung zu erfüllen

(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>

guest271314
quelle
1

Sauber , 305 Bytes

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)")

Probieren Sie es online aus!

Οurous
quelle
1

Perl 6 , 154 Bytes

say "Sending 5, 100-byte ICMP Echos, timeout is 2 seconds:";say
sum(map {sleep 2;.print;?/\!/},roll
5,<. !>).&{"\nSuccess rate is {$_*20} percent ($_/5)"}

Probieren Sie es online aus!

Sean
quelle
1

PHP , 161 Bytes

<?="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)";

Probieren Sie es online aus!

$ php fakeping.php

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

C (gcc) , 176 174 Bytes

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);}

Probieren Sie es online aus!

2 Bytes dank Rogem gespeichert

Ungolfed:

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);
}
Qookie
quelle
174 mit 33bzw. 46anstelle von '!'und '.'.
1

Befunge-98 (PyFunge) , 164 Bytes

#va":sdnoces 2 si tuoemit ,sohcE PMCI etyb-001 ,5 gnidneS5"k,>0"2 peels"=k
>?1'!>,+\1+:4`!jv\'^'=1p
;>0'.^;")5/",,,@>$" si etar sseccuS"afk,,:2a**.'0+"( tnecrep"9k,

Probieren Sie es online aus!

Leider konnte ich es nur auf TIO testen, wo es nach zehn Sekunden alles zurückgibt, aber es sollte wie erwartet funktionieren.

David
quelle