स्टॉपवॉच को लागू करें


23

एक साधारण डिजिटल स्टॉपवॉच को लागू करें , जो सेकंड और मिनटों में नीचे दिखाए गए समय को प्रदर्शित करेगा, जैसा कि नीचे वर्णित है।

जरूरी

कृपया प्रदर्शन और नियंत्रण दोनों अनुभाग पढ़ें !

प्रदर्शन

समय बीत जाने पर, MM:SSप्रारूप में पहले प्रदर्शित टाइम स्ट्रिंग "इन-प्लेस" को बदलकर प्रदर्शित किया जाना चाहिए (संपूर्ण या स्क्रीन के एक हिस्से को भी साफ़ करने की अनुमति है)।

स्टॉपवॉच को कम से कम हर सेकंड अपडेट किया जाना चाहिए।

उदाहरण:

0 मिनट, 0 सेकंड

00:00

0 मिनट, 33 सेकंड

00:33

1 मिनट, 50 सेकंड

01:50

प्रारंभ में, आप '00: 00 'के साथ या किसी अन्य मान के साथ शुरू कर सकते हैं [00: 00-59: 59]।

एक बार जब आपकी स्टॉपवॉच पहुंच जाती है 59:59, तो उसे रीसेट करना चाहिए 00:00और नए सिरे से जारी रखना चाहिए ।

जब तक आप सामान्य पैटर्न का पालन करते हैं, तब तक आप एक अलग बेस (दशमलव के बजाय) या यहां तक ​​कि एक अलग अंक प्रणाली का उपयोग कर सकते हैं।

उदाहरण के लिए 13:03प्रदर्शित किया जा सकता है:

दशमलव

13:03

हेक्साडेसिमल

0D:03

Base64

N:D

क्वाटर-काल्पनिक आधार

10101:3

रोमन संख्याएँ

XIII:III

सावधान रहें कि यदि आप एक गैर-दशमलव अंक प्रणाली / आधार का उपयोग करते हैं, तो इसे मुद्रण योग्य ASCII (या यूनिकोड) वर्णों का उपयोग करके एन्कोड किया जाना चाहिए, उदाहरण के लिए मिनट और सेकंड के लिए दो बाइनरी (बिना प्रिंट) बाइट्स का उपयोग करने की अनुमति नहीं है।

यदि आप अपने संख्यात्मक प्रणाली को इसके लिए अनुमति देते हैं, तो आपको अपने आउटपुट को शून्य के साथ-साथ छोड़ देना चाहिए।

विभाजक चरित्र :को किसी अन्य मुद्रण योग्य चरित्र (अंकों सहित) के साथ बदलना भी स्वीकार्य है।

नियंत्रण

स्टॉपवॉच को रोकना शुरू करना चाहिए , और इस स्थिति में रहना चाहिए , जब तक उपयोगकर्ता स्पष्ट रूप से इसे शुरू नहीं करता है, 'नियंत्रण' कुंजी दबाकर (नीचे देखें)।

अगर, स्टॉपवॉच की गिनती करते समय, उपयोगकर्ता 'कंट्रोल' कुंजी को फिर से दबाता है , तो स्टॉपवॉच को (वर्तमान समय को ध्यान में रखते हुए) रोकना चाहिए , जब तक कि 'नियंत्रण' कुंजी को एक बार दबाया न जाए।

'नियंत्रण' कुंजी एक एकल कीस्ट्रोक, जैसे हो सकता है s, या कुंजी, जैसे के किसी भी संयोजन Ctrl+Shift+X, लेकिन यह, 'परमाणु' होना चाहिए, अनुक्रम में एक से अधिक कुंजी का उपयोग जैसे sतो Enter, है की अनुमति नहीं दी

स्टॉपवॉच को रोकने और फिर से शुरू करने के लिए समान 'नियंत्रण' कुंजी (या संयोजन) का उपयोग किया जाना चाहिए ।

आपको एक विशिष्ट 'नियंत्रण' कुंजी का उपयोग करना चाहिए , अर्थात 'किसी भी कुंजी' की अनुमति नहीं है।

वैकल्पिक रूप से, आप 'कंट्रोल' के लिए कीपर के बजाय सिंगल या डबल माउस-क्लिक का उपयोग कर सकते हैं।


नियम

  • यह , बाइट्स जीत में सबसे छोटा जवाब;
  • मानक कोड-गोल्फ लूपहोल्स लागू होते हैं;
  • आपका कार्यक्रम (सैद्धांतिक रूप से) हमेशा के लिए चलाने में सक्षम होना चाहिए।

क्या 'नियंत्रण' कुंजी दर्ज की जा सकती है?
लवजो

