アルファベットを入力-できるだけ早く!


44

あなたの仕事は、英語のアルファベットの文字をどれだけ速く入力できるかを測定するプログラムを作成することです。

  • プログラムは、小文字のみ受け入れるものazアルファベット順にします。
  • 各文字は、同じ行に入力されたとおりにエコーされます(改行または文字間のその他の区切り文字はありません)。
  • 無効な文字を入力すると、プログラムはFail 新しい行に出力して終了します。
  • 26文字すべてを入力すると、プログラムは新しい行に、最初の文字から最後の文字までにかかった時間をミリ秒単位で出力して終了します。
  • 最初の文字を入力すると、タイマーが開始されますa

出力例:

b
Fail

abcdefgg
Fail

abcdefghijklmnopqrstuvwxyz
6440

これはであるため、バイト単位の最短回答が優先されます。


4
しばらく前に作成した関連プロジェクト。(15レベルは基本的にこれです)
-ETHproductions

4
Fail見出しの改行なしで出力できますか?(abdFail\nまたはabd Fail\n))
スコチネット

1
@scottinet、いいえ、結果(Failまたはミリ秒)は、例のように改行する必要があります。ほとんどの答えはすでにこれを前提としています。
ダンコドゥルビッチ

2
-1この「新しい」ルールは元の仕様にはなく、元のルール内にあったPythonの回答の1つに関する私の提案を無効にします。
エルペドロ

これは、アルファベットを印刷する最速のコードチャレンジになると予想していました。
ATaco

回答:


40

HTML(JavaScriptの(ES6))、129の 126 117バイト

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

入力をクリックして入力を開始してください!また、私のタイピングは最悪です。練習でも5秒ほどかかります。編集:言語を切り替えることで@HermanLauensteinのおかげで2バイトを節約しました。@ qw3nのおかげで3バイト節約されました。@tshのおかげで9バイト節約されました。


1
スクリプトタグでhtmlを使用して-2バイト:<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バイト
Herman L

@HermanLauenstein少なくともスニペットには終了タグが必要と思われるので、そのままにしておきます。–
ニール

2
これは同時に腹立たしくて楽しいものです。
ゼノン

1
入力にイベントを置くことはどうですか?<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>
-tsh

1
新しい行にテキストをエコーし​​ません
-dkudriavtsev

33

6502マシンコード(C64 PAL)、189 165バイト

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
  • 関数をインライン化し、他のCIA2割り込みを気にせずに-24バイト

オンラインデモ(使用方法:sys49152

スクリーンショット


説明:

C64でのミリ秒の正確な測定の問題がなければ、これは小さなプログラムになります。システム割り込みは1秒あたり 60回発生しますが、これは近いものではありません。したがって、システムクロックから入力ティックを取得するハードウェアタイマーをここで使用する必要があります。

PALマシンでは、システムクロックは正確に985248 Hzです。タイマーを985に初期化すると、ミリ秒に近いティックが得られますが、少し速すぎるため、4ティックごとに986サイクルをカウントするか、1サイクルの間タイマーを保持する必要があります。これは可能ではないですが、私たちは、配列と6サイクルのタイマーを保持することができDEC $DD0EINC $DD0E$DD0Eビット0がオンとオフを切り替えるとタイマ制御レジスタであり、両方の命令は、その停止6サイクルなので、正確な書き込みを取ると開始しますタイマーは正確に6サイクル離れています。したがって、6 * 4 = 24ティックごとにこのシーケンスを実行する必要があります。これはまだ絶対ではありません正確に言えば、タイマーは8分12秒後に1ミリ秒遅れますが、おそらくそれで十分です-その補償は多くのコードを必要とします。

編集:タイマーの開始値は985ではなく984でなければなりません。これらのタイマーは「アンダーフローで」起動するため、値0は起動前にもう1サイクルをカウントします。コードは修正され、バイト数は変更されていません。

コメント付きの逆アセンブリのリストは次のとおりです。

         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

6
さて、今、ツールボックスにある程度まともなミリ秒タイマーがあります;)いつか役に立つかもしれません。
フェリックスパルメン

11
スクリプトキディ これは本物のゴルフです。
J ...

