Tippe das Alphabet - so schnell du kannst!

44

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 azu zin 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 , also gewinnt die kürzeste Antwort in Bytes.

Danko Durbić
quelle
4
Relevantes Projekt, das ich vor einiger Zeit gemacht habe. (die 15. Stufe ist im Grunde genommen diese)
ETHproductions
4
Können wir Failohne Zeilenumbruch ausgeben? (zB abdFail\noder abd Fail\n))
scottinet
1
@scottinet, nein, das Ergebnis ( Failoder die Millisekunden) müssen wie im Beispiel in einer neuen Zeile stehen. Die meisten Antworten gehen davon aus.
Danko Durbić
2
-1, da diese "neue" Regel nicht in der ursprünglichen Spezifikation enthalten war und meine Vorschläge für eine der Python-Antworten, die innerhalb der ursprünglichen Regeln lagen, ungültig macht.
ElPedro
Ich hatte erwartet, dass dies eine Herausforderung für das Drucken des Alphabets mit dem schnellsten Code sein würde .
ATaco

Antworten:

40

HTML (JavaScript (ES6)), 129 126 117 Byte

<input id=i onfocus=l=0,n=Date.now onkeypress=event.which-97-l?i.outerHTML='Fail':24<l?i.outerHTML=n()-t:t=l++?t:n()>

Klicken 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.

Neil
quelle
1
-2 Bytes unter Verwendung von HTML mit einem Skript-Tag: <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
Herman L
@HermanLauenstein Das abschließende Tag scheint zumindest für ein Snippet erforderlich zu sein, also lasse ich es in.
Neil
2
Das ist zu ärgerlich und macht gleichzeitig Spaß.
Zenon
1
Was ist mit der Eingabe eines Ereignisses? <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>
Dienstag,
1
Gibt den Text in einer neuen Zeile nicht wieder
dkudriavtsev 30.10.17
33

6502 Maschinencode (C64 PAL), 189 165 Bytes

00 C0 A9 17 8D 18 D0 A9 40 85 FE E6 FE 20 E4 FF F0 FB 20 D2 FF C5 FE 38 D0 38
C9 5A 18 F0 33 C9 41 D0 E8 A9 00 85 FC 85 FD A9 18 85 FB A9 7F 8D 0D DD A9 7F
8D 18 03 A9 C0 8D 19 03 A9 D8 8D 04 DD A9 03 8D 05 DD A9 01 8D 0E DD A9 81 8D
0D DD D0 B9 A9 7F 8D 0D DD A9 47 8D 18 03 A9 FE AD 19 03 CE 0E DD B0 14 A9 0D
20 D2 FF A4 FC A5 FD 20 91 B3 20 DD BD A9 01 A8 D0 04 A9 9D A0 C0 4C 1E AB 48
AD 0D DD 29 01 F0 14 E6 FC D0 02 E6 FD C6 FB D0 0A A9 18 85 FB CE 0E DD EE 0E
DD 68 40 0D C6 41 49 4C 00
  • -24 Bytes durch Inlining-Funktionen und ohne Berücksichtigung anderer CIA2-Interrupts

Online - Demo (Verbrauch:sys49152)

Bildschirmfoto


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: $DD0Eist 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:

         00 C0       .WORD $C000        ; load address
