वर्णमाला टाइप करें - उपवास जितना आप कर सकते हैं!


44

आपका कार्य एक कार्यक्रम बनाना है जो मापता है कि आप अंग्रेजी वर्णमाला के अक्षरों को कितनी तेजी से टाइप कर सकते हैं।

  • कार्यक्रम केवल वर्णमाला क्रम में लोअरकेस अक्षरों aको स्वीकार करेगा z
  • प्रत्येक अक्षर एक ही लाइन (नई लाइन या अक्षरों के बीच किसी अन्य विभाजक के बिना) पर टाइप किया गया है।
  • यदि आप एक अमान्य वर्ण टाइप करते हैं, तो प्रोग्राम Fail एक नई लाइन पर आउटपुट करेगा और बाहर निकल जाएगा।
  • यदि आप सभी 26 अक्षरों को प्रोग्राम में टाइप करते हैं, तो एक नई लाइन पर , पहले से अंतिम पत्र और बाहर निकलने में मिली सेकंड में समय का उत्पादन करें।
  • जब आप पहला अक्षर लिखते हैं, तो टाइमर शुरू होता है a

उदाहरण आउटपुट:

b
Fail

abcdefgg
Fail

abcdefghijklmnopqrstuvwxyz
6440

यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है।


4
प्रासंगिक परियोजना मैंने कुछ समय पहले बनाई थी। (15 वां स्तर मूल रूप से यह है)
ETHproductions

4
हम Failएक शीर्षक newline के बिना उत्पादन कर सकते हैं ? (उदाहरण के लिए abdFail\nया abd Fail\n)
स्कॉटिकोनेट

1
@scottinet, नहीं, परिणाम ( Failया मिलीसेकंड) उदाहरण में एक नई पंक्ति में होना चाहिए। ज्यादातर जवाब पहले ही यह मान लेते हैं।
Danko Durbić

2
-1 के रूप में यह "नया" नियम मूल विनिर्देश में नहीं था और पायथन जवाबों में से एक पर मेरे सुझावों को अमान्य करता है जो मूल नियमों के भीतर था।
एलपेड्रो

मैं वर्णमाला को छापने की सबसे तेज़-कोड चुनौती होने की उम्मीद कर रहा था ।
ATaco

जवाबों:


40