1
@J ...私はインライン化することによって、さらにゴルフ、それを可能性.starttimer- :)すぐに行います(そしてさらにシステムを使用してTIのように、この基本的な答えは、あなたがするので、しかし、私は確かに、これは有効ではないよ可能マシンコードにもっと良いです)
フェリックスパルメン

うわー、時間測定の誤差を最初に計算するときに985の係数を逃しました-実際にはかなり良いです(計算で別の誤差を作成した場合は、指摘してください!):)
Felix Palmen

そして、この男がGITHUBに何を持っているかわかりますか?:アンドロイドブートリカバリ.... 彼のプロフィールがお気に入りです。
ルチアーノアンドレスマティーニ

13

Bash + coreutils、103 99 98バイト

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"

ターミナルで実行する必要があります。

テスト走行

$ 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

4
3479かなり速いです!よくやった:)
RobAu

特定のバージョンのbashが必要ですか?4.4.12では、入力するとaすぐにline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")終了して終了します。
numbermaniac

@numbermaniac Bashのバージョンは重要ではありませんが、強力なバージョンは重要dateです。私のものはGNU coreutils 8.23のものです。date +%s%3Nシステムで何が印刷されますか?
デニス

@Dennisが出力します15094104833N-これがdatemacOSの組み込みユーティリティです(違いがある場合)。
numbermaniac

1
@numbermaniac BSDはdatestrftimeを使用しているようですが、これはを認識しません%N
デニス

9

Python 2 + getch、116バイト

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

コードを修正して57バイトを節約してくれたovsとElPedroに感謝します。


7

SOGL V0.12、35のバイト

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

ここで試してみてください!-[実行]をクリックし、入力ボックスにアルファベットを入力します。SOGLは、実行されたトークン100個ごとに入力を一時停止するだけなので、少し遅れることに注意してください(SOGLは非常に遅いです)。気になる場合sleepBI=trueは、コンソールで実行してください。

注:これを互換モードで実行しないでください-永久にループするだけです。

説明:

"ζ¦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

@HyperNeutrino私はそれが便利になると知っていた:p
dzaima

誰がSOGLがそれをできると期待するでしょう...ところで、辞書の単語を「失敗」させませんか?
エリックアウトゴルファー

@EriktheOutgolferよく、SOGL 汎用言語であるはずでした、うまくいきませんでした:p
dzaima

これは完全に有効であるかどうところで、私は知りませんが、その後、再び、私は考えているが、インターフェースの問題ではなくインタプリタの背後にある...かもしれない
エリックOutgolfer

@EriktheOutgolferええ、それがどれだけ有効かはわかりません、私はOPを待っていると思います。最初は、これはHTMLの回答のようなものだと思っていましたが、今ではそれを見るとかなり異なっています
-dzaima

7

パスカル(FPC)、176バイト

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.

オンラインでお試しください!

ゴルフのコードで使用されるいくつかのトリック:

  • ここで定義されているとおり、= 、これは浮動小数点型であるためReal、の短い代替として使用します。TDateTimeTDateTimeDouble
  • MilliSecondsBetweenこのコードは、時間ギャップの計算に使用する代わりに、2つの浮動小数点値の差をで乗算します。これは、ここで説明864e5するFree PascalのエンコードTDateTime方法により機能します

注意:

  • ReadKeyfunctionは実際にはコンソールにキーを出力しないため、コンソールへの手動書き込みWrite(c)が必要です。
  • TIOは、0明白な理由でアルファベットを入力するためのスコアを取得します。
  • プログラムは浮動小数点表記で時間を出力しますが、それは許されていると思います。

サイトへようこそ!
秒に共和党ケアリング

for c:='a'to'z'doをと同じ行に移動すると、1バイト節約できますa:=Time;
イスマエルミゲル

短いのNowではなく、代わりに試してみてくださいTime
tsh

なぜ86398338?1日に864e5ミリ秒があるので、複数の864e5がある場合は理解できます。しかし、このマジックナンバーはどうやって来るのでしょうか?
tsh