.C:c000  A9 17       LDA #$17           ; mode for upper/lower text
.C:c002  8D 18 D0    STA $D018          ; set in graphics chip
.C:c005  A9 40       LDA #$40           ; initialize expected character
.C:c007  85 FE       STA $FE            ; to 'a' - 1
.C:c009   .mainloop:
.C:c009  E6 FE       INC $FE            ; increment expected character
.C:c00b   .getchar:
.C:c00b  20 E4 FF    JSR $FFE4          ; read character from keyboard
.C:c00e  F0 FB       BEQ .getchar       ; until actual character entered
.C:c010  20 D2 FF    JSR $FFD2          ; output this character
.C:c013  C5 FE       CMP $FE            ; compare with expected
.C:c015  38          SEC                ; set carry as marker for error
.C:c016  D0 38       BNE .result        ; wrong character -> output result
.C:c018  C9 5A       CMP #$5A           ; compare with 'z'
.C:c01a  18          CLC                ; clear carry (no error)
.C:c01b  F0 33       BEQ .result        ; if 'z' entered, output result
.C:c01d  C9 41       CMP #$41           ; compare with 'a'
.C:c01f  D0 E8       BNE .mainloop      ; if not equal repeat main loop
.C:c021  A9 00       LDA #$00           ; initialize timer ticks to 0
.C:c023  85 FC       STA $FC
.C:c025  85 FD       STA $FD
.C:c027  A9 18       LDA #$18           ; counter for adjusting the timer
.C:c029  85 FB       STA $FB
.C:c02b  A9 7F       LDA #$7F           ; disable all CIA2 interrupts
.C:c02d  8D 0D DD    STA $DD0D
.C:c030  A9 7F       LDA #<.timertick   ; set NMI interrupt vector ...
.C:c032  8D 18 03    STA $0318
.C:c035  A9 C0       LDA #>.timertick
.C:c037  8D 19 03    STA $0319          ; ... to our own timer tick routine
.C:c03a  A9 D9       LDA #$D8           ; load timer with ...
.C:c03c  8D 04 DD    STA $DD04
.C:c03f  A9 03       LDA #$03
.C:c041  8D 05 DD    STA $DD05          ; ... 985 (-1) ticks (see description)
.C:c044  A9 01       LDA #$01           ; enable timer
.C:c046  8D 0E DD    STA $DD0E
.C:c049  A9 81       LDA #$81           ; enable timer interrupt
.C:c04b  8D 0D DD    STA $DD0D
.C:c04e  D0 B9       BNE .mainloop      ; repeat main loop
.C:c050   .result:
.C:c050  A9 7F       LDA #$7F           ; disable all CIA2 interrupts
.C:c052  8D 0D DD    STA $DD0D
.C:c055  A9 47       LDA #$47           ; set NMI interrupt vector ...
.C:c057  8D 18 03    STA $0318
.C:c05a  A9 FE       LDA #$FE
.C:c05c  AD 19 03    LDA $0319          ; ... back to system default
.C:c05f  CE 0E DD    DEC $DD0E          ; disable timer
.C:c062  B0 14       BCS .fail          ; if carry set, output fail
.C:c064  A9 0D       LDA #$0D           ; load newline
.C:c066  20 D2 FF    JSR $FFD2          ; and output
.C:c069  A4 FC       LDY $FC            ; load timer value in
.C:c06b  A5 FD       LDA $FD            ; A and Y
.C:c06d  20 91 B3    JSR $B391          ; convert to float
.C:c070  20 DD BD    JSR $BDDD          ; convert float to string
.C:c073  A9 01       LDA #$01           ; load address of
.C:c075  A8          TAY                ; string buffer
.C:c076  D0 04       BNE .out           ; and to output
.C:c078   .fail:
.C:c078  A9 9D       LDA #<.failstr     ; load address of "Fail" string
.C:c07a  A0 C0       LDY #>.failstr     ; in A and Y
.C:c07c   .out:
.C:c07c  4C 1E AB    JMP $AB1E          ; done; OS routine for string output
.C:c07f   .timertick:
.C:c07f  48          PHA                ; save accu
.C:c080  AD 0D DD    LDA $DD0D          ; load interrupt control register
.C:c083  29 01       AND #$01           ; to know whether it was a timer NMI
.C:c085  F0 14       BEQ .tickdone      ; if not -> done
.C:c087  E6 FC       INC $FC            ; increment timer ticks ...
.C:c089  D0 02       BNE .adjusttick
.C:c08b  E6 FD       INC $FD            ; high byte only on overflow
.C:c08d   .adjusttick:
.C:c08d  C6 FB       DEC $FB            ; decrement counter for adjusting
.C:c08f  D0 0A       BNE .tickdone      ; not 0 yet -> nothing to do
.C:c091  A9 18       LDA #$18           ; restore counter for adjusting
.C:c093  85 FB       STA $FB
.C:c095  CE 0E DD    DEC $DD0E          ; halt timer for exactly
.C:c098  EE 0E DD    INC $DD0E          ; 6 cycles
.C:c09b   .tickdone:
.C:c09b  68          PLA                ; restore accu
.C:c09c  40          RTI
.C:c09d   .failstr:
.C:c09d  0D C6 41    .BYTE $0D,"Fa"
.C:c0a0  49 4C 00    .BYTE "il",$00
Felix Palmen
quelle
6
Nun, jetzt habe ich einen etwas anständigen Millisekunden-Timer in meiner Toolbox;) könnte eines Tages nützlich sein.
Felix Palmen
11
Pass auf, Script Kiddies. Das ist echtes Golf.
J ...
1
@J ... Ich könnte es durch Inlining weiter verbessern .starttimer- werde es bald tun :) (und sogar noch weiter, indem ich das System TIwie diese BASIC-Antwort verwende , aber ich bin mir nicht sicher, ob dies gültig ist, weil Sie es im Maschinencode besser machen können )
Felix Palmen
Wow, ich habe einen Faktor von 985 verpasst, als ich zuerst den Fehler in meiner Zeitmessung berechnet habe - es ist eigentlich ziemlich gut, wie es ist (wenn ich einen anderen Fehler in meinen Berechnungen gemacht habe, bitte darauf hinweisen!) :)
Felix Palmen
Und siehst du was dieser Typ im GITHUB hat ?: Android Boot Recovery ... er ist total verrückt! hat sein Profil zu Favoriten hinzugefügt.
Luciano Andress Martini
13

