Hintergrund
Das echo
Programm ist so ordentlich. Sie können alles dazu sagen, und es wiederholt Ihre Worte jedes Mal perfekt! Wie cool ist das! Enttäuschenderweise wiederholt es die Eingabe auf einmal, unabhängig von Ihrer Tippgeschwindigkeit, was nicht sehr realistisch ist. Das müssen wir reparieren.
Die Aufgabe
Ihr Programm muss seine Eingabe von STDIN oder einem ähnlichen Programm erhalten. Es liest nacheinander die Zeilen des Benutzers und zeigt möglicherweise eine Eingabeaufforderung an, bis eine leere Zeile eingegeben wird. Danach werden die Zeilen in der angegebenen Reihenfolge an STDOUT oder eine gleichwertige Stelle ausgegeben. Die letzte (leere) Zeile wird nicht gedruckt, und die letzte gedruckte Zeile muss keine nachgestellte neue Zeile enthalten.
Außerdem muss das Programm die Zeitintervalle zwischen den einzelnen Zeilen beibehalten: Wenn der Benutzer x
Sekunden für die Eingabe einer Zeile benötigt hat, benötigt x
das Programm Sekunden, um diese auszudrucken. Dies gilt auch für die erste und letzte Zeile. Die leere Zeile wird nicht gedruckt, aber das Programm wartet trotzdem, bevor es beendet wird.
Beispiel
Hier ist eine Beispielsitzung mit dem Programm. Alle Aktionen, die keinen Text erzeugen, sind in Klammern angegeben, und die (optionale) Eingabeaufforderung wird als angezeigt >
.
[begin program]
> fhtagn[enter; 1.48s passed since starting program]
> yum yum[enter; 3.33s passed since previous enter]
> so cool![enter; 2.24s passed since previous enter]
> [enter; 0.23s passed since previous enter]
[wait 1.48s]fhtagn
[wait 3.33s]yum yum
[wait 2.24s]so cool!
[wait 0.23s, then end program]
Ohne die Aktionen sieht die Sitzung folgendermaßen aus:
> fhtagn
> yum yum
> so cool!
>
fhtagn
yum yum
so cool!
Regeln und Wertung
Die Wartezeiten sollten auf 0,01 Sekunden genau sein (in der Praxis geht es Ihnen gut, wenn der Durchschnittsmensch den Unterschied nicht erkennen kann). Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Wenn Ihre Sprache eine integrierte Funktion für genau diese Aufgabe hat, können Sie sie möglicherweise nicht verwenden.
yum yum
, was ziemlich umständlich war.Antworten:
CJam,
4541393634 BytesDas macht im Online-Interpreter natürlich keinen Sinn, funktioniert aber im Java-Interpreter.
Es wird keine Eingabeaufforderung angezeigt.
Erläuterung
quelle
JavaScript,
119112 BytesIn der Hoffnung, noch ein paar Bytes zum Ausschneiden zu finden.
quelle
j=i=[]
(++
wird immer noch funktionieren!), Daswhile
brauchen!=''
Sie nicht, da es falsch ist! So enttäuscht habe ich verpasstmap
! +1!=''
. War besorgt, ob die Eingabe war0
, aber es scheint, dass gut damit umgehen. Ich hatte die[]
Möglichkeit von Inkrementen schon einmal bemerkt , aber ich war albern gewesen und hatte versucht, damit umzugehenj++
. Tun++j
klappt, da[]++
ist anscheinend 0 XD Danke!do...while
in JSJavaScript, 120 Byte
Keine Chance, mit diesem Ansatz an CJam heranzukommen, aber ein einfaches Skript.
quelle
Pyth, 68 Bytes
Verschwendete eine Menge von Bytes auf den Anruf
sleep
, da Pyth keine hatsleep
Funktion.quelle
Ruby, 74
Tricks: In
*a
der ersten Zeile wird ein leeres Array initialisiert. Ich könnte es$*
stattdessen verwenden, aber es ist ein wenig lückenhaft, da es mit einigen Aufrufen gefüllt ist und mir nur ein Byte erspart.$/
ist eine neue Zeile und$_
ist die letzte Zeile, die von abgerufen wurdegets
.Bearbeiten: Schlafen am Ende kostet 20 weitere Bytes, wahrscheinlich eine Möglichkeit, es nach unten zu spielen
quelle
Time.now
genug Male mitdef n;Time.now;end
, um ganze 2 Bytes zu sparenPython 3, 124
Funktioniert nur auf Windows-Plattformen
Das Speichern der Eingabe und der Zeiten in separaten Listen kostet mich 3 weitere Bytes . Wahrscheinlich nicht der beste Ansatz.
Eine 129-Byte-Unix-freundliche Version, die Mego zu Gute kommt :
quelle
time()
stattclock()
2 Bytes sparen?SWI-Prolog, 185 Bytes
Hier gibt es wahrscheinlich viel zu golfen, aber das reicht fürs Erste ...
quelle
PowerShell,
26119012195 BytesProps to TessellatngHeckler und Tomkandy für die Golfunterstützung und Inspiration
Das Konzept ist der 121-Byte-Version unten sehr ähnlich. Wir erstellen und erstellen lediglich dynamisch eine Liste von Objekten, anstatt eine while-Schleife zu durchlaufen, um sie in einem expliziten Array zu speichern
$a
. In beiden Fällen wird diese Liste von Objekten in dieselbe foreach-Schleife weitergeleitet|%{...}
. Die Indizierung in den Ergebnis-Array-Selektor($b=!$b+!$_)
wird diesmal so formuliert, dassif($_){$_}
die folgenden Iterationen eliminiert werden , wodurch einige weitere Bytes eingespart werden.Zurück 121 Bytes
Erweitert und erklärt:
Vorher 190 Bytes
Vorher-Er-Er, 261 Bytes
Heilige Ausführlichkeit, Batman! Lassen Sie es uns aufschlüsseln:
quelle
$a=1,1;while($a[-1]-ne""){$a+=Measure-Command{$b=read-host};$a+=$b};$i=2;while($i-lt$a.length){sleep -m $a[($i++)].totalmilliseconds;$a[($i++)]}
@
aus diesem Array entfernt habe, da es in diesem Kontext nicht benötigt wird, also auf 121 .$($l=1;while($l){Measure-Command{$l=read-host};$l})|%{($_,(sleep -m($_.Ticks/1e4)))[($b=!$b+!$_)]}
- und mit einer Änderung am Toggle, so dass, wenn der String leer ist, er nicht umschaltet und stattdessen schläft - 98do{...}while($l)
Schleife und lassen Sie$l=1;
, um 95 zu erhalten )Perl 6, 70 Zeichen
Perl 6-Interpreter definiert nur drei symbolische Variablen (im Gegensatz zur Verrücktheit von Perl 5). Um genau zu sein,
$/
,$!
, und$_
. Dieses Programm verwendet sie alle, um die Kosten für die Deklaration von Variablen zu vermeidenmy
.get
liest eine Zeile aus STDIN. Im Gegensatz zu Perl 5 enthält es keinen Zeilenumbruch.now
builtin gibt eine aktuelle Zeit zurück. Wenn subtrahiert, gibt es ein Intervall, das an eine Zeichenfolge übergeben werden kann.Eine Methode mit nichts auf der linken Seite (wie
.push
und.map
in diesem Code) funktioniert$_
.Verwendung
repeat while
Schleife (bekannt alsdo while
in anderen Programmiersprachen), Perl 6 schreibt aktuelle Zeitstempel zu$/
, und schiebt die empfangenen Zeile (die es speichert auch zu$!
), und die Differenz zwischen aktueller Zeit und Zeitstempeln in$/
. Wird aufgrund der Parameterreihenfolgenow
erst berechnet, wenn eine Zeile empfangen wird.Die
while
Bedingung prüft, ob die Zeile nicht leer ist (in Perl 6"0"
ist sie im Gegensatz zu Perl 5 ein wahrer Wert).Nachdem ich alle Zeitstempel und Zeilen erhalten habe, gebe ich diese einfach an den
map
Rückruf weiter, der ein bisschen schläft und sagt, was gesagt wurde.quelle
Groovy, 202 Bytes
Radikale.
Ungolfed-Version:
quelle
JavaScript (ES6) 102
Zusammenführung der Bemühungen von Mwr247 und Dom Hastings (CW)
quelle
MATLAB,
10799Und ungolfed:
Dies ist im Timing nicht 100% genau, da es nicht die Zeit berücksichtigt, die zum Anzeigen der einzelnen Zeichenfolgen benötigt wird, aber das sollte ziemlich schnell sein, so dass es im Timing ziemlich genau sein sollte.
Nach einem kurzen Rückblick habe ich ein paar Bytes gespart, indem ich das Double-Layer-Deep-Cell-Array entfernt habe. Es stellte sich heraus, dass alles, was ich brauchte, ein war
;
, um es beim Packen richtig aufzuteilen.quelle
Java, mit Version 1.04 dieser Bibliothek , 385 Bytes
quelle
Caché ObjectScript, 123 Byte
Dies setzt wie üblich eine saubere Symboltabelle voraus, bevor es ausgeführt wird
d r
.Dieses Problem kann in ANSI MUMPS nicht gelöst werden, da der ANSI-Standard nur eine Auflösung der zweiten Ebene für die eigentliche Zeit erfordert
$H[OROLOG]
. Glücklicherweise bietet Intersystems Caché, derzeit die branchenführende Plattform für MUMPS, die implementierungsdefinierte Lösung$ZT[IME]S[TAMP]
intrinsische Auflösung auf Mikrosekundenebene.(Punktzahl war früher 105 Bytes, aber es gab einen Fehler.)
quelle
C ++ 11,
343338 BytesWollte sehen, wie viele Bytes ein Code dafür in c ++ benötigt. Viel mehr als ich erwartet hatte. Vielleicht habe ich die Lösung zu kompliziert.
Mal sehen, ob ich das irgendwie reduzieren kann.
quelle
#include
s und die Typdeklaration für entfernenmain
. Das sind 7 Bytes - nicht viel, aber ein Anfang. Möglicherweise können Sie auch verwenden,auto
anstattstring
fürs
.c
, müssen wir es nur dafür nicht spezifizieren. Ich habe anfangs versucht zu benutzenauto s
... aber es sieht so aus, als ob es konvertiert istconst char *
und nichtstd::string
. Ich frage mich, ob ich einen Alias für erstellen kannwhile
.while
Verwendung eines#define
Vielleicht zu erstellen .Bash,
91 bis90 BytesDadurch wird eine temporäre Datei erstellt
t
. Es wird eine vorhandene Datei mit demselben Namen überschrieben.Die Idee selbst ist ziemlich kurz, aber der Umgang mit Sonderzeichen in der Eingabe fügt ungefähr 15 Bytes hinzu ...
quelle
VBA,
233228 ByteIch bin sicher, das kann viel golfen werden. Sie haben nicht angegeben, wie viele Eingänge, so dass ich meine Array-Längen fest codiert, weil es dann kürzer ist
Redim preserve
.Die Eingabe erfolgt über Pop - up, ausgegeben wird ,
debug.print
weilmsgbox
ein MODAL erzeugt und der Code angehalten wird.Ich weiß nicht, wie ich testen soll, ob dies auf 0,01 s genau ist. Vielleicht kann jemand testen, aber ich gebe dem wait-Befehl die Nummer so, dass sie die Millisekunden verwenden SOLLTE, aber VBA ist nicht dafür bekannt, das zu tun, was es sollte.
Die
If goto
können eventuell durch eine gut golfene ersetzt werdenDo Loop While
.quelle
SmileBASIC, 122 Bytes
Ich denke, das könnte etwas kürzer gemacht werden.
quelle
C UNIX, 272 Bytes
Detailliert
quelle