HTML (जावास्क्रिप्ट (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 बाइट्स सहेजे गए। सहेजे गए 3 बाइट @ qw3n के लिए धन्यवाद। @ बाइट के लिए 9 बाइट्स को सहेजा गया।


1
एचटीएमएल एक स्क्रिप्ट टैग के साथ -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 बाइट्स यदि क्लोजिंग टैग की जरूरत नहीं है
हरमन एल

@ हर्मनलॉस्टीन क्लोजिंग टैग एक स्निपेट के लिए आवश्यक लगता है, कम से कम, इसलिए मैं इसे छोड़ दूंगा।
नील

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
  • -24 बाइट्स इनलाइनिंग फंक्शंस द्वारा और अन्य CIA2 इंटरप्ट के लिए देखभाल नहीं

ऑनलाइन डेमो (उपयोग:sys49152)

स्क्रीनशॉट


स्पष्टीकरण:

यह एक छोटा कार्यक्रम होगा यदि यह C64 पर मिलीसेकंड की सटीक माप की समस्या के लिए नहीं था। सिस्टम इंटरप्ट लगभग 60 बार प्रति सेकंड होता है, जो करीब भी नहीं है। इसलिए हमें यहां एक हार्डवेयर टाइमर का उपयोग करना होगा जो सिस्टम क्लॉक से इसका इनपुट टिक करता है।

एक PAL मशीन पर, सिस्टम क्लॉक बिल्कुल 985248 हर्ट्ज है। टाइमर को 985 पर प्रारंभ करना इसलिए मिलीसेकंड टिक्स के करीब कुछ देता है , लेकिन यह बहुत तेज़ है, हमें हर चौथे टिक के लिए 986 चक्र गिनने होंगे, या एकल चक्र के लिए टाइमर पकड़ना होगा। यह संभव नहीं है, लेकिन हम अनुक्रम के साथ 6 चक्र के लिए टाइमर का आयोजन कर सकते हैं DEC $DD0E, INC $DD0E: $DD0Eसा 0 पर और उसके बाहर यह स्विचिंग साथ टाइमर नियंत्रण रजिस्टर है, और दोनों निर्देश 6 चक्र लेते हैं, इसलिए सटीक लिखते हैं कि रोकने के लिए और शुरू टाइमर बिल्कुल 6 चक्रों से अलग है। इसलिए हमें इस क्रम को हर 6 * 4 = 24 वें टिक पर अमल करना होगा। यह अभी भी बिल्कुल नहीं हैठीक है, टाइमर 8 मिनट और 12 सेकंड के बाद 1 मिलीसेकंड पीछे रह जाएगा, लेकिन यह शायद काफी अच्छा है - इसके लिए क्षतिपूर्ति करना बहुत अधिक कोड ले जाएगा ।

संपादित करें : टाइमर के लिए प्रारंभ मूल्य 984 होना चाहिए, 985 नहीं, क्योंकि ये टाइमर "अंडरफ्लो" पर आग लगाते हैं, इसलिए 0 का मान फायरिंग से पहले एक और चक्र की गणना करेगा। कोड तय है, बाइट की संख्या अपरिवर्तित है।

यहाँ टिप्पणी असहमति सूची है:

         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
ध्यान दें, स्क्रिप्ट किडिज़। यह असली गोल्फ है।
जे ...

1
@ जे ... मैं इसे और अधिक टोलिंग द्वारा गोल्फ कर सकता हूं .starttimer- जल्द ही करूंगा :) (और आगे भी इस बुनियादी उत्तरTI जैसी प्रणाली का उपयोग करके , लेकिन मुझे यकीन नहीं है कि यह मान्य है, क्योंकि आप मशीन कोड में बेहतर कर सकते हैं )
फेलिक्स पालमेन

वाह, मैं अपने समय के माप में त्रुटि की गणना करते समय 985 का एक कारक याद किया - यह वास्तव में बहुत अच्छा तरीका है (अगर मैंने अपनी गणना में एक और त्रुटि की है, तो कृपया ध्यान दें!) :)
फेलिक्स पालमेन

और क्या आप देखते हैं कि इस लड़के में क्या है ?: एंड्रायड बूट रिकवरी .... वह पूरी तरह से पागल है! उनके प्रोफ़ाइल का समर्थन किया।
लुसियानो एंड्रेस मार्टिनी

13

बैश + कोरुटिल्स, 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बहुत तेज़ है! अच्छा काम किया :)
रोबाऊ

क्या बैश की एक विशिष्ट संस्करण की आवश्यकता है या कुछ और है? 4.4.12 पर, टाइपिंग aतुरंत मुझे देता है line 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")और बाहर निकलता है।
नंबरमानस

@numbermaniac बैश का संस्करण मायने नहीं रखता है, लेकिन dateहो सकता है। खदान GNU Coreutils 8.23 ​​से है। date +%s%3Nआपके सिस्टम पर क्या छपता है?
डेनिस

@ डेनिस इसे आउटपुट करता है 15094104833N- यह macOS पर बिल्ट-इन dateयूटिलिटी है, अगर इससे फर्क पड़ता है।
संख्यामान

1
@numbermaniac BSD स्ट्रैफ़ाइम का dateउपयोग कर रहा है, जो पहचान नहीं करता है %N
डेनिस


7

SOGL V0.12 , 35 बाइट्स

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

यह कोशिश करो! - रन पर क्लिक करें, और इनपुट बॉक्स में वर्णमाला दर्ज करें। ध्यान दें कि यह थोड़ा सुस्त हो सकता है क्योंकि एसओजीएल केवल हर 100 निष्पादित टोकन (और एसओजीएल काफी धीमा है) इनपुट के लिए रुकता है। यदि वह आपको परेशान करता है, 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