Bash + Coreutils, 103 99 98 Bytes

for((;c==p%26;r=`date +%s%3N`-(s=s?s:r),c=62#$c-9,p++))
{
read -N1 c
}
((c==p))||r=Fail
echo "
$r"

Muss in einem Terminal ausgeführt werden.

Testlauf

$ bash type.sh
abcdefghijklmnopqrstuvwxyz
3479
$ bash type.sh
abcz
Fail
$ bash type.sh 2>&- # typing '@' would print to STDERR
ab@
Fail
$ bash type.sh
A
Fail
Dennis
quelle
4
3479ist ziemlich schnell! gut gemacht :)
RobAu
Gibt es eine bestimmte Version von Bash oder etwas? Am 4.4.12 agibt mir das Tippen sofort line 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")und beendet sich.
Numbermaniac
@numbermaniac Die Version von Bash sollte keine Rolle spielen, aber die mit der dateMacht. Meins ist von GNU Coreutils 8.23. Was date +%s%3Ndruckt auf Ihrem System?
Dennis
@Dennis gibt es aus 15094104833N- dies ist das in datemacOS integrierte Dienstprogramm, wenn das einen Unterschied macht.
Numbermaniac
1
@numbermaniac BSDs verwenden dateanscheinend Strftime, was sie nicht erkennen %N.
Dennis
9

Python 2 + Getch , 116 Bytes

import time,getch
t=[i+97-ord(getch.getche())and exit("Fail")or time.time()for i in range(26)]
print(t[-1]-t[0])*1e3

Vielen Dank an ovs und ElPedro für die Fehlerbehebung und die Einsparung von 57 Bytes.

LyricLy
quelle
7

SOGL V0.12 , 35 Bytes

"ζ¦F‘→I
]I!}Su[I:lzm≠?■Fail←z=?Suκ←

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=truein der Konsole.

Hinweis: Führen Sie dies nicht im Kompatibilitätsmodus aus - es wird nur eine Endlosschleife ausgeführt.

Erläuterung:

"ζ¦F‘    push "inputs.value" (yes, that is a word in SOGLs english dictionary)
     →   execute as JS, pushing the inputs contents
      I  named function I


]  }                do while POP is truthy
 I                    execute I
  !                   negate it - check if it's empty
    Su              push the current milliseconds since start