@tsh私も知りません。手動テストにより、たまたまその「マジック」番号を見つけましたが、PascalがTDateTimeとしてどのように保存されるかわかりませんDouble864e5より正確に聞こえる、私は問題を修正します。
user75648

5

Java、404 388 354 348 320 318バイト

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

そして、ここで私は.. Javaコンソールが冗長すでに思った
Javaは生に方法はありませんので、私はとGUIを使用し、私の知る限りコンソールにキーの押下を待ち受けますjava.awt

@OlivierGrégoireに感謝-78バイト。

説明:

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

成功のgifの例:(はい、ここにアルファベットをかなりゆっくり入力します。)
注:これは古いgifです。現在のバージョンでは、キー入力をコンソールに出力しなくなりました。そして、小数点以下の数字で時刻を表示しなくなりました。

ここに画像の説明を入力してください
失敗のgifの例:
注:これは古いgifです。現在のバージョンでは、キー入力をコンソールに出力しなくなりました。

ここに画像の説明を入力してください


2
GUIがあることを考えると印象的な答えです!
Pureferret

1
388バイト。あなたsetVisible(false)が終了する代わりに使用したため、私はゴルフに加えてコードを修正する自由を取りました。
オリビエグレゴワール

@OlivierGrégoireありがとう。忘れshowdispose、よりもさらに短くなっていますsetVisible。私はJavaのGUIを使用することはほとんどありません。そして、メインメソッドにクラスの初期化を配置する代わりに、クラスの初期化を使用するのが賢明です。覚えておいてください。
ケビンCruijssen

1
@KevinCruijssenありがとう、問題ありません;-)もっと一般的なコメントがあります:文字を2回出力する必要はありません。エコーはすでに提供されていTextFieldます。また、TextArea代わりにTextFieldを使用して2バイトを獲得することもできます。最後に、エポックとイベントの間の時間をミリ秒単位で指定KeyEventするgetWhenメソッドがあります。System.nanoTime()さらに多くのバイトを獲得する代わりに、それらを使用する必要があります。
オリビエグレゴワール

1
どういたしまして!しかし、私はさらに320バイトにそれを下げました。;-)
オリビエグレゴワール

4

C#(.NET Core)、245 + 13183 + 41177 + 41バイト

+41バイトusing System;using static System.Console

私はモバイルにいるためテストされておらず、これはTIOで実行されません。

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

1
機能するプログラムをテストせずに作成する場合は+1。ゴルフ:1)例外を生成することがわかった1つの短い方法:int x=0;そして、実行しますx=1/x;。これにより、14バイト節約できます。残念ながらあなたが必要xです。あなたがしようとした場合1/0、あなたが得る一定のゼロ除算をコンパイラエラー。2)の宣言をc最初のと結合するための-5バイトReadKey。3)内側の条件を-9バイトに変更ifReadKey!=++cて削除しc++;elseます。
raznagul

@raznagulありがとう!x=1/xに減らすことができますx/=x。そしてusing static System.Console;、もう少しバイトを節約するために追加しました:)
イアンH.

代わりにループ条件iを削除して使用すると、さらにいくつかのバイトを節約できますc
raznagul

3

MSX-BASIC、126文字

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

TIME 20ミリ秒ごとに1ずつ増加する内部MSX-BASIC変数です。


3

C#(.NET Core)184 + 13 = 197 173 + 13 = 186バイト

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

オンラインでお試しください!

残念ながらTIOはこれを実行できませんが、バイトカウントを取得するには便利です。

+13 using System;

-1に変更i==123することによりi>122。これを作りたくなりましたi>'z'

謝辞

@raznagulのおかげで-10バイト

非ゴルフ

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

1
ReadKeyループ条件に移動して、最初のifを削除し、break
raznagul

3

Node.js、240 213バイト

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)

編集:ヨルダンのおかげで27バイトを節約

ゴルフされていないバージョン:

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

3

C(gcc)、303バイト

* nixシステムで動作します。現在の端末の標準モードを削除して、改行を待たずに文字を読み取ることができるスタンドアロンコード:

/!\このプログラムを実行すると、ターミナルはほとんど使用できなくなります。

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

非ゴルフとコメント:

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

代替ソリューション(218バイト):