@ हैपरनेट्रिनो मुझे पता था कि यह काम आएगा: पी
द्विजिमा

कौन उम्मीद करेगा कि एसओजीएल ऐसा करने में सक्षम होगा ... वैसे शब्दकोश में "फेल" एक शब्द नहीं है?
आउटगॉल्फ

@ EriktheOutgolfer अच्छी तरह से, SOGL एक सर्व-प्रयोजन की भाषा माना जाता था , लेकिन यह काम नहीं किया: p
dzaima

BTW मैं नहीं जानता कि क्या यह पूरी तरह से वैध है, लेकिन फिर मुझे लगता है कि इंटरफ़ेस के साथ एक मुद्दा हो सकता है और पीछे दुभाषिया नहीं ...
Outgolfer

@EriktheOutgolfer हाँ, मुझे नहीं पता कि यह कितना वैध है, मुझे लगता है कि मैं ओपी की प्रतीक्षा कर रहा हूं। पहले तो मैंने सोचा कि यह HTML उत्तर जैसा कुछ है, लेकिन यह अब बिल्कुल अलग है कि मैं इसे देखता हूं
dzaima

7

पास्कल (एफपीसी) , 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एक छोटे विकल्प के रूप में उपयोग करें TDateTime, क्योंकि यहाँ परिभाषित किया गया है , TDateTime= Double, जो फ्लोटिंग-पॉइंट प्रकार है।
  • MilliSecondsBetweenसमय अंतराल की गणना के लिए उपयोग करने के बजाय , यह कोड दो फ्लोटिंग-पॉइंट मानों के बीच के अंतर को गुणा 864e5करता है , जो TDateTimeकि यहां वर्णित फ्री पास्कल एनकोड के कारण काम करता है

ध्यान दें:

  • ReadKeyफ़ंक्शन वास्तव में कंसोल पर कुंजी को प्रिंट नहीं करता है, इसलिए कंसोल के साथ मैन्युअल लेखन Write(c)आवश्यक है।
  • TIO 0को स्पष्ट कारण के लिए वर्णमाला टाइप करने के लिए एक अंक मिलता है ।
  • कार्यक्रम फ्लोटिंग-पॉइंट नोटेशन में समय प्रिंट करता है, मुझे लगता है कि इसकी अनुमति है।

साइट पर आपका स्वागत है!
caird coinheringaahing 7

आप 1 बाइट for c:='a'to'z'doको उसी लाइन में ले जाकर बचा सकते हैं जैसे कि a:=Time;
इस्माइल मिगुएल

हो सकता है कि आप कम होने के Nowबजाय कोशिश करें Time
tsh

क्यों 86398338?? यदि आप एक दिन में 864e5 मिलीसेकंड हैं तो आप समझ सकते हैं कि आप 864e5 हैं। लेकिन यह मैजिक नंबर कैसे आता है?
tsh

@tsh मुझे या तो नहीं पता। मैनुअल परीक्षण करके मुझे लगता है कि "जादू" संख्या को खोजने के लिए होता है, और मैं कैसे पास्कल की दुकान पता नहीं है TDateTimeके रूप में Double864e5अधिक सही लगता है, मैं मुद्दों को ठीक कर दूंगा।
user75648

5

जावा, 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.awt

-78 बाइट्स @ OlivierGrégoire की बदौलत

स्पष्टीकरण:

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 of fail:
नोट: यह एक पुराना gif है। वर्तमान संस्करण अब कंसोल के लिए की-प्रेस को प्रिंट नहीं करता है।

यहाँ छवि विवरण दर्ज करें


2
यह एक गिनी है प्रभावशाली जवाब!
प्योरफेरेट