[                   loop
 I                    execute I
  :                   duplicate the result
   l                  let its length
    zm                mold the alphabet to that size
      ≠?              if that isn't equal to one of the result copies
        ■Fail           push "Fail"
             ←          and exit, implicitly outputting that
              z=?     if the other copy is equal to the alphabet
                 Su     push the milliseconds since start
                   κ    subtract the starting milliseconds from that
                    ←   and exit, implicitly outputting the result
dzaima
quelle
@HyperNeutrino Ich wusste, dass es nützlich sein würde: p
dzaima
Wer würde erwarten, dass SOGL das kann? Ist "Fail" übrigens kein Wort im Wörterbuch?
Erik der Outgolfer
@EriktheOutgolfer Nun, SOGL sollte eine Allzwecksprache sein, aber das hat nicht
geklappt
Übrigens, ich weiß nicht, ob dies vollständig gültig ist, aber
andererseits
@EriktheOutgolfer ja, ich weiß nicht wie gültig das ist, ich schätze ich warte auf den OP. Zuerst dachte ich, dass dies so etwas wie die HTML-Antwort ist, aber jetzt, wo ich es mir
ansehe
7

Pascal (FPC) , 176 Bytes

Uses CRT,SysUtils;Var c:char;a:Real;Begin
for c:='a'to'z'do
if c=ReadKey then
begin Write(c);if c='a'then a:=Now;end
else
begin
Write('Fail');Halt;end;Write((Now-a)*864e5)
End.

Probieren Sie es online!

Einige Tricks im Code zum Golfen:

  • Verwenden Realals kürzere Alternative zu TDateTime, da gemäß der Definition hier , TDateTime= Double, welches Gleitkommatyp.
  • Anstatt MilliSecondsBetweenfür die Berechnung der Zeitlücke zu verwenden, multipliziert dieser Code die Differenz zwischen zwei Gleitkommawerten mit 864e5, was aufgrund der hierTDateTime beschriebenen Art der Free Pascal-Codierung funktioniert .

Hinweis:

  • ReadKeyDie Funktion druckt den Schlüssel nicht auf der Konsole aus, daher ist manuelles Schreiben auf die Konsole mit Write(c)erforderlich.
  • TIO erzielt 0aus naheliegenden Gründen eine Punktzahl für die Eingabe des Alphabets.
  • Das Programm druckt die Zeit in Gleitkommanotation, das ist wohl erlaubt.
user75648
quelle
Willkommen auf der Seite!
Caird Coinheringaahing
Sie können 1 Byte speichern, indem Sie for c:='a'to'z'doin dieselbe Zeile wie verschieben a:=Time;.
Ismael Miguel
Vielleicht solltest du es Nowstattdessen versuchen, Timeda es kürzer ist.
Dienstag,
Warum 86398338?? Ich kann verstehen, wenn Sie mehrere 864e5, da es 864e5 Millisekunden an einem Tag gibt. aber wie kommt diese magische Zahl?
Dienstag,
@tsh weiß ich auch nicht. Durch die manuelle Prüfung geschieht ich diese „magische“ Zahl zu finden, und ich weiß nicht , wie Pascal Speicher TDateTimewie Double. 864e5klingt korrekter, ich werde die Probleme beheben.
User75648
5

Java, 404 388 354 348 320 318 Bytes

import java.awt.*;import java.awt.event.*;interface M{static void main(String[]a){new Frame(){{add(new TextArea(){{addKeyListener(new KeyAdapter(){long t,i=64;public void keyPressed(KeyEvent e){t=t>0?t:e.getWhen();if(e.getKeyChar()!=++i|i>89){System.out.print(i>89?e.getWhen()-t:"Fail");dispose();}}});}});show();}};}}

Und 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:

import java.awt.*;                 // Required import for Frame and TextField
import java.awt.event.*;           // Required import for KeyAdapter and KeyEvent
interface M{                       // Class
  static void main(String[]a){     //  Mandatory main-method
    new Frame(){                   //   Create the GUI-Frame
      {                            //    With an initialization-block
        add(new TextArea(){        //     Add an input-field
          {                        //      With it's own initialization-block
            addKeyListener(new KeyAdapter(){
                                   //       Add a KeyAdapter to the input-field
              long t,              //        Long to save the time
                   i=64;           //        Previous character, starting at code of 'a' -1
              public void keyPressed(KeyEvent e){ 
                                   //        Override the keyPressed-method:
                t=t>0?             //         If `t` is already set:
                   t               //          Leave it the same
                  :                //         Else:
                   e.getWhen();    //          Save the current time (== start the timer)
                if(e.getKeyCode()!=++i
                                   //         As soon as an incorrect character is pressed,
                   |i>89){         //         or we've reached 'z':
                  System.out.print(i>89?
                                   //          If we're at 'z':
                    e.getWhen()-t  //           Print the end-time in ms to the Console
                   :               //          Else (an incorrect character was pressed)
                    "Fail");       //           Print "Fail" to the Console
                  dispose();}      //          And exit the application
              }                    //        End of keyPressed-method
            });                    //       End of KeyAdapter
          }                        //      End of input-field initialization-block
        });                        //     End of input-field
        show();                    //     Initially show the Frame
      }                            //    End of Frame initialization-block
    };                             //   End of Frame 
  }                                //  End of main-method
}                                  // End of class

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.

Bildbeschreibung hier eingeben
Beispiel GIF von Fail:
Hinweis: Dies ist ein altes GIF. Die aktuelle Version druckt keine Tastendrücke mehr an die Konsole.

Bildbeschreibung hier eingeben

Kevin Cruijssen
quelle
2
beeindruckende Antwort, wenn man bedenkt, dass es eine GUI hat!
Pureferret
1
388 Bytes . Ich habe mir erlaubt, Ihren Code zusätzlich zum Golfen zu korrigieren, weil Sie ihn verwendet haben, setVisible(false)anstatt ihn zu beenden.
Olivier Grégoire
@ OlivierGrégoire Danke. Vergaß showund dispose, was noch kürzer ist als setVisible. Ich verwende fast nie die Java-GUI. Daran sollte ich mich erinnern.
Kevin Cruijssen
1
@ KevinCruijssen Danke, und kein Problem ;-) Obwohl einige allgemeinere Kommentare: Sie müssen die Buchstaben nicht zweimal ausgeben. Das Echo wird bereits von bereitgestellt TextField. Sie können auch TextAreaanstelle von TextFieldzwei Bytes gewinnen. Schließlich KeyEventhat eine getWhenMethode, die die Zeit zwischen der Epoche und dem Ereignis in Millisekunden angibt. Müssen nur diese verwenden, anstatt System.nanoTime()noch mehr Bytes zu gewinnen.
Olivier Grégoire
1
Bitte! Aber ich habe es weiter auf 320 Bytes reduziert . ;-)
Olivier Grégoire
4