@ लोजोवो हाँ, कोई भी कुंजी या कुंजियों का संयोजन करेगा, जिसमें एंटर भी शामिल है (जब तक इसे रोका जा सकता है और फिर उसी कुंजी का उपयोग करके फिर से शुरू किया जाता है)।
जेपेलिन


1
क्या हमें उप-सेकंड ग्रैन्युलैरिटी की आवश्यकता है? Ie यदि उपयोगकर्ता 00:05प्रिंट होने के बाद लगभग 7000 मिलीसेकेंड को रोक देता है, और फिर कुछ बिंदु पर फिर से शुरू होता है, फिर 00:06से शुरू की कुंजी दबाए जाने के बाद 3000 मिलीसेकंड दिखाई देना चाहिए , या फिर फिर से शुरू की कुंजी दबाए जाने के बाद इसे एक दूसरे को प्रिंट करना ठीक है?
SMLS

@smls फिर से शुरू होने के बाद, एक दूसरे का इंतजार करना ठीक है।
ज़ेप्लेन

जवाबों:


8

स्माइलबासिक, 86 77 71 बाइट्स

@L
N=N!=DIALOG(FORMAT$("%02D:%02D",F/60MOD 60,F MOD 60),,,N)F=F+1GOTO@L

DIALOGटच स्क्रीन पर एक टेक्स्टबॉक्स प्रदर्शित करता है। Nपाठ बॉक्स की संख्या गायब होने से पहले स्क्रीन पर रहेगी। यदि Nहै 0, तो यह तब तक रहता है जब तक कि उपयोगकर्ता टच स्क्रीन पर बटन दबाता है।

DIALOGरिटर्न 1उपयोगकर्ता बटन दबाया, और अगर 0है, तो यह स्वचालित रूप से बंद कर दिया। इसलिए जब उपयोगकर्ता ठहराव बटन को धक्का देता है 1, तो वह वापस आ जाता है , और 0स्टॉपवॉच को रोकते हुए प्रदर्शन समय निर्धारित किया जाता है । उपयोगकर्ता द्वारा बटन को फिर से दबाने के बाद, हम 1टाइमर को फिर से शुरू करते हुए प्रदर्शन समय वापस सेट करते हैं । मूल रूप से, हर बार DIALOGलौटता है 1, प्रदर्शन समय के बीच स्विच किया जाता है 1और 0उपयोग !=किया जाता है, जो एक तार्किक XOR के रूप में तब तक है जब तक दोनों इनपुट 1 या 0 हैं।


यह कमाल लग रहा है! यदि आप यह कैसे काम करता है की एक एनिमेटेड "स्क्रैन्कास्ट" भी प्रदान कर सकता है, तो इसकी बहुत सराहना की जाएगी!
जेपेलिन

ठीक है, मैं जल्द ही करूँगा
12M2121

इस एमुलेटर पर इसका परीक्षण भी किया जा सकता है: citra-emu.org/game/smilebasic
रॉबग्लिक 11

9

पायथन 2, 167 129 बाइट्स

-36 बाइट्स ज्यादातर * एक अपवाद का उपयोग करके माल्टीसेन के विचार का ctrl-cउपयोग करने से - क्रेडिट दें!
-4 बाइट्स के लिए धन्यवाद DLosc (init nऔर b0 के बजाय f())
-1 बाईट थैंक्स टू फ्लिपटैक (उपयोग के p^=1बजाय p=1-p)
-2 बाइट्स के लिए धन्यवाद फेलिप नारदी बतिस्ता (सटीक स्पेसिफ़ायर हटा दें)

import time
f=time.time
n=b=p=0
while 1:
 try:n=[n,f()][p];t=n-b;print'\r%02d:%02d'%(t/60%60,t%60),
 except:b=[b-n+f(),b][p];p^=1

नीचे मेरे मूल के रूप में ही काम करता है, लेकिन नियंत्रण कुंजी अनुक्रम के साथ ctrl+c
(विंडोज 7, 64 बिट पर पायथन 2.7.8 के साथ मेरे द्वारा
परीक्षण किया गया। ब्रायन मिंटन द्वारा पायथन 2.7.13 के साथ लिनक्स पर परीक्षण किया गया)

* एक लाइनर ifके tryरूप में पाने के लिए एक सूची देखने के लिए बयान भी ढह गया ।

मेरा मूल:

import time,msvcrt as m
f=time.time
n=b=p=0
while 1:
 if m.kbhit()and m.getch()==b'p':b=[b-n+f(),b][p];p^=1
 if p:n=f()
 t=n-b;print'\r%0.2d:%0.2d'%(t/60%60,t%60),

