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:
( 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 $p
ist in Regex 0|20|40|60|80|100
und $s
ist 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 Sending
Zeile 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 Code-Golf
Antworten:
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 dersleep()
Funktion ab, die in den Systemstandardbibliotheken definiert wird. Schleift oder rekursiert nicht.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 vonprintf()
rechts nach links gelöst werden.Wenn das aus dem Weg ist, lassen Sie uns diese Sache durchgehen.
Das Compiler-Argument
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 Fallsleep()
immer zurückkehren wird0
, ist das Ergebnis1
. 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 vonputchar()
mit46
.Nun wird diese Division
0
für!
und1
fü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 Punktzahlfflush()
anlegen, indem ich ingstdout
.quelle
APL (Dyalog Unicode) ,
147138 BytesProbieren 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⍴2
erzeugt einen 6-Element-Vektor von 2). Die Ergebnisse werden verkettet (,\
), um einen 6-Element-Vektor von 1 bis 6 Elementvektoren (z1 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⎕DL
ist 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
⎕←
quelle
⎕DL 2⊣⎕←
... ->⎕DL≢⎕←
...Java (JDK) , 227 Byte
Probieren Sie es online aus!
Der Ping in Aktion
Erklärt
quelle
C # (Visual C # Interactive Compiler) , 212 Byte
Probieren Sie es online aus!
quelle
Random
anstatt es zu speichernvar r
. Hier ist ein Link zu meinem VorschlagJavaScript + HTML, 203 + 9 = 212 Bytes
Versuch es
Wenn dies
new Date
nicht zufällig genug ist, fügen SieMath.random()
stattdessen 8 Bytes hinzu (einige andere Änderungen wurden vorgenommen, damit es in einem Snippet ordnungsgemäß ausgeführt werden kann):Code-Snippet anzeigen
quelle
PowerShell ,
166162158 ByteProbieren 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
0
bis zu4
jeder Iterationsleep
für2
Sekunden und dannwrite-host
mit einer-no
neuen Zeile wiederholt. Wir schreiben entweder ein!
oder.
ausgewähltRandom
ly und gespeichert in$x
. Wir erhöhen dann$d
basierend 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
quelle
*20
anstelle von rasieren/5*100
?Python 3 ,
221220216209208201 BytesProbieren 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
quelle
JavaScript,
322268267265 BytesProbieren Sie es online aus!
JavaScript + HTML, 299 Bytes
Um die Anforderungen an die Ausgabeformatierung zu erfüllen
quelle
Sauber , 305 Bytes
Probieren Sie es online aus!
quelle
Perl 6 , 154 Bytes
Probieren Sie es online aus!
quelle
PHP , 161 Bytes
Probieren Sie es online aus!
$ php fakeping.php
quelle
C (gcc) ,
176174 BytesProbieren Sie es online aus!
2 Bytes dank Rogem gespeichert
Ungolfed:
quelle
33
bzw.46
anstelle von'!'
und'.'
.05AB1E , 83 Bytes
Probieren Sie es online aus!
quelle
Befunge-98 (PyFunge) , 164 Bytes
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.
quelle