1
388 बाइट्स । मैंने गोल्फ के अलावा आपके कोड को ठीक करने के लिए स्वतंत्रता ली क्योंकि आपने setVisible(false)बाहर निकलने के बजाय इसका इस्तेमाल किया था ।
ओलिवियर ग्रेजायर 12

@ ओलिवियरग्रेगायर धन्यवाद। के बारे में भूल गए showऔर dispose, जो इससे भी छोटा है setVisible। मैं लगभग जावा-जीयूआई का उपयोग नहीं करता हूं .. और स्मार्ट-क्लास-इनिशियलाइज़ेशन का उपयोग करने के बजाय इसे मुख्य-विधि में डाल देता हूं। मुझे वह याद रखना चाहिए।
केविन क्रूज़सेन

1
@KevinCruijssen धन्यवाद, और कोई समस्या नहीं;; हालांकि कुछ और सामान्य टिप्पणियां: आपको दो बार पत्रों को आउटपुट करने की आवश्यकता नहीं है। गूंज पहले से ही प्रदान की जाती है TextField। इसके अलावा, आप दो बाइट्स प्राप्त करने के TextAreaबजाय उपयोग कर सकते हैं TextField। अंत में, KeyEventएक getWhenविधि है जो युगों और मिलीसेकंड में घटना के बीच का समय देती है। बस System.nanoTime()और भी बाइट्स प्राप्त करने के बजाय उन का उपयोग करने की जरूरत है ।
ओलिवियर ग्रेगोइरे

1
आपका स्वागत है! लेकिन मैंने इसे 320 बाइट्स तक घटा दिया । ;-)
ओलिवियर ग्रेजायर

4

सी # (.NET कोर), 245 + 13 183 + 41 177 + 41 बाइट्स

+41 बाइट्स के लिए using System;using static System.Console

जब से मैं मोबाइल पर हूं तब से अनटाइटेड हूं और यह टीआईओ पर नहीं चलता है।

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) एक छोटा रास्ता मैं अपवाद का उत्पादन करने के लिए मिला है: int x=0;और फिर करते हैं x=1/x;। इससे 14 बाइट बचनी चाहिए। दुर्भाग्य से आपको जरूरत है x। यदि आप ऐसा करने की कोशिश करते 1/0हैं तो आपको निरंतर शून्य संकलक त्रुटि से एक डिवीजन मिलता है । 2) -5 बाइट्स cपहले के साथ घोषणा के संयोजन के लिए ReadKey। 3) बदलें भीतरी में हालत ifको ReadKey!=++cऔर निकालने के c++;elseकिसी अन्य के लिए -9 बाइट्स।
raznagul

@raznagul धन्यवाद! x=1/xको कम किया जा सकता है x/=x। और मैंने using static System.Console;कुछ और बाइट्स बचाने के लिए :)
इयान एच।

इसके बजाय लूप की स्थिति को हटाकर 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 एक आंतरिक MSX-BASIC वैरिएबल है जो हर 20 मिलीसेकंड तक बढ़ता है।


3

सी # (.NET कोर) , 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'

स्वीकृतियाँ

-10 बाइट्स @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"
    );
} 

1
आप ReadKeyलूप स्थिति को स्थानांतरित करके कुछ बाइट्स को बचा सकते हैं ताकि आप पहले ifऔर को हटा सकें break
राजनागुल

3

नोड.जेएस, 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)

EDIT: जॉर्डन की बदौलत 27 बाइट्स बचाए

Ungolfed संस्करण:

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

सी (जीसीसी) , 303 बाइट्स

* निक्स सिस्टम पर काम करता है। स्टैंडअलोन कोड नई टर्मिनल की प्रतीक्षा किए बिना वर्णों को पढ़ने की अनुमति देने के लिए वर्तमान टर्मिनल के विहित मोड को हटा रहा है:

/! \ _ इस प्रोग्राम को चलाने से टर्मिनल लगभग बेकार हो जाएगा।

#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

कमोडोर बेसिक v2 - 113 बाइट्स