事前に端末を構成することが許可されている場合、その部分を処理するコードの部分を取り除くことができます。

以下は、端末操作のない同じコードです。

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

動作させるには:

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

ランタイムの例: ここに画像の説明を入力してください


3

Commodore BASIC v2-113バイト

大文字はシフトする必要があります。
誤植を指摘してくれたFelix Palmenに感謝し
ます

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"

[編集]をクリックして、修正されたマークダウンコードを表示します。
-NieDzejkob

サイトへようこそ!インタプリタ(存在する場合)へのリンクを追加して、他の人がコードをテストできるようにしますか?
コメアリンガーアーイング

まあ、これはシステムIRQを使用します(TI増分されます)精度の不足に不適当と判断しましたが、BASICでもっとうまくやる方法がないので、ここでは公平なゲームだと思います:)それでも、これを逆に貼り付けると、の構文エラー1-何か助けがありますか?
フェリックスパルメン

私はそれを理解しました、あなたは1行目にタイプミスがあり、1on-(f=26)gO4:gEa$:ifa$=""tH1Nitpicks でなければなりません:1.)出力は同じ行にあります、2。)出力はすべて大文字です-あなたはそれらを修正する必要があります、多くのバイトはかかりませんとにかく:)
フェリックスパルメン

問題を解決し、タイプミスはありませんか?
mondlos

2

Perl 5の、79 93 +31(-MTerm :: ReadKey -mtime ::ハイレゾ=時間)バイト

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

$|=1rawモードでのセット端子には十分ではなく、stty -icanon前に実行する必要がありますか

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

コマンドを実行した後、端末の文字を表示するには:stty echoまたはstty echo icanon


古きよきReadKey!あなたはここではいくつかのバイトを保存することができますし、そこ1e3のために1000$s||=timeそしてあなたが設定されている場合$s、最初と呼んでReadKey、あなたはスワップアウトすることができmap接尾辞にfor。のdie代わりに言いたいのexit printですが、あなたはそこにいると思います...私はいじくりましたprintf"\n%i"が、それはより大きくなり、の$-代わりに使用することを考えました$sが、それは愚かでした!:)
ドムヘイスティングス

@DomHastings、あなたの助けに感謝、私は4バイトを節約できましたが、バッファなしの入力を設定するために5バイトを追加しました$|=1;。また、最初のキーを押した後にタイマーを開始する必要があるため、$ s || = timeはマップからスワップアウトできませんstdoutではなくstderrでdieエコーFailします。
ナウエルフイユル

喜んでお手伝いします。アイデアを提供してくれないかと思います。ええ、それexit printは残念です、とても長いです!申し訳ありませんが、私は私は私の考えを説明したとは思わないfor適切:$s||=time,ReadKey eq$_||exit print" Fail"for a..z私は...多分考えて動作するはずです$|=$s||=...$|=map...、あなたがそのアプローチを好むならば!あなたはかなりそれを釘付けしたと思います!
ドムヘイスティングス

$|=map..(私は、同じセッションでテストしていたので、私は、ReadMode 3、削除エラーが発生しました)新しいターミナルでバッファリングされていない入力を設定していない、と$s||=time最初ReadKeyは早すぎる、タイマーを開始する前に
ナウエルFouilleul

ああ、私は約その... :)恥をチェックするスクリプトを起動した後に十分な長待っていなかった、私は今それを得る、誤解$|が、再び、それは遅すぎるループの後に格納しています!あなたは一歩先です!
ドムヘイスティングス

2

Aceto、70バイト

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