(विंडोज 7, 64 बिट पर पायथन 2.7.8 के साथ मेरे द्वारा परीक्षण किया गया - यह कोड, हालांकि, msvcrtलाइब्रेरी के उपयोग के कारण विंडोज विशिष्ट है )

नियंत्रण कुंजी 'p' है।

nऔर bस्टार्ट-अप पर समान मूल्य के लिए आरंभिक हैं, 0 का "ऑफसेट" दे रहा है; p0 से आरंभिक है, एक रुकी हुई अवस्था को दर्शाता है।

जब भी नियंत्रण कुंजी को दबाया जाता है का मान pबदल जाता है। एक पॉज़्ड अवस्था से सक्रिय अवस्था bमें स्विच करने पर, पिछले सक्रिय स्थिति (s) से किसी भी वर्तमान ऑफ़सेट को रखते हुए एक नए मान में अपडेट किया जाता है b-n

एक सक्रिय स्थिति के दौरान nकॉल करके वर्तमान समय में बार-बार अपडेट किया जाता है time.time()

तब nऔर b, के बीच का अंतर , tसक्रिय अवस्था (ओं) के दौरान कुल सेकंड (भिन्नात्मक भाग सहित) की संख्या है।

मिनट बीत गए हैं t/60और फिर मिनट और सेकंड में से प्रत्येक के साथ आधुनिक 60 प्रदर्शित कर रहे हैं (t/60%60,t%60)। अग्रणी शून्य को प्रत्येक के लिए पूर्णांक भाग के स्ट्रिंग स्वरूपण का उपयोग करने के लिए तैयार किया जाता है '...%0.2d...'। टपल (अनुगामी ,) \rको मुद्रित करना जहां पहले आइटम में एक अग्रणी कैरिज रिटर्न ( ) होता है, जो पहले से मुद्रित पाठ को फिर से लिखने का कारण बनता है।


आह हाँ, अच्छी पकड़, मैं मूल रूप से था, ^=लेकिन सूत्रीकरण के दौरान कुछ बिंदु पर स्विच किया।
जोनाथन एलन

@ डलास वास्तव में, धन्यवाद ...
जोनाथन एलन

यह विंडोज विशिष्ट नहीं है। मैंने अभी पायथन 2.7.13 के साथ 64 बिट पर लिनक्स का परीक्षण किया और यह काम किया। (Ctrl-C की नियंत्रण कुंजी के साथ)
ब्रायन मिंटन

@BrianMinton मुझे बताने के लिए धन्यवाद!
जोनाथन एलन

क्या जरूरत .है %0.2d? यह ठीक काम करता है%02d
फेलिप नारदी बतिस्ता

6

पायथन - 160 159 143 बाइट्स

मुझे 18 बाइट बचाने के लिए @JonathanAllan को धन्यवाद!

केवल बिलिन लाइब्रेरीज़ का उपयोग करता है, इसलिए नियंत्रण कुंजी है ctrl-c, इसे ए के साथ पकड़ना except keyboardInterrupt

import time
Z=0
print'00:00'
while 1:exec"try:\n while 1:\n  %s\nexcept:1\n"*2%(1,"print'\033c%02d:%02d'%divmod(Z%3600,60);Z+=1;time.sleep(1)")

ओह अच्छा। मुझे लगता है कि यह सिर्फ के साथ कम हो सकता है except:? मेरे पास इसे करने का एक कार्यशील संस्करण है ...
जोनाथन एलन

@JonathanAllan ओह कूल, पता नहीं था कि आप ऐसा कर सकते हैं।
माल्टसेन २ Mal'१:04

5

बैश + यूनिक्स उपयोगिताओं, 90 या 93 बाइट्स

90-बाइट संस्करण:

trap d=\$[!d] 2;for((n=0;;)){((d|!n))&&dc<<<DP60dod*d$n\r%+n|colrm 1 4&&: $[n++];sleep 1;}

93-बाइट संस्करण:

trap d=\$[!d] 2;for((n=0;;)){((d|!n))&&dc<<<DP60dod*$n+n|colrm 1 4&&n=$[(n+1)%3600];sleep 1;}

Ctrl-C रिज्यूम / पॉज कैरेक्टर है। एक स्थान मिनट और सेकंड के बीच सीमांकक है।

दो संस्करणों के बीच अंतर यह है कि 90-बाइट प्रोग्राम 2 ^ 63 सेकंड के लिए काम करेगा (जिस बिंदु पर, बैश मुझे एक पूर्णांक अतिप्रवाह देगा)।

93-बाइट संस्करण वास्तव में हमेशा के लिए काम करेगा।

मूल समस्या में आवश्यकता शामिल थी: "आपका कार्यक्रम (सैद्धांतिक रूप से) हमेशा चलने में सक्षम होना चाहिए।"

