Ihre Aufgabe ist es, ein Programm zu erstellen, das misst, wie schnell Sie die Buchstaben des englischen Alphabets eingeben können.
- Das Programm akzeptiert nur Kleinbuchstaben
a
zuz
in alphabetischer Reihenfolge. - Jeder Buchstabe wird wie in derselben Zeile eingegeben wiedergegeben (ohne neue Zeile oder andere Trennzeichen zwischen Buchstaben).
- Wenn Sie ein ungültiges Zeichen eingeben, wird das Programm
Fail
in einer neuen Zeile ausgegeben und beendet. - Wenn Sie alle 26 Buchstaben eingeben, gibt das Programm in einer neuen Zeile die Zeit in Millisekunden aus, die vom ersten bis zum letzten Buchstaben verstrichen ist, und beendet das Programm .
- Der Timer startet, wenn Sie den ersten Buchstaben eingeben
a
.
Beispielausgaben:
b
Fail
abcdefgg
Fail
abcdefghijklmnopqrstuvwxyz
6440
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
code-golf
date
alphabet
interactive
Danko Durbić
quelle
quelle
Fail
ohne Zeilenumbruch ausgeben? (zBabdFail\n
oderabd Fail\n
))Fail
oder die Millisekunden) müssen wie im Beispiel in einer neuen Zeile stehen. Die meisten Antworten gehen davon aus.Antworten:
HTML (JavaScript (ES6)),
129126117 ByteKlicken Sie in die Eingabe und beginnen Sie zu tippen! Auch meine Eingabe ist zum Kotzen; Ich brauche ungefähr 5 Sekunden, auch mit Übung. Edit: 2 Bytes dank @HermanLauenstein durch Sprachwechsel gespeichert. 3 Bytes gespart dank @ qw3n. 9 Bytes dank @tsh gespeichert.
quelle
<input id=i><script>l=0;n=Date.now;i.onkeypress=e=>e.charCode-97-l?i.outerHTML='Fail':l>24?i.outerHTML=n()-t:t=l++?t:n()</script>
-11 Bytes, wenn das schließende Tag nicht benötigt wird<input id=i onkeypress=event.which-97-l?i.outerHTML='Fail':24<l?i.outerHTML=n()-t:t=l++?t:n() onfocus=l=0,n=Date.now>
6502 Maschinencode (C64 PAL),
189165 BytesOnline - Demo (Verbrauch:
sys49152
)Erläuterung:
Dies wäre ein winziges Programm, wenn es nicht das Problem einer exakten Millisekundenmessung auf dem C64 gäbe. Die Systemunterbrechung tritt ungefähr 60 Mal pro Sekunde auf, was nicht einmal annähernd der Fall ist. Wir müssen hier also einen Hardware-Timer verwenden, dessen Eingabeticks von der Systemuhr stammen.
Auf einem PAL-Computer ist die Systemuhr genau 985248 Hz. Das Initialisieren des Timers auf 985 gibt daher etwas in der Nähe von Millisekunden-Ticks, aber es ist etwas zu schnell, wir müssten 986 Zyklen für jeden vierten Tick zählen oder den Timer für einen einzelnen Zyklus halten. Das ist nicht möglich, aber wir können den Timer für 6 Zyklen mit der Sequenz halten
DEC $DD0E
,INC $DD0E
:$DD0E
ist der Timer - Steuerregister mit Bit 0 Schalten Sie es auf und ab, und beide Befehle nehmen 6 Zyklen, so die genauen schreibt, Stop und Start der Timer sind genau 6 Zyklen voneinander entfernt. Deshalb müssen wir diese Sequenz alle 6 * 4 = 24. Tick ausführen. Das ist immer noch nicht absolutGenau, der Timer verzögert sich nach 8 Minuten und 12 Sekunden um 1 Millisekunde, aber es ist wahrscheinlich gut genug - um dies auszugleichen, würde man viel Code benötigen.edit : Der Startwert für den Timer muss 984 sein, nicht 985, da diese Timer "bei Unterlauf" abfeuern, sodass ein Wert von 0 einen weiteren Zyklus vor dem Abfeuern zählt. Code fest, Byteanzahl unverändert.
Hier ist die kommentierte Auflistung der Demontage:
quelle
.starttimer
- werde es bald tun :) (und sogar noch weiter, indem ich das SystemTI
wie diese BASIC-Antwort verwende , aber ich bin mir nicht sicher, ob dies gültig ist, weil Sie es im Maschinencode besser machen können )Bash + Coreutils,
1039998 BytesMuss in einem Terminal ausgeführt werden.
Testlauf
quelle
3479
ist ziemlich schnell! gut gemacht :)a
gibt mir das Tippen sofortline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")
und beendet sich.date
Macht. Meins ist von GNU Coreutils 8.23. Wasdate +%s%3N
druckt auf Ihrem System?15094104833N
- dies ist das indate
macOS integrierte Dienstprogramm, wenn das einen Unterschied macht.date
anscheinend Strftime, was sie nicht erkennen%N
.Python 2 + Getch , 116 Bytes
Vielen Dank an ovs und ElPedro für die Fehlerbehebung und die Einsparung von 57 Bytes.
quelle
SOGL V0.12 , 35 Bytes
Probieren Sie es hier aus! - Klicken Sie auf Ausführen und geben Sie das Alphabet in das Eingabefeld ein. Beachten Sie, dass dies möglicherweise etwas verzögert ist, da SOGL nur alle 100 ausgeführten Token für die Eingabe pausiert (und SOGL ist ziemlich langsam). Wenn Sie das stört, führen Sie
sleepBI=true
in der Konsole.Hinweis: Führen Sie dies nicht im Kompatibilitätsmodus aus - es wird nur eine Endlosschleife ausgeführt.
Erläuterung:
quelle
Pascal (FPC) , 176 Bytes
Probieren Sie es online!
Einige Tricks im Code zum Golfen:
Real
als kürzere Alternative zuTDateTime
, da gemäß der Definition hier ,TDateTime
=Double
, welches Gleitkommatyp.MilliSecondsBetween
für die Berechnung der Zeitlücke zu verwenden, multipliziert dieser Code die Differenz zwischen zwei Gleitkommawerten mit864e5
, was aufgrund der hierTDateTime
beschriebenen Art der Free Pascal-Codierung funktioniert .Hinweis:
ReadKey
Die Funktion druckt den Schlüssel nicht auf der Konsole aus, daher ist manuelles Schreiben auf die Konsole mitWrite(c)
erforderlich.0
aus naheliegenden Gründen eine Punktzahl für die Eingabe des Alphabets.quelle
for c:='a'to'z'do
in dieselbe Zeile wie verschiebena:=Time;
.Now
stattdessen versuchen,Time
da es kürzer ist.86398338
?? Ich kann verstehen, wenn Sie mehrere 864e5, da es 864e5 Millisekunden an einem Tag gibt. aber wie kommt diese magische Zahl?TDateTime
wieDouble
.864e5
klingt korrekter, ich werde die Probleme beheben.Java,
404388354348320318 BytesUnd hier dachte ich, Java Console sei bereits ausführlich.
Da Java keine Möglichkeit hat, auf Tastendrücke in der Konsole zu warten, verwende ich eine GUI mit
java.awt
.-78 Bytes dank @ OlivierGrégoire .
Erläuterung:
Beispiel für ein erfolgreiches GIF: (Ja, ich tippe das Alphabet hier ziemlich langsam.)
Hinweis: Dies ist ein altes GIF. Die aktuelle Version druckt keine Tastendrücke mehr an die Konsole. Die Uhrzeit wird nicht mehr mit Nachkommastellen gedruckt.
Beispiel GIF von Fail:
Hinweis: Dies ist ein altes GIF. Die aktuelle Version druckt keine Tastendrücke mehr an die Konsole.
quelle
setVisible(false)
anstatt ihn zu beenden.show
unddispose
, was noch kürzer ist alssetVisible
. Ich verwende fast nie die Java-GUI. Daran sollte ich mich erinnern.TextField
. Sie können auchTextArea
anstelle vonTextField
zwei Bytes gewinnen. SchließlichKeyEvent
hat einegetWhen
Methode, die die Zeit zwischen der Epoche und dem Ereignis in Millisekunden angibt. Müssen nur diese verwenden, anstattSystem.nanoTime()
noch mehr Bytes zu gewinnen.C # (.NET Core),
245 + 13183 + 41177 + 41 Bytes+41 Bytes für
using System;using static System.Console
.Ungetestet, da ich auf dem Handy bin und dies nicht auf TIO läuft.
quelle
int x=0;
und dann zu tunx=1/x;
. Dies sollte 14 Bytes einsparen. Das brauchst du leiderx
. Wenn Sie versuchen, dies zu tun, erhalten1/0
Sie einen Compilerfehler durch Division durch Konstante Null . 2) -5 Bytes zum Kombinieren der Deklaration vonc
mit der erstenReadKey
. 3) Ändern Sie die Bedingung im innerenif
zuReadKey!=++c
und entfernen Sie diec++;else
für weitere -9 Bytes.x=1/x
kann auf reduziert werdenx/=x
. Und ich fügte hinzuusing static System.Console;
, um einige weitere Bytes zu speichern :)i
und Verwendenc
in der Schleifenbedingung gespeichert werden .MSX-BASIC, 126 Zeichen
TIME
ist eine interne MSX-BASIC-Variable, die alle 20 Millisekunden um eins erhöht wird.quelle
C # (.NET Core) ,
184 + 13 = 197173 + 13 = 186 BytesProbieren Sie es online!
Leider kann TIO dies nicht ausführen, aber es ist praktisch, um die Byteanzahl zu ermitteln.
+13 für
using System;
-1 durch Ändern
i==123
aufi>122
. Ich war versucht, das zu macheni>'z'
.Danksagung
-10 Bytes dank @raznagul
Ungolfed
quelle
ReadKey
in die Schleifenbedingung verschieben, um die ersteif
und die zweite zu entfernenbreak
.Node.js,
240213 BytesBEARBEITEN: 27 Bytes dank Jordan gespeichert
Ungolfed-Version:
quelle
C (gcc) , 303 Bytes
Funktioniert auf * nix Systemen. Eigenständiger Code, der den kanonischen Modus des aktuellen Terminals entfernt, um das Lesen von Zeichen zu ermöglichen, ohne auf neue Zeilen zu warten:
/! \ Wenn Sie dieses Programm ausführen, wird das Terminal fast unbrauchbar.
Ungolfed und kommentiert:
Alternative Lösung (218 Bytes):
Wenn die vorherige Konfiguration des Terminals zulässig ist, können wir den Teil des Codes entfernen, der diesen Teil behandelt.
Hier ist derselbe Code ohne Terminalmanipulation:
Damit es funktioniert:
Laufzeitbeispiel:
quelle
Commodore BASIC v2 - 113 Bytes
Großbuchstaben müssen verschoben werden.
Vielen Dank an Felix Palmen, der auf einige Tippfehler hingewiesen
hat
quelle
TI
wird inkrementiert), den ich für seine mangelnde Präzision als ungeeignet erachtete , aber ich denke, es ist hier faires Spiel, weil es in BASIC einfach keine Möglichkeit gibt, es besser zu machen ein Syntaxfehler in1
- irgendeine Hilfe?1on-(f=26)gO4:gEa$:ifa$=""tH1
Nitpicks sein: 1.) Ausgabe ist in der gleichen Zeile, 2.) Ausgabe ist All-Caps - Ich denke, Sie sollten diese beheben, nicht viele Bytes dauern sowieso :)Perl 5,
7993 +31 (-MTerm :: ReadKey -MTime :: HiRes = Zeit) Bytes$|=1
reicht nicht aus, um das Terminal in den Raw-Modusstty -icanon
zu versetzen, sollte vor oder ausgeführt werdenum Zeichen im Terminal zu sehen, nachdem der Befehl ausgeführt wurde:
stty echo
oderstty echo icanon
quelle
ReadKey
! Sie können ein paar Bytes hier speichern und dort,1e3
für1000
,$s||=time
und wenn Sie eingestellt$s
und dann rufenReadKey
, können Sie die Swapmap
zu einem Postfixfor
. Ich würde sagen,die
stattdessenexit print
, aber ich denke, Sie sind hier richtig ... Ich habe daran herumgebastelt,printf"\n%i"
aber das wurde größer, und ich habe darüber nachgedacht,$-
anstatt zu verwenden$s
, aber das war dumm! :)$|=1;
$ S || = Die Zeit kann nicht aus der Karte ausgelagert werden, da der Timer nach dem ersten Drücken der Taste und starten mussdie
würdeFail
auf stderr statt stdout echo .exit print
ist so lang! Entschuldigung, ich glaube nicht, dass ich meine Überlegungen fürfor
richtig erklärt habe : Sollte$s||=time,ReadKey eq$_||exit print" Fail"for a..z
funktionieren, denke ich ... Vielleicht sogar,$|=$s||=...
oder$|=map...
wenn Sie diesen Ansatz bevorzugen! Denken Sie, dass Sie es dennoch ziemlich genagelt haben!$|=map..
setzt keine ungepufferten Eingaben im neuen Terminal (ich hatte den Fehler beim Entfernen von ReadMode 3, weil ich in der gleichen Sitzung getestet habe) und$s||=time
bevor ReadKey den Timer zu früh startet$|
, aber es wird wieder nach der Schleife gespeichert, was zu spät ist! Sie sind einen Schritt voraus!Aceto , 70 Bytes
Ich beginne mit dem Setzen einer
@|
Fangmarke und dem horizontalen Spiegeln ( ), wenn der Wert auf dem Stapel wahr ist. Es ist nicht anfangs und wird es später immer sein. Wir werden später zurückspringen, wenn ein falscher Schlüssel eingegeben wird. Als nächstes drücken wir ein a auf den Stapel ('a
), duplizieren ihn und lesen ein einzelnes Zeichen vom Benutzer (d,
). Wenn die beiden Zeichen nicht gleich sind (=!
), "stürzen" wir ab ($
) und springen zur Fangmarke zurück. Ansonsten drücken wir ein weiteres "a" und drucken es aus, dann stellen wir die aktuelle Zeit ein ('apT
).Dann treten wir in unsere "Hauptschleife" ein: Wir "erhöhen" das aktuelle Zeichen und "erhöhen" das Zeichen (
'apToIc
), dann duplizieren wir es, lesen ein neues Zeichen, vergleichen es und "stürzen" ab, wenn die Zeichen nicht identisch sind (d,=!$
). Wenn wir nicht abgestürzt sind, vergleichen wir das aktuelle Zeichen mit "z" (d'z=|
), wenn es nicht gleich ist, drucken wir das Zeichen, drücken eine 1 und springen "bedingt" (in diesem Fall immer) zum nuro
im Code (Beginn unserer Hauptschleife). Wenn es gleich z war, spiegelten wir horizontal zu einem leeren Raum oben. Wir drucken "z", geben dann die aktuelle Zeit (abzüglich der Startzeit;t
) ein und multiplizieren dann die Zahl 1000 (durch Erhöhen von 10 mit der dritten Potenz;91+3F
) damit (weil wir Sekunden bekommen, nicht Millisekunden). Dann drucken wir eine neue Zeile, die Uhrzeit und beenden (pX
).Wenn wir jemals abstürzen (falsche Eingabe durch den Benutzer), springen wir ganz an den Anfang. Da wir nun einen gewissen Wahrheitswert auf dem Stapel haben, spiegeln wir horizontal auf den
u
, was die Richtung umkehrt, in die wir uns bewegen. Es wirdn
ein Zeilenumbruchzeichen gedruckt, dann"Fail"
auf den Stapel gedrückt , gedruckt und beendet (pX
).quelle
Mathematica (Notizbuchausdruck), 248 Bytes
Wie es funktioniert
Ein
DynamicModule
mit einemEventHandler
, das auf das Drücken von Kleinbuchstaben reagiert. Die Variablenx
,s
undt
halten Sie die Buchstaben so weit gedrückt, um die Startzeit und die Endzeit, respectively. Sobald wir bemerken,x
dass wir gleich sind{"a"}
, beginnen wir die Zeit; Wir zeigen entweder die Gesamtzeit an, oder die Zeichenfolge, die bisher erstellt wurde, oder"Fail"
je nachdem, welche Bedingung erfüllt ist.Wir könnten ein weiteres Byte speichern,
t<1
anstattt==0
davon auszugehen, dass niemand schnell genug ist, um das Alphabet in weniger als einer Sekunde einzugeben :)Wenn Sie dies in einem Mathematica-Notizbuch ausprobieren, müssen Sie in den Rahmen klicken, bevor Ihre Tastendrücke registriert werden. (Dies ist der Grund, warum wir den Rahmen zunächst benötigen. Wenn er
Framed
nicht vorhanden ist, ändert sich das gesamte ausgewählte Objekt, wenn eine Taste gedrückt wird, sodass die Auswahl beendet wird und Sie erneut klicken müssen.)quelle
C #,
154152 + 13 = 165 Bytes2 Bytes dank Ayb4btus Kommentaren gespart
Der obige Code enthält Leerzeichen, damit er ohne Bildlaufleiste in SE passt. Leerzeichen sind nicht Teil der Byteanzahl
und 13 Bytes für
using System;
Es ähnelt der Ayb4btu-Version, weist jedoch folgende Unterschiede auf:
Wenn Sie datetime als long speichern, können Sie auch
c
long machen und die Deklaration abkürzenLoop benötigt keine separate Pause
Die Verwendung ist nicht kürzer als das
$"interpreted strings"
Hinzufügen eines "\ n" für die Millisekunden, um es zu einer Zeichenfolge für das Inline-If zu machenDie Verwendung einer
for
Schleife ermöglicht es uns manchmal, Zeichen über eine Weile zu speichern, obwohl ich denke, dass dies nicht über das Äquivalent hinaus speichern würdewhile
Von Ayb4btu:
s=s==0
kann werdens=s<1
, undc==123
kann werdenc>122
Ungolfed
quelle
DateTime
. Sie können , indem Sie ein paar mehr Bytes speicherns=s==0
zus=s<1
(Zählen auf der Tatsache , dass s nicht negativ sein wird) und die Änderungi==123
zui>122
.i<123
musste das vor dem gehenReadKey()
, sonst wartet es nach z auf ein anderes Zeichen, bevor die Uhrzeit angezeigt wird.z
readkey.keychar 122 zurückgeben sollte, wenn der Benutzer z eingibt, c ebenfalls 122 ist, daher'z' == 122
erfolgreich ist, c dann inkrementiert wird, dann c (jetzt 123) getestet wirdc<123
und fehlschlägt und das Programm stoppt Schleife ..?c++
Inkrement verpasst, als ich es mir ansah. Ich habe es jedoch nur ausprobiert, und wenn ichabcdefghijklmnopqrstuvwxys
es eintippe, habe ich Zeit, anstatt zu scheitern. Ich glaube, es liegt daran, dassc
immer noch inkrementiert wird, obwohl dieKeyChar
Prüfung fehlschlägt, und daher diec>122
Prüfung besteht.Processing.org
133142Der erste Code wurde nicht beendet
quelle
GCC, Windows, 98 Bytes
Erfordert keine sofortige Eingabe für den ersten Schlüssel
quelle