C # (.NET Core), 245 + 13 183 + 41 177 + 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.

n=>{int c=ReadKey().KeyChar,x=0;try{if(c!=97)x/=x;var s=DateTime.Now;while(c<149)if(ReadKey().KeyChar!=c++)x/=x;Write((DateTime.Now-s).TotalMilliseconds);}catch{Write("Fail");}}
Ian H.
quelle
1
+1 für das Erstellen eines funktionierenden Programms, ohne es testen zu können. Golfen: 1) Ein kürzerer Weg, den ich gefunden habe, um die Ausnahme zu produzieren: int x=0;und dann zu tun x=1/x;. Dies sollte 14 Bytes einsparen. Das brauchst du leider x. Wenn Sie versuchen, dies zu tun, erhalten 1/0Sie einen Compilerfehler durch Division durch Konstante Null . 2) -5 Bytes zum Kombinieren der Deklaration von cmit der ersten ReadKey. 3) Ändern Sie die Bedingung im inneren ifzu ReadKey!=++cund entfernen Sie die c++;elsefür weitere -9 Bytes.
Raznagul
@raznagul Danke! x=1/xkann auf reduziert werden x/=x. Und ich fügte hinzu using static System.Console;, um einige weitere Bytes zu speichern :)
Ian H.
Einige weitere Bytes können durch Entfernen iund Verwenden cin der Schleifenbedingung gespeichert werden .
Raznagul
3

MSX-BASIC, 126 Zeichen

1C=97:GOSUB3:TIME=0
2IFASC(C$)<>CTHEN?"Fail":ENDELSEIFC=122THEN?TIME*20:ENDELSEC=C+1:GOSUB3:GOTO2
3C$=INKEY$:IFC$=""GOTO3
4RETURN

TIME ist eine interne MSX-BASIC-Variable, die alle 20 Millisekunden um eins erhöht wird.

Konamiman
quelle
3

C # (.NET Core) , 184 + 13 = 197 173 + 13 = 186 Bytes

()=>{var s=DateTime.Now;var i=97;while(i<123&&Console.ReadKey().KeyChar==i)if(i++<98)s=DateTime.Now;Console.Write(i>122?$"\n{(DateTime.Now-s).TotalMilliseconds}":"\nFail");}

Probieren 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==123auf i>122. Ich war versucht, das zu machen i>'z'.

Danksagung

-10 Bytes dank @raznagul

Ungolfed