यदि 2 ^ 63 सेकंड के लिए दौड़ना उस आवश्यकता को पूरा करने के लिए पर्याप्त है, तो 90-बाइट समाधान काम करता है। यह अवधि ब्रह्मांड की आयु से 20 गुना अधिक है!

यदि कार्यक्रम को इससे अधिक समय तक चलाने में सक्षम होने की आवश्यकता है, तो मुझे 93-बाइट समाधान के साथ जाना होगा।


मुझे शायद यह बताना चाहिए कि यह समाधान, साथ ही साथ पोस्ट किए गए कुछ अन्य, बहुत धीरे-धीरे सही बीते हुए समय के पीछे पड़ जाएंगे । यह स्लिपेज इसलिए है क्योंकि लूप के शरीर के प्रत्येक निष्पादन के बीच कार्यक्रम एक सेकंड के लिए सो रहा है, लेकिन लूप के शरीर को निष्पादित करने में कुछ समय लगता है। यह व्यवहार में असंगत होगा।


ऐसा लगता है कि यह स्क्रीन पर एक प्रारंभिक मूल्य प्रदर्शित नहीं करेगा, जब तक आप इसे "अनपॉज़" नहीं करते।
जेपेलिन

"स्टॉपवॉच को रोकना शुरू करना चाहिए, और इस स्थिति में रहना चाहिए, जब तक उपयोगकर्ता स्पष्ट रूप से इसे शुरू नहीं करता है, 'नियंत्रण' कुंजी (नीचे देखें) दबाकर।" वहाँ एक कल्पना मैं याद किया है?
मिशेल स्पेक्टर

हां यह सही है, लेकिन इसे अभी भी एक प्रारंभिक मूल्य प्रदर्शित करना चाहिए Initially, you can start with '00:00' or with any other value in range [00:00-59:59], जो स्क्रीन पर तब तक रहेगा जब तक आप पहली बार 'नियंत्रण' नहीं दबाते। क्षमा करें यदि मैं इस स्पष्ट को पर्याप्त रूप से तैयार नहीं कर पाया हूँ!
जेपेलिन

ठीक है, यह समझ में आता है - मैं इसे संशोधित करूंगा।
मिशेल स्पेक्टर

1
अब सब अच्छा लग रहा है!
ज़ेपेलिन

5

QBasic, 213 211 बाइट्स

नियंत्रण कुंजी टैब है। इस रनिंग को छोड़ने से लैपटॉप में आग लग सकती है। आपको चेतावनी दी गई है।

DO
WHILE k$<>CHR$(9)
k$=INKEY$
LOCATE 1
?CHR$(48+m\10);CHR$(48+(m MOD 10));":";CHR$(48+(d MOD 60)\10);CHR$(48+(d MOD 10))
IF r THEN
n=TIMER
d=v+n-b+86400
m=d\60MOD 60
END IF
WEND
k$=""
v=v+n-b
r=1-r
b=TIMER
LOOP

यहां यह 10, 15 और 20 सेकंड में रुकने की क्रिया में है:

स्टॉपवॉच चल रहा है

असहमति और टिप्पणी की

' Outer loop runs forever
DO
  ' The WHILE-WEND loop runs until tab is pressed
  WHILE key$ <> CHR$(9)
    key$ = INKEY$
    ' Output the stopwatch value at top left of screen
    LOCATE 1
    ' Unfortunately, QBasic's PRINT USING doesn't have a format for printing
    ' with leading zeros, so we have to do it manually by printing the
    ' 10s digit and the 1s digit
    PRINT CHR$(48 + minute \ 10); CHR$(48 + (minute MOD 10));
    PRINT ":";
    PRINT CHR$(48 + second \ 10); CHR$(48 + (second MOD 10))
    ' Update the current time if the running flag is set
    IF running THEN now = TIMER
    ' Take the difference between now and the last time we started the
    ' stopwatch, plus the amount of saved time from previous runs,
    ' plus 86400 to account for the possibility of running over midnight
    ' (since TIMER is the number of seconds since midnight, and QBasic's
    ' MOD doesn't handle negative values like we would need it to)
    diff = saved + now - lastStarted + 86400
    second = diff MOD 60
    minute = diff \ 60 MOD 60
  WEND
  ' If we're outside the WHILE loop, the user pressed tab
  key$ = ""
  ' Add the previous run's time to the saved amount
  saved = saved + now - lastStarted
  ' Toggle running between 0 and 1
  running = 1 - running
  ' If we're starting, we want to put the current time in lastStarted;
  ' if we're stopping, it doesn't matter
  lastStarted = TIMER
LOOP