कैपिटल लेटर्स को शिफ्ट करना होगा।
कुछ टाइपो को इंगित करने के लिए फेलिक्स पालमेन के लिए धन्यवाद, चश्मा
इसे आज़माते हैं

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

साइट पर आपका स्वागत है! क्या आप दुभाषिया (यदि कोई मौजूद है) के लिए एक लिंक जोड़ सकते हैं, ताकि दूसरे आपके कोड का परीक्षण कर सकें?
caird coinheringaahing

ठीक है, यह IRQ प्रणाली का उपयोग करता है ( TIइसमें वृद्धि हुई है) मैंने इसकी कमी के लिए अनुपयुक्त समझा , लेकिन मुझे लगता है कि यह यहां उचित खेल है, क्योंकि बसिक में बेहतर करने का कोई तरीका नहीं है :) फिर भी, इस को उलटते हुए, मुझे मिल गया। एक सिंटैक्स त्रुटि 1- कोई मदद?
फेलिक्स पालमेन

यह खुद पता लगा, आपके पास एक लाइन में एक टाइपो है, 1on-(f=26)gO4:gEa$:ifa$=""tH1नाइटपिक्स होना चाहिए : 1.) आउटपुट एक ही लाइन पर है, 2.) आउटपुट ऑल-कैप्स है - मुझे लगता है कि आपको उन को ठीक करना चाहिए, कई बाइट्स नहीं लेंगे। वैसे भी :)
फेलिक्स पालमेन

मुद्दों से प्रभावित, किसी भी टाइपोस छोड़ दिया?
मांडलोस

2

पर्ल 5, 79 93 +31 (-MTerm :: ReadKey -MTime :: HiRes = time) बाइट्स

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

$|=1कच्चे मोड में टर्मिनल सेट करने के लिए पर्याप्त नहीं है, 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 || = समय मैप को स्वैप नहीं किया जा सकता क्योंकि टाइमर को पहली बार दबाने के बाद शुरू होना चाहिए, और stdout के बजाय stderr पर dieप्रतिध्वनित होगा Fail
नहुएल फौलीउल

मदद करने के लिए खुश, आशा है कि आप मुझे विचारों की पेशकश करने में कोई आपत्ति नहीं करेंगे! हाँ, यह शर्म की बात है, exit printइतना लंबा है! क्षमा करें, मुझे नहीं लगता कि मैंने अपने विचार को forठीक से समझाया : $s||=time,ReadKey eq$_||exit print" Fail"for a..zक्या मुझे लगता है कि काम करना चाहिए ... हो सकता है $|=$s||=...या $|=map...यदि आप उस दृष्टिकोण को पसंद करते हैं! लगता है कि तुम बहुत ज्यादा हालांकि यह nailed!
डोम हेस्टिंग्स

$|=map..नए टर्मिनल में असंबद्ध इनपुट सेट नहीं करता है (मुझे हटाते समय त्रुटि हुई, रीडमोड 3, क्योंकि मैं एक ही सत्र में परीक्षण कर रहा था), और $s||=timeपहले रीडकेई टाइमर को बहुत जल्दी शुरू कर देगा
नाहुएल फौइउल

आह, मैं गलत समझ गया, मैं इसे अभी प्राप्त करता हूं, स्क्रिप्ट की जांच शुरू करने के बाद लंबे समय तक इंतजार नहीं किया ... :) के बारे में शर्म की बात है $|, लेकिन फिर से, यह लूप के बाद भंडारण हो रहा है जो बहुत देर हो चुकी है! तुम एक कदम आगे हो!
डोम हेस्टिंग्स

2

एसीटो , 70 बाइट्स

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