()=>{
    var s=DateTime.Now;
    var i=97;

    while(i<123&&Console.ReadKey().KeyChar==i)
        if(i++<98)
            s=DateTime.Now;

    Console.Write(i>122?
        $"\n{(DateTime.Now-s).TotalMilliseconds}":
        "\nFail"
    );
} 
Ayb4btu
quelle
1
Sie können einige Bytes sparen, indem Sie die ReadKeyin die Schleifenbedingung verschieben, um die erste ifund die zweite zu entfernen break.
Raznagul
3

Node.js, 240 213 Bytes

require('readline',{stdin:i,stdout:o,exit:e}=process).emitKeypressEvents(i)
w=s=>o.write(s)
n=0
i.on('keypress',c=>w(c)&&c.charCodeAt()-97-n?e(w(`
Fail`)):!n++?s=d():n>25&&e(w(`
`+(d()-s)))).setRawMode(d=Date.now)

BEARBEITEN: 27 Bytes dank Jordan gespeichert

Ungolfed-Version:

const readline = require('readline')

let index = 0
let start

readline.emitKeypressEvents(process.stdin)
process.stdin.setRawMode(true)

process.stdin.on('keypress', character => {
  process.stdout.write(character )

  // Lookup character in ASCII table
  if (character !== String.fromCharCode(97 + index) {
    process.stdout.write('\nFail')
    process.exit()
  }

  index++

  if (index === 1) {
    start = Date.now()
  }

  if (index === 26) {
    process.stdout.write('\n' + (Date.now() - start))
    process.exit()
  }
})
Saming
quelle
3

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.

#import <stdlib.h>
#import <termios.h>
#define x gettimeofday(&t,0)
#define r t.tv_sec*1000+t.tv_usec/1000
c,i=97;main(){long s=0;struct termios n;struct timeval t;cfmakeraw(&n);n.c_lflag|=ECHO;tcsetattr(0,0,&n);for(;i<'d';){c=getchar();if(c!=i++)puts("\nFail"),exit(0);x;s=s?:r;}x;printf("\n%ld",r-s);}

Ungolfed und kommentiert:

// needed in order to make gcc aware of struct termios
// and struct timeval sizes
#import <stdlib.h>
#import <termios.h>

// gets the time in a timeval structure, containing
// the number of seconds since the epoch, and the number
// of µsecs elapsed in that second
// (shorter than clock_gettime)
#define x gettimeofday(&t,0)
// convert a timeval structure to Epoch-millis
#define r t.tv_sec*1000+t.tv_usec/1000

// both integers
// c will contain the chars read on stdin
// 97 is 'a' in ASCII
c,i=97;

main(){
  long s=0; // will contain the timestamp of the 1st char entered
  struct timeval t; // will contain the timestamp read from gettimeofday

  // setting up the terminal
  struct termios n;
  cfmakeraw(&n);//create a raw terminal configuration
  n.c_lflag|=ECHO;//makes the terminal echo each character typed
  tcsetattr(0,0,&n);//applies the new settings

  // from 'a' to 'z'...
  for(;i<'{';){
    // read 1 char on stdin
    c=getchar();

    // if int value of the input char != expected one => fail&exit
    if(c!=i++)puts("\nFail"),exit(0);

    // macro x: get current timestamp
    x;

    // if not already set: set starting timestamp
    s=s?:r;
  }

  // get end of sequence timestamp
  x;

  // prints the end-start timestamps difference
  printf("\n%ld",r-s);
}

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:

#import <stdlib.h>
#define x gettimeofday(&t,0)
#define r t.tv_sec*1000+t.tv_usec/1000
c,i=97;main(){long s=0;struct timeval t;for(;i<'{';){c=getchar();if(c!=i++)puts("\nFail"),exit(0);x;s=s?:r;}x;printf("\n%ld",r-s);}

Damit es funktioniert:

$ gcc golf.c
$ stty -icanon
$ a.out

Laufzeitbeispiel: Bildbeschreibung hier eingeben

scottinet
quelle
3

Commodore BASIC v2 - 113 Bytes

Großbuchstaben müssen verschoben werden.
Vielen Dank an Felix Palmen, der auf einige Tippfehler hingewiesen
hat

0d=64
1on-(f=26)gO5:gEa$:ifa$=""tH1
2iff=0tHt=ti
3f=f+1:ifa$<>cH(d+f)tH6
4?cH(14)a$;:gO1
5?:?(ti-t)/60*1000:eN
6?"Fail"
Mondlos
quelle
Klicken Sie auf Bearbeiten, um den korrigierten Abschriftencode anzuzeigen.
NieDzejkob
Willkommen auf der Seite! Könnten Sie einen Link zu einem Interpreter hinzufügen (falls vorhanden), damit andere Ihren Code testen können?
Caird Coinheringaahing
Nun, dies verwendet den System-IRQ ( TIwird 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 in 1- irgendeine Hilfe?
Felix Palmen
Ich habe es selbst herausgefunden, Sie haben einen Tippfehler in Zeile eins, sollte 1on-(f=26)gO4:gEa$:ifa$=""tH1Nitpicks sein: 1.) Ausgabe ist in der gleichen Zeile, 2.) Ausgabe ist All-Caps - Ich denke, Sie sollten diese beheben, nicht viele Bytes dauern sowieso :)
Felix Palmen
Wurden die Probleme behoben und sind noch Tippfehler aufgetreten?
Montag,
2