ध्यान दें कि मान TIMERफ़्लोटिंग-पॉइंट हैं। यह उत्पादन को प्रभावित नहीं करता है, क्योंकि MODऔर \पूर्णांकों को truncate। लेकिन यह सहेजे गए समय की मात्रा में सटीकता जोड़ता है: यदि आप टिक से ठीक पहले टाइमर को रोकते हैं, तो आप देखेंगे जब आप इसे फिर से शुरू करते हैं कि संख्या एक सेकंड से भी कम समय में बदल जाती है।


4

बैच, 132 बाइट्स

set/ar=0,m=s=100
:l
cls
@choice/t 1 /d y /m %m:~1%:%s:~1% /n
set/as+=r,m+=c=s/160,s-=c*60,m-=m/160*60,r^^=%errorlevel%-1
goto l

दबाने nसे (संयुक्त राष्ट्र) टाइमर को रोक देगा। आउटपुट झिलमिलाहट को तीन (या चार) बाइट्स की कीमत पर कम किया जा सकता है।


4

शुद्ध बैश, 141 बाइट्स

set -m
while ! read -t 1;do printf '\r%02i:%02i' $[s=s>3598?0:s+1,s/60] $[s%60];done&trap 'fg>/dev/null' TSTP
printf '00:00'
kill -STOP $!
read

यह बाश बिल्डिंस (कोई बाहरी उपकरण) के अलावा कुछ भी नहीं का उपयोग करता है। नियंत्रण चरित्र है Ctrl-Z, ताकि मानक SIGTSTPहैंडलिंग स्टॉपवॉच को रोक दे।

यदि Ctrl-Zउप-अग्रभूमि को दबाया जाता है, तो यह निष्पादन को रोक देगा और बाहरी स्क्रिप्ट को अग्रभूमि में लौटा देगा, जहां यह चुपचाप इंतजार करेगा। यदि बाहरी स्क्रिप्ट को अग्रसर किया जाता है, तो ट्रैप हैंडलर सबस्क्रिप्शन के निष्पादन को फिर से शुरू करेगा, और यह फिर से गिना जाएगा।


3

क्रोम कंसोल में जावास्क्रिप्ट, 143 बाइट्स

f=document,m=s=g=i=0;setInterval(()=>{if(g%2){m=(i/60|0)%60;s=i++%60}f.write((m>9?m:'0'+m)+':'+(s>9?s:'0'+s));f.close();f.onclick=()=>g++},1e3)

जब यह कंसोल में दर्ज किया जाता है तो यह 00:00 पर काउंटर में प्रवेश करता है और फिर नियंत्रण को सक्षम करता है जो दस्तावेज़ पर कीपर है।

बहुत जादू नहीं चल रहा है, विशेष रूप से (i/60)|0फर्श की संख्या

क्रोम कंसोल में किया और परीक्षण किया गया


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

1
132 बी:m=s=g=i=0;(f=document).onclick=_=>g++;setInterval("g%2&&f.close(f.write(`${(m=i/60%60|0)>9?m:'0'+m}:`+((s=i++%60)>9?s:'0'+s)))",1e3)
ल्यूक

ओह, अच्छा :) यहाँ कुछ चीजें सीखीं। अंतराल में स्ट्रिंग और _ => जी ++। धन्यवाद :)
gzbz

3

HTML + JavaScript (ES6), 191 192 187 183 174 बाइट्स

<b onclick='b=b?clearInterval(b):setInterval("a.innerHTML=`${(d=(((c=a.innerHTML.split`:`)[1]>58)+c[0])%60)>9?d:`0`+d}:${(e=++c[1]%60)>9?e:`0`+e}",1e3)'onload='b=0'id=a>00:00

व्याख्या

स्टॉपवॉच शुरू करने या रोकने के लिए टाइमर पर क्लिक करें। जैसे, सिंगल क्लिक कंट्रोल की है। दो मूल्यों के बीच विभाजक एक बृहदान्त्र है।

जब भी उपयोगकर्ता क्लिक पर क्लिक करता है, मूल्य की bजाँच की जाती है। इसका आरंभिक 0मूल्यांकन किया जाता है false, इसलिए प्रत्येक 1000 मिलीसेकेंड में कोड की एक स्ट्रिंग का मूल्यांकन किया जाता है। यह चर को अंतराल की आईडी में सेट करता है, इसलिए इसे बाद में रोका जा सकता है। यदि bकोई संख्या होती है, तो इसका मूल्यांकन होता है true, इसलिए अंतराल रोक दिया जाता है। यह मान लौटाता है undefined, इसलिए चक्र जारी रहता है।