मैं एक कैच मार्क सेट करके और क्षैतिज रूप से ( @|) मिररिंग करके शुरू करता हूं , अगर स्टैक पर मूल्य सत्य है। यह शुरू में नहीं है, और बाद में हमेशा रहेगा। यदि कोई गलत कुंजी दर्ज की जाती है तो हम बाद में यहां वापस कूदेंगे। अगला, हम स्टैक पर एक धक्का देते हैं ( 'a), फिर हम इसे डुप्लिकेट करते हैं और उपयोगकर्ता से एक ही चरित्र पढ़ते हैं ( d,)। यदि दो अक्षर समान नहीं हैं ( =!), हम "क्रैश" ( $) और वापस पकड़ने के निशान पर कूदते हैं। अन्यथा, हम एक और "ए" को धक्का देते हैं और इसे प्रिंट करते हैं, फिर हम वर्तमान समय ( 'apT) सेट करते हैं ।

फिर हम अपने "मुख्य लूप" में प्रवेश करते हैं: हम वर्तमान चरित्र को "वृद्धि" करते हैं और चरित्र को "वृद्धि" करते हैं ( 'apToIcफिर) हम इसकी नकल करते हैं, एक नए चरित्र को पढ़ते हैं, इसकी तुलना करते हैं, और "क्रैश" करते हैं यदि यह अक्षर समान नहीं हैं। ( d,=!$)। अगर हम दुर्घटनाग्रस्त नहीं हुए, तो हम वर्तमान चरित्र की तुलना "z" ( d'z=|) से करते हैं, यदि यह बराबर नहीं है, तो हम चरित्र को प्रिंट करते हैं, फिर हम 1 को धक्का देते हैं और "सशर्त" (इस मामले में: हमेशा) कूदते हैं केवल oकोड में (हमारे मुख्य लूप की शुरुआत)। यदि यह z के बराबर था, तो हमने शीर्ष पर कुछ खाली जगह को क्षैतिज रूप से प्रतिबिंबित किया। हम "z" प्रिंट करते हैं, फिर वर्तमान समय को धक्का देते हैं (शुरुआती समय को घटाएं; t) और फिर संख्या 1000 को गुणा करें (10 से तीसरी शक्ति बढ़ाकर; 91+3F) इसके द्वारा (क्योंकि हमें सेकंड मिलते हैं; मिलीसेकंड नहीं)। फिर हम एक नई लाइन, समय और निकास प्रिंट करते हैं (pX)।

यदि हम कभी भी दुर्घटना करते हैं (उपयोगकर्ता द्वारा खराब इनपुट), तो हम शुरुआत में सभी तरह से कूदते हैं। चूंकि अब हमारे पास स्टैक पर कुछ सत्य मूल्य होंगे, हम क्षैतिज रूप से दर्पण पर देखेंगे u, जो हम जिस दिशा में आगे बढ़ रहे हैं उसे उलट देता है, nएक नई "Fail"रेखा चरित्र को प्रिंट करता है, फिर हम स्टैक पर धक्का देते हैं , इसे प्रिंट करते हैं, और बाहर निकलते हैं ( pX)।


1

गणितज्ञ (नोटबुक अभिव्यक्ति), 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[]}]]]

एक DynamicModuleएक के साथ EventHandlerप्रतिक्रिया पत्र keypresses लोअरकेस कि। चर x, sऔर tअब तक दबाए गए पत्रों को पकड़कर, प्रारंभ समय, और अंत समय क्रमशः। जैसे ही हम नोटिस करते हैं कि हम xसमान हैं {"a"}, हम समय शुरू करते हैं; हम या तो खर्च किए गए कुल समय को प्रदर्शित करते हैं, या अब तक निर्मित स्ट्रिंग, या "Fail"इस पर निर्भर करता है कि किस शर्त को पूरा किया गया है।

हम इसके t<1बजाय एक और बाइट बचा t==0सकते हैं अगर हम यह मान सकते हैं कि कोई भी तेजी से एक सेकंड से कम समय में वर्णमाला टाइप करने के लिए पर्याप्त है :)