Perl 5, 79 93 +31 (-MTerm :: ReadKey -MTime :: HiRes = Zeit) Bytes

$|=1;map{ReadKey eq$_||exit print"
Fail";$s||=time}a..z;print$/,0|1e3*(time-$s)

$|=1reicht nicht aus, um das Terminal in den Raw-Modus stty -icanonzu versetzen, sollte vor oder ausgeführt werden

ReadMode 3;map{ReadKey eq$_||exit print"
Fail";print;$s||=time}a..z;print$/,0|1e3*(time-$s)

um Zeichen im Terminal zu sehen, nachdem der Befehl ausgeführt wurde: stty echooderstty echo icanon

Nahuel Fouilleul
quelle
Gut alt ReadKey! Sie können ein paar Bytes hier speichern und dort, 1e3für 1000, $s||=timeund wenn Sie eingestellt $sund dann rufen ReadKey, können Sie die Swap mapzu einem Postfix for. Ich würde sagen, diestattdessen exit 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! :)
Dom Hastings
@DomHastings, danke für deine Hilfe, ich konnte 4 Bytes sparen, aber ich habe 5 Bytes hinzugefügt, um die ungepufferte Eingabe zu setzen. $|=1;$ S || = Die Zeit kann nicht aus der Karte ausgelagert werden, da der Timer nach dem ersten Drücken der Taste und starten muss diewürde Failauf stderr statt stdout echo .
Nahuel Fouilleul
Gerne helfen wir Ihnen weiter, ich freue mich auf Ihre Ideen! Ja, es ist schade, exit printist so lang! Entschuldigung, ich glaube nicht, dass ich meine Überlegungen für forrichtig erklärt habe : Sollte $s||=time,ReadKey eq$_||exit print" Fail"for a..zfunktionieren, denke ich ... Vielleicht sogar, $|=$s||=...oder $|=map...wenn Sie diesen Ansatz bevorzugen! Denken Sie, dass Sie es dennoch ziemlich genagelt haben!
Dom Hastings
$|=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||=timebevor ReadKey den Timer zu früh startet
Nahuel Fouilleul
Ahh, ich habe es falsch verstanden, ich verstehe es jetzt, habe nicht lange genug gewartet, nachdem ich mit dem Skript angefangen habe, um das zu überprüfen ... :) Schade $|, aber es wird wieder nach der Schleife gespeichert, was zu spät ist! Sie sind einen Schritt voraus!
Dom Hastings
2

Aceto , 70 Bytes

d'|d 't9
$z=p zp1
!=   >#v
d,   1 +
cTpaXpn3
Io$'p"*F
|'!=ilnu
@ad,aF"

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 nur oim 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 wird nein Zeilenumbruchzeichen gedruckt, dann "Fail"auf den Stapel gedrückt , gedruckt und beendet ( pX).

L3viathan
quelle
1

Mathematica (Notizbuchausdruck), 248 Bytes

DynamicModule[{x={},s=0,t=0},EventHandler[Framed@Dynamic[If[x=={"a"}&&s<1,s=SessionTime[]];Which[x==a,If[t==0,t=SessionTime[]-s];1000t,x==a~Take~Length@x,""<>x,1>0,"Fail"]],Table[{"KeyDown",c}:>x~AppendTo~CurrentValue@"EventKey",{c,a=Alphabet[]}]]]