कोड की स्ट्रिंग आईडी a(स्टॉपवॉच) के साथ तत्व के HTML को बदल देती है । पहले मिनटों को पिछले स्टॉपवॉच मूल्य लेने के द्वारा पार्स किया जाता है, इसे बृहदान्त्र द्वारा विभाजित किया जाता है, और मिनटों का मूल्य प्राप्त किया जाता है, जिसे 0 से बढ़ाया जाता है यदि सेकंड का मूल्य 59 (58 से अधिक नहीं), और 1 अन्यथा, मोडुलो 60 । तब यह मान गद्देदार होता है। फिर बृहदान्त्र आता है, और अंत में, सेकंड। कोड बस पुराने मूल्य प्राप्त करता है, इसे 1 से बढ़ाता है, modulo 60 लेता है और वैकल्पिक रूप से इसे पैड करता है।


यह बिल्कुल काम नहीं करता है। मुझे सिर्फ संदर्भ मिलता है: डी परिभाषित नहीं है
एलेक्सिस टायलर

आप शायद Href = # को हटाकर कुछ बाइट्स बचा सकते हैं क्योंकि जब से आप ऑनक्लिक का उपयोग कर रहे हैं तब से इसकी वास्तव में आवश्यकता नहीं है।
एलेक्सिस टायलर

मैंने अभी तय किया है। मैंने भी href निकाल दिया, क्योंकि आप सही थे। धन्यवाद!
ल्यूक

क्या आप बी टैग पर ऑनक्लिक नहीं डाल सकते हैं और उत्तर में ऐसा निर्दिष्ट कर सकते हैं?

मुझे लगता है कि काम करता है। इससे 9 बी बच गया। आपका बहुत बहुत धन्यवाद!
ल्यूक

3

सी 309 179 बाइट्स

f(){m=0,s=0;A: while(getchar()^'\n'){if(s++==59){if(m++==59)m=0;s=0;}printf("\r%02d:%02d",m,s);sleep(1);system("clear");if(getchar()=='\n'){break;}}while(getchar()^'\n'){}goto A;}

Ungolfed संस्करण:

void f()
{
   int m=0,s=0;

   A: while(getchar()^'\n')
      {           
       if(s++==59)
       {
         if(m++==59)
           m=0;

         s=0;
       }
       printf("\r%02d:%02d",m,s);
       sleep(1);  
       system("clear");

        if(getchar()=='\n')
        {
          break;
        }
      }

       while(getchar()^'\n')
       {}
       goto A ;
}

उपयोग: प्रेस Enterको रोकें और स्टॉपवॉच को फिर से शुरू करें।

स्पष्टीकरण:

  • के लिए प्रतीक्षा करें Enterकीस्ट्रोक, breakपहले whileपाश और इंतजार अगले जब तक Enterआता है।
  • अगले Enterकीस्ट्रोक पर, gotoपहले whileलूप और फिर से गिनती शुरू करें।

अब, मुझे पता gotoहै कि सी में एक खराब कोडिंग अभ्यास है, लेकिन मैं दूसरे तरीके का पता नहीं लगा सका।


कोड संकलित नहीं करता है। इसके अलावा, getchar()कुछ चरित्र को दबाने तक ब्लॉक करता है।
जी। स्लीपेन

संकलित करता है और एक लाइनक्स मशीन पर चलता है
हाबिल टॉम

शायद ungolfed संस्करण, लेकिन गोल्फ संस्करण नहीं करता है। पहले से ही m=0,s=0;यह विफल रहता है, क्योंकि आपने इन चर को कहीं भी घोषित नहीं किया था।
जी। स्लीपेन

3

जावास्क्रिप्ट, 124 बाइट्स

s=i=1,setInterval("s&&(d=document).close(d.write(`0${i/60%60|0}:`.slice(-3)+`0${i++%60}`.slice(-2))),d.onclick=_=>s=!s",1e3)

'नियंत्रण कुंजी' दस्तावेज़ पर एक क्लिक है। इसे जांचने के लिए, कोड को कंसोल में या <script>टैग के अंदर एक html फ़ाइल में पेस्ट करें।

स्पष्टीकरण:

let s = 1
let i = 1
setInterval(() => {
    //If s = true then check after the "&&" operator else false
    s && (d = document).close( //put the document variable inside the d variable, so now i don't need to use anymore the long word 'document, then i close the document
            d.write( //Write into the document the next string
                `0${i/60%60|0}:`.slice(-3) + `0${i++%60}`.slice(-2) //Here is the magic, here I update the 'i' variable and convert the 'i' value to minutes and seconds
            ) 
        ),
        d.onclick = _ => s = !s //Add onclick event to the document, if s = true then s = false, if s = false then s = true
}, 1e3) //1e3 = 1000

क्रोम में परीक्षण किया गया