@|スタックの値が真実であれば、キャッチマークを設定し、水平にミラーリングする()ことから始めます。最初はそうではありませんが、後でそうなります。間違ったキーが入力された場合、後でここにジャンプします。次に、スタックにaをプッシュし('a)、それを複製して、ユーザーから単一の文字を読み取ります(d,)。2つの文字が等しくない(=!)場合、「クラッシュ」($)してキャッチマークに戻ります。それ以外の場合は、別の「a」を押して印刷し、現在の時刻を設定し'apTます()。

次に、「メインループ」に入ります。現在の文字を「インクリメント」し、文字('apToIc)を「インクリメント」してから、複製し、新しい文字を読み取り、比較し、文字が同一でない場合は「クラッシュ」します。 (d,=!$)。クラッシュしなかった場合は、現在の文字を「z」(d'z=|)と比較し、等しくない場合は文字を出力し、1を押して「条件付き」(この場合は常に)にジャンプしますoコード内のみ(メインループの開始)。それがzに等しかった場合、上の空きスペースに水平にミラーしました。"z"を出力し、現在の時刻(開始時刻を差し引いた値t)をプッシュしてから、1000を掛けます(10の3乗することで得られます91+3F))(秒を取得するため、ミリ秒ではありません)。次に、改行、時間を出力して終了します(pX)。

クラッシュ(ユーザーによる不適切な入力)が発生した場合、最初から最後までジャンプします。スタックにいくつかの真理値があるので、に水平にミラーリングしますu。これは、移動する方向を逆にしnます。改行文字を出力"Fail"し、スタックをプッシュして出力し、終了します(pX)。


1

Mathematica(ノートブック式)、248バイト

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[]}]]]

使い方

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[]}]]]

A DynamicModuleEventHandler小文字のキー入力への応答。変数はxs、およびtそれぞれの文字は、これまでの開始時間を押したまま、終了時間。xに等しいことに気づくとすぐに{"a"}、時間を開始します。合計時間、これまでに作成された文字列、または"Fail"どの条件が満たされたかに応じて表示されます。

誰も1秒未満でアルファベットを入力するのに十分な速度がないと仮定できる場合t<1よりもt==0、別のバイトを保存できます。

Mathematicaノートブックでこれを試している場合は、キー入力を登録する前にフレーム内をクリックする必要があることに注意してください。(これが、最初にフレームを必要とする理由です。Framed存在しない場合、キーが押されると選択されたオブジェクト全体が変化するため、選択が停止し、再度クリックする必要があります。)


1

C#、154 152 + 13 = 165バイト

Ayb4btuのコメントのおかげで2バイト節約

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

上記のコードには、スクロールバーなしでSEに収まるように空白が含まれています。空白はバイト数の一部ではありません

および13バイト using System;

Ayb4btuのバージョンに似ていますが、次の違いがあります。

  • datetimeをlongとして保存するとc、long を作成でき、宣言を短縮できます

  • ループには個別のブレークは必要ありません

  • 実際$"interpreted strings"には、ミリ秒に必要な「\ n」を追加してインラインの文字列にする場合と比べて、使用する方が短くありません。

  • forループを使用すると、しばらくの間文字を保存できることがありますが、これは同等のものを保存しないと思いますwhile

Ayb4btuから:

  • s=s==0なることができs=s<1、およびc==123になることができますc>122

非ゴルフ

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

あなたが使用した方法で素敵なソリューションDateTime。に変更s=s==0してs=s<1(sが負にならないという事実を考慮して)、さらにに変更i==123することで、さらに数バイト節約できますi>122
Ayb4btu

また、これはテストされましたか?私はその見つかったとしてi<123前に行かなければならなかったReadKey()、それ以外の場合は、後に別の文字を待っzの時間を表示する前に。
Ayb4btu

奇数、アルファベットの最後で、zユーザーがzを入力したときにreadkey.keycharが122を返すことを意味するため、cも122であるため'z' == 122成功し、cが増分され、c(現在123)がテストされc<123て失敗し、ループ..?
カイウスジャード

あなたが正しい、私はc++それを見ていたときの増分を逃した。しかし、私はそれを試しただけで、入力するabcdefghijklmnopqrstuvwxysと失敗する代わりに時間が与えられます。チェックが失敗しcても増分するKeyCharため、c>122チェックに合格するためだと思います。
Ayb4btu

良い点-おそらく++をc <123チェックに移動すると、バイトカウントが同じに保たれ、最後の文字が間違っている場合にcが増分しないようになります-今すぐデバッグする時間はありませんが、見てみましょう!乾杯:)
カイウスジャード

0

Processing.org 133 142

最初のコードは終了しませんでした

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

0

GCC、Windows、98バイト

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

最初のキーに即座に入力する必要はありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.