Wie es funktioniert

DynamicModule[{x={},s=0,t=0},
  EventHandler[
    Framed@Dynamic[
      If[x=={"a"} && s<1,s=SessionTime[]];
      Which[
        x==a,If[t==0,t=SessionTime[]-s];1000t,
        x==a~Take~Length@x,""<>x,
        1>0,"Fail"]],
    Table[{"KeyDown",c}:>x~AppendTo~CurrentValue@"EventKey",
      {c,a=Alphabet[]}]]]

Ein DynamicModulemit einem EventHandler, das auf das Drücken von Kleinbuchstaben reagiert. Die Variablen x, sund thalten Sie die Buchstaben so weit gedrückt, um die Startzeit und die Endzeit, respectively. Sobald wir bemerken, xdass 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<1anstatt t==0davon 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 Framednicht 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.)

Mischa Lawrow
quelle
1

C #, 154 152 + 13 = 165 Bytes

2 Bytes dank Ayb4btus Kommentaren gespart

x=>{
  long t=0,c=97;
  for(;Console.ReadKey().KeyChar==c++&&c<123;t=t<1?DateTime.Now.Ticks:t);
  Console.Write(c>122?"\n"+(DateTime.Now.Ticks-t)/1e4:"\nFail");
}

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 clong machen und die Deklaration abkürzen

  • Loop 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 machen

  • Die Verwendung einer forSchleife 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==0kann werden s=s<1, und c==123kann werdenc>122

Ungolfed

long t=0,c=97;

for (;                                         //no loop vars declared
  Console.ReadKey().KeyChar == c++ && c < 123; //loop test
  t = t < 1 ? DateTime.Now.Ticks : t          //post-loop assigns
) ;                                            //empty loop body!

//now just need to turn ticks into millis, 10,000 ticks per millis
Console.Write(c>122?"\n"+(DateTime.Now.Ticks-t)/1e4:"\nFail");
Caius Jard
quelle
Schöne Lösung mit, wie Sie verwendet haben DateTime. Sie können , indem Sie ein paar mehr Bytes speichern s=s==0zu s=s<1(Zählen auf der Tatsache , dass s nicht negativ sein wird) und die Änderung i==123zu i>122.
Ayb4btu
Wurde dies auch getestet? Wie ich festgestellt habe, i<123musste das vor dem gehen ReadKey(), sonst wartet es nach z auf ein anderes Zeichen, bevor die Uhrzeit angezeigt wird.
Ayb4btu
Ungerade, weil am Ende des Alphabets zreadkey.keychar 122 zurückgeben sollte, wenn der Benutzer z eingibt, c ebenfalls 122 ist, daher 'z' == 122erfolgreich ist, c dann inkrementiert wird, dann c (jetzt 123) getestet wird c<123und fehlschlägt und das Programm stoppt Schleife ..?
Caius Jard
Du hast recht, ich habe das c++Inkrement verpasst, als ich es mir ansah. Ich habe es jedoch nur ausprobiert, und wenn ich abcdefghijklmnopqrstuvwxyses eintippe, habe ich Zeit, anstatt zu scheitern. Ich glaube, es liegt daran, dass cimmer noch inkrementiert wird, obwohl die KeyCharPrüfung fehlschlägt, und daher die c>122Prüfung besteht.
Ayb4btu
Guter Punkt - vielleicht behält das Verschieben von ++ auf c <123 den gleichen Bytecount bei und verhindert, dass das c erhöht wird, wenn das letzte Zeichen falsch ist - keine Zeit zum Debuggen, aber ich werde es mir ansehen! Prost :)
Caius Jard
0

Processing.org 133 142

Der erste Code wurde nicht beendet

char k=97;int m;void draw(){if(key==k){m=m<1?millis():m;print(key=k++,k>122?"\n"+(millis()-m):"");}if(m>0&&key!=k-1){print("\nFail");exit();}}
PrincePolka
quelle
0

GCC, Windows, 98 Bytes

t;main(i){for(;i++<27;t=t?:clock())if(95+i-getche())return puts("\nFail");printf("\n%d",clock()-t);}

Erfordert keine sofortige Eingabe für den ersten Schlüssel

l4m2
quelle