1
साइट पर आपका स्वागत है! क्या ऑनलाइन परीक्षण साइट के लिंक में इसे संपादित करना संभव होगा, जैसे कि इसे ऑनलाइन आज़माएं! , ताकि अन्य उपयोगकर्ता आपके उत्तर को सत्यापित कर सकें?
caird coinheringaahing

धन्यवाद @cairdcoinheringaahing, यह jsfiddle के साथ है: jsfiddle.net/xjw7o0ps
कॉपीराइट

2

PHP, 94 91 बाइट्स

मुझे लगता है कि 32 अंतरिक्ष बार के लिए महत्वपूर्ण कोड है (जो कि यह शायद नहीं है);
वर्तमान में मेरे पास ncurses का परीक्षण करने का कोई तरीका नहीं है। लेकिन बाकी कोड ठीक काम करता है।

for($s=[STDIN];;)echo date("\ri:s",$t+=$r^=stream_select($s,$n,$n,1)&&32==ncurses_getch());

पर शुरू होता है 00:00, लेकिन ठहराव समाप्त होने पर तुरंत वेतन वृद्धि

यदि आप (मेरे जैसे) के पास नर्स नहीं हैं, तो आप दूसरे dateपैरामीटर को बदलकर $t+=$r^=!rand(sleep(1),19);या उसके साथ परीक्षण कर सकते हैं $t+=$r^=++$x%20<1+sleep(1);। ( sleepहमेशा लौटता है 0।)

टूट - फूट

for($s=[STDIN];                     // set pointer for stream_select
    ;                               // infinite loop:
)
    echo date("\ri:s",                  // 5. print CR + time
        $t+=                            // 4. increment $t if watch is running
        $r^=                            // 3. then toggle pause
            stream_select($s,$n,$n,1)   // 1. wait 1 second for a keystroke
            &&32==ncurses_getch()       // 2. if keystroke, and key==space bar
    ;

2

C # 220 बाइट्स

using static System.Console;
using static System.DateTime;
class P
{
    static void Main()
    {
        var l = Now;
        var d = l-l;
        for( var r = 1<0;;Write($"\r{d:mm\\:ss}"))
        {
            if (KeyAvailable&&ReadKey(1<2).KeyChar == 's')
            {
                l = Now;
                r = !r;
            }
            if (r)
                d -= l - (l = Now);
        }

    }
}

golfed

using static System.Console;using static System.DateTime;class P{static void Main(){var l=Now;var d=l-l;for(var r=1<0;;Write($"\r{d:mm\\:ss}")){(KeyAvailable&&ReadKey(1<2).KeyChar=='s'){l=Now;r=!r;}if(r)d-=l-(l=Now);}}}

sकुंजी का उपयोग शुरू / बंद करने के लिए। पूरे कार्यक्रम का उपयोग करके TimeDelta को याद करके काम करता हैDateTime.Now

ज्यादातर C # -Magic यहां C # 7.0 फीचर से आता है using static


2

बैश, 65 बाइट्स

trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}

ध्यान दें कि इसे सही ढंग से काम करने के लिए फ़ाइल स्क्रिप्ट पर लिखा जाना चाहिए, या फिर, कोशिश करें:

bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'

विस्तारित संस्करण इसकी व्याख्या करने के लिए:

trap d=\$[!d] 2                     # flip d for each INT (ctrl-c) signal.
for((n=0;;)){                       # repeat forever the code inside the {...}
                                    # The n=0 is not strictly needed.
    printf "\r%(%M:%S)T" "$[n+=d]"  # Print Minute:Second string calculated from 
                                    # the n value, increment by the value of d.
                                    # If IFS is not numeric (0-9), then, the
                                    # quotes around "$[n+=d]" could be removed.
    sleep 1                         # wait for 1 second.
}

%(...)Tप्रिंट करने का प्रारूप bash 5+ में मान्य है।


काम नहीं करता है। 00:00जब आप हिट करते हैं तो बस एक प्रिंट और इंक्रीमेंट करता है Ctrl-C। टाइमर का कोई एनिमेशन नहीं है। (बैश 5.0.7 पर परीक्षण किया गया)
डकैल

1
क्या आपने किसी स्क्रिप्ट को कोड लिखा था? वरना प्रयास करें: bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'। @ यूरोलॉजिक
आइजैक

आह, यह काम किया! स्क्रिप्ट को bash -c:) के साथ चलाया जाना है
डकैल

1

सी (जीसीसी) , 121 115 बाइट्स

p,r;g(){r^=1;}main(t,b){for(b=time(signal(2,g));;r?p=t:(b+=t!=p))t=time(0)-b,printf("\r%02d:%02d  ",t/60%60,t%60);}