यदि आप इसे एक गणितज्ञ नोटबुक में आज़मा रहे हैं, तो ध्यान रखें कि आपको अपने कीपेस पंजीकृत होने से पहले फ्रेम के अंदर क्लिक करना होगा। (यही कारण है कि हमें शुरू करने के लिए फ्रेम की आवश्यकता होती है; यदि Framedऐसा नहीं है, तो एक कुंजी दबाए जाने पर संपूर्ण ऑब्जेक्ट बदल जाता है, इसलिए यह चयनित होना बंद हो जाता है और आपको फिर से क्लिक करना होगा।)


1

सी #, 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");
}

ऊपर दिए गए कोड में व्हॉट्सएप है जो इसे बिना स्क्रॉलबार के एसई में फिट बनाता है। व्हॉट्सएप बाइट की गिनती का हिस्सा नहीं है

और के लिए 13 बाइट्स using System;

यह Ayb4btu के संस्करण के समान है लेकिन निम्नलिखित अंतरों के साथ है:

  • एक लंबे समय के रूप में डेटाटाइम को संग्रहीत करना, हमें cएक लंबा भी बनाने की अनुमति देता है , और घोषणा को छोटा कर देता है

  • पाश को एक अलग ब्रेक की आवश्यकता नहीं है

  • $"interpreted strings"यदि यह इनलाइन के लिए एक स्ट्रिंग बनाने के लिए मिलीसेकंड पर आवश्यक "\ n" जोड़ने का उपयोग करने के लिए वास्तव में छोटा नहीं है , तो

  • एक forलूप का उपयोग करना कभी-कभी हमें कुछ समय के लिए चार्ट को बचाने की अनुमति देता है, हालांकि मुझे लगता है कि यह बराबर पर नहीं बचाएगाwhile

Ayb4btu से:

  • s=s==0बन सकता है s=s<1, और c==123बन सकता हैc>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");

आप कैसे उपयोग के साथ अच्छा समाधान DateTime। आप कुछ और बचा सकता है बदलकर बाइट्स s=s==0के लिए s=s<1(तथ्य यह है कि रों नकारात्मक नहीं होगा पर बढ़ रहा है), और बदलते i==123करने के लिए i>122
Ayb4btu

इसके अलावा, क्या यह परीक्षण किया गया है? जैसा कि मैंने पाया कि i<123इससे पहले जाना था ReadKey(), अन्यथा यह समय प्रदर्शित करने से पहले जेड के बाद किसी अन्य चरित्र की प्रतीक्षा करता है।
Ayb4btu

विषम, क्योंकि वर्णमाला के अंत में, zइसका मतलब readkey.keychar 122 होना चाहिए जब उपयोगकर्ता प्रकार z, c भी 122 'z' == 122होता है, इसलिए सफल होता है, c को फिर इंक्रीमेंट किया जाता है, फिर c (अब 123) के खिलाफ परीक्षण किया जाता है c<123और विफल रहता है, रोकना पाश ..?
कायुस जार्ड

आप ठीक कह रहे हैं, c++जब मैं इसे देख रहा था तो मुझे वेतन वृद्धि याद आ गई । हालाँकि, मैंने अभी इसकी कोशिश की और जब मैं इसमें टाइप abcdefghijklmnopqrstuvwxysकरता हूं तो मुझे असफल होने के बजाय समय मिलता है। मेरा मानना ​​है कि यह इसलिए cभी है क्योंकि KeyCharचेक फेल होने पर भी वेतन वृद्धि होती है, इसलिए c>122चेक पास करना ।
Ayb4btu

अच्छी बात है - शायद ++ को c <123 चेक पर ले जाने से बाइटकाउंट समान रहेगा और सी को इंक्रीमेंट करने से रोकेगा यदि अंतिम चार्ट गलत है - अभी डिबग करने का समय नहीं है, लेकिन मैं इस पर एक नज़र डालूंगा! चीयर्स :)
कैयस जार्ड

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

जीसीसी, खिड़कियां, 98 बाइट्स

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

पहली कुंजी के लिए तुरंत इनपुट की आवश्यकता नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.