इसे ऑनलाइन आज़माएं!

SIGINT के लिए एक सिग्नल हैंडलर सेट करता है, जिसे कंट्रोल-सी दबाकर ट्रिगर किया जाता है। हम एक टाइम ऑफ़सेट रखते हैं b, और वॉल ऑफ़ टाइम माइनस ऑफ़ ऑफ़ टाइम को प्रदर्शित करते हैं। यदि हमें रोक दिया जाता है, तो हर बार प्रदर्शित समय को फ्रीज करने के लिए दीवार घड़ी की टिक को बढ़ाते हुए समय के आधार को बढ़ाएं।

6 बाइट शेविंग के लिए @ceilingcat को धन्यवाद!


0

Zsh + Gnu दिनांक, 242 बाइट्स

1/100 सेकंड की विशेषता! इसके लिए एक इंटरैक्टिव टर्मिनल की आवश्यकता होती है, लेकिन यहाँ एक TIO लिंक वैसे भी है। टाइमर शुरू / बंद करने के लिए
मारो Enter; Ctrl-Cबाहर निकलने के लिए।

u(){p=`gdate +%s`;q=`gdate +%N`;}
f(){read -t0.01&&{read;break};unset REPLY}
g(){while :;{u;t=$[p-a];s=$[t%60];m=$[(t%3600-s)/60]
echo "\r`printf %02d:%02d $m $s`.$q[1,2]\c";f;}}
<<<ready;read;u;a=$p
while :;{f;echo "\r\e[2A\c";u;a=$[p-t];g;}

टिप्पणियाँ (थोड़ा पुराना):

u()echo $[`gdate +%s%N`/1000]       # fn:unix timestamp extended to µs
v()gdate +%s                        # fn:unix time, in s
f(){read -t0.01 -r&&{read -r;break;} # fn:listens for "Enter"
                      ;unset REPLY;}

g(){while :;                        # fn:rolling stopwatch
    {q=`u`;t=$[`v`-a]               #    t=time diff from baseline (s)
    ;echo "\r`printf %02d:%02d      #    format output
    $[(t%3600-s)/60] $s`            #    minutes:seconds
    .${q:10:2}\c";                  #    .xx = partial seconds
    f;}}                            #    listen for "Enter"

                                    # Execution starts here!
<<<ready;read;u;a=$p                # Wait for "Enter"; get baseline $a

while :;{                           # Main program loop
         f;                         # listen for an "Enter"
           echo "\r\e[2A\c"         # go up 1 line of the console
a=$[`v`-t]                          # reset the baseline
                ;g;}                # begin the stopwatch

@ इस्साक, ऐसा कोई तरीका नहीं है जिससे मैं आपके जवाब को संक्षिप्तता और शान के लिए हरा सकता हूं, इसलिए मैंने सोचा कि मैं इसके बजाय सुविधाएँ
जोड़ूंगा

1
यह एक उत्कृष्ट लक्ष्य है @roblogic :-) .... .... अभी भी आपके कोड को समझ रहा है ....
आइजैक

0

कमोडोर BASIC (C64 / TheC64 मिनी, VIC-20, PET, C16 / + 4) - 147 टोकन और BASIC बाइट्स

 0?"{clear}":geta$:ifa$<>" "thengoto
 1ti$="000000"
 2fori=.to1:?"{home}"mid$(ti$,3,2)":"mid$(ti$,5,2):geta$:b$=ti$:i=-(a$=" "):nE:pO198,.
 3geta$:ifa$<>" "then3
 4ti$=b$:goto2

{clear} सूची में है SHIFT+CLR/HOME जो एक उद्घाटन उद्धरण चिह्न का पालन करते समय एक PETSCII चरित्र के रूप में आउटपुट होता {home}है , जबकि CLR/HOMEएक उद्घाटन उद्धरण चिह्न का अनुसरण करने की समान स्थिति पर बदलाव के बिना कुंजी है।

नियंत्रण कुंजी के रूप में स्पेस बार का उपयोग करें।

बुनियादी 7 में कमोडोर 128 के साथ काम करने के लिए, निम्नलिखित पंक्तियों में लिस्टिंग को बदलें:

 0?"{clear}":geta$:ifa$<>" "thengoto0
 2fori=.to1:?"{home}"mid$(ti$,3,2)":"mid$(ti$,5,2):geta$:b$=ti$:i=-(a$=" "):nE:poK198,.

गिनती के लिए एक अतिरिक्त सात टोकन जोड़ता है (जैसा कि सभी संख्या 7 बाइट्स के रूप में बेसिक में संग्रहीत हैं, इसलिए goto108 टोकन बाइट्स हैं जबकि gotoकेवल 1 है)।

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