ใช้นาฬิกาจับเวลา


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 (หรือ Unicode) ที่พิมพ์ได้เช่นการใช้ไบนารี่สองตัว (ไม่สามารถพิมพ์ได้) สำหรับนาทีและวินาทีไม่ได้รับอนุญาต

คุณต้องซ้ายด้วยเอาท์พุทของคุณด้วยศูนย์ตามความเหมาะสมถ้าระบบตัวเลขของคุณอนุญาต

การแทนที่อักขระตัวคั่น:ด้วยอักขระตัวพิมพ์อื่น ๆ (รวมถึงตัวเลข) ก็สามารถใช้ได้เช่นกัน

การควบคุม

นาฬิกาจับเวลาควรเริ่มหยุดชั่วคราวและอยู่ในสถานะนี้จนกว่าผู้ใช้จะเริ่มอย่างชัดเจนโดยกดปุ่ม'ควบคุม' (ดูด้านล่าง)

หากในขณะที่นาฬิกาจับเวลากำลังนับผู้ใช้กดปุ่ม'ควบคุม'อีกครั้งนาฬิกาจับเวลาควรหยุด (รักษาเวลาปัจจุบัน) จนกระทั่งปุ่ม'ควบคุม'ถูกกดอีกครั้ง

'ควบคุม'ที่สำคัญสามารถกดแป้นพิมพ์เดียวเช่นsหรือการรวมกันของคีย์ใด ๆ เช่นCtrl+Shift+Xแต่มันจะต้องเป็น 'อะตอม' กดปุ่มหลายในลำดับเช่นsนั้นEnterจะไม่ได้รับอนุญาต

เช่นเดียวกับ'ควบคุม'คีย์ (หรือการรวมกัน) จะต้องใช้ในการหยุดการทำงานชั่วคราวและกลับมานาฬิกาจับเวลา

คุณต้องใช้คีย์'ควบคุม' ที่เฉพาะเจาะจงเช่นไม่อนุญาตให้ใช้ "คีย์ใด ๆ "

หรือคุณสามารถใช้การคลิกเมาส์หนึ่งครั้งหรือสองครั้งแทนการกดปุ่มเพื่อ 'ควบคุม'


กฎระเบียบ

  • นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
  • มีช่องโหว่ของรหัสมาตรฐานสำหรับกอล์ฟ
  • โปรแกรมของคุณจะต้องสามารถทำงานได้ตลอดไป (ในทางทฤษฎี)

สามารถป้อนรหัส 'ควบคุม' ได้หรือไม่
Loovjo

@ Loovjo ใช่คีย์เดียวหรือการรวมกันของคีย์จะทำรวมถึง Enter (ตราบเท่าที่มันสามารถหยุดชั่วคราวแล้วกลับมาทำงานต่อโดยใช้คีย์เดียวกัน)
Zeppelin


1
เราต้องการเมล็ดย่อยที่สองหรือไม่? คือถ้าผู้ใช้หยุดพิมพ์ประมาณ 7000 มิลลิวินาทีหลังจาก00:05นั้นและในบางจุดจะกลับมาทำงานอีกครั้งต้อง00:06ปรากฏ 3000 มิลลิวินาทีหลังจากกดคีย์ประวัติหรือไม่ก็พิมพ์วินาทีเต็มหลังจากกดปุ่ม Resume หรือไม่?
smls

@smls ไม่ต้องรอสองวินาทีหลังจากทำงานต่อ
เรือเหาะ

คำตอบ:


8

SmileBASIC, 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ใช้!=ซึ่งเป็น eqivilant เป็น XOR แบบลอจิคัลตราบเท่าที่อินพุตทั้งสองเป็น 1 หรือ 0


มันดูยอดเยี่ยม! หากคุณสามารถจัดทำ "screencast" แบบเคลื่อนไหวได้ด้วยวิธีการใช้งานนั่นจะเป็นที่นิยมอย่างมาก!
Zeppelin

ตกลงฉันจะทำเร็ว ๆ นี้
12Me21

นอกจากนี้ยังสามารถทดสอบกับตัวจำลองนี้ได้: citra-emu.org/game/smilebasic
roblogic

9

Python 2, 167 129 ไบต์

-36 ไบต์ส่วนใหญ่ * จากการใช้ความคิดของ Maltysen ในการจับctrl-cโดยใช้ข้อยกเว้น - ไปให้เครดิต!
-4 ไบต์ต้องขอบคุณ DLosc (init nและb0 มากกว่าf())
-1 byte ขอบคุณ FlipTack (ใช้p^=1แทนp=1-p)
-2 ไบต์ขอบคุณ Felipe Nardi Batista (ลบตัวระบุความแม่นยำ)

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แต่มีลำดับที่สำคัญการควบคุมของ
(ทดสอบโดยฉันด้วย Python 2.7.8 บน Windows 7, 64 บิต
ทดสอบโดย Brian Minton กับ Python 2.7.13 บน Linux, 64 บิต)

* 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),

(ทดสอบโดยฉันด้วย Python 2.7.8 บน Windows 7, 64 บิต - รหัสนี้เป็นเฉพาะของ Windows เนื่องจากการใช้msvcrtห้องสมุด)

ปุ่มควบคุมคือ 'p'

nและbถูกกำหนดค่าเริ่มต้นเป็นค่าเดียวกันเมื่อเริ่มต้นให้ "ชดเชย" เป็น 0; pถูกกำหนดค่าเริ่มต้นเป็น 0 ซึ่งบ่งชี้ว่าสถานะหยุดชั่วคราว

เมื่อใดก็ตามที่กดปุ่มควบคุมค่าของpจะถูกเปลี่ยน เมื่อเปลี่ยนจากสถานะหยุดชั่วคราวไปยังรัฐที่ใช้งานbมีการปรับปรุงให้เป็นค่าใหม่การรักษาใด ๆ ในปัจจุบันชดเชยจากสถานะการทำงานก่อนหน้า (s) b-nด้วย

ในระหว่างการใช้งานของรัฐnที่มีการปรับปรุงซ้ำ ๆ time.time()เพื่อเวลาปัจจุบันโดยการเรียก

ความแตกต่างระหว่างnและb, tคือจำนวนวินาทีทั้งหมด (รวมถึงส่วนที่เป็นเศษส่วน) ที่ผ่านไประหว่างสถานะที่ใช้งานอยู่

นาทีที่ผ่านไปแล้วt/60และแต่ละนาทีและวินาทีจะแสดง mod 60 (t/60%60,t%60)ห้องพร้อมด้วย '...%0.2d...'ศูนย์ชั้นนำจะใช้ได้สำหรับแต่ละใช้สตริงการจัดรูปแบบของส่วนจำนวนเต็มด้วย การพิมพ์ tuple (ส่วนท้าย,) ที่รายการแรกมีการคืนค่านำหน้า (the \r) ทำให้ข้อความที่พิมพ์ก่อนหน้านี้ถูกเขียนทับ


อาใช่จับได้ดีฉันเดิมมี^=แต่เปลี่ยนบางจุดระหว่างการกำหนด
Jonathan Allan

@DLosc แน่นอนขอบคุณ ...
Jonathan Allan

ไม่ใช่เฉพาะ Windows ฉันเพิ่งทดสอบสิ่งนี้บน linux 64 บิตด้วย Python 2.7.13 และใช้งานได้ (พร้อมปุ่มควบคุมของ Ctrl-C)
Brian Minton

@BrianMinton ขอบคุณที่แจ้งให้เราทราบ!
Jonathan Allan

สิ่งที่จำเป็นสำหรับการ.เข้า%0.2d? มันใช้งานได้ดีในขณะที่%02d
เฟลิเป้นาร์ดีบาติสตา

6

Python - 160 159 143 ไบต์

ขอบคุณ @JonathanAllan ที่ช่วยฉันได้ 18 ไบต์!

เพียงใช้ builtin ห้องสมุดเพื่อการควบคุมที่สำคัญคือจับมันด้วยctrl-cexcept 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:ใช่มั้ย ฉันได้เป็นรุ่นที่ทำงานของผมทำมัน ...
โจนาธานอัลลัน

@JanathanAllan oh cool ไม่รู้ว่าคุณทำได้
Maltysen

5

bash + ยูทิลิตี้ Unix, 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- ไบต์


ฉันอาจจะชี้ให้เห็นว่าการแก้ปัญหานี้เช่นเดียวกับอย่างน้อยบางส่วนของคนอื่น ๆ ที่โพสต์จะมากช้าตกหลังเวลาที่ผ่านไปจริง การลื่นไถลนี้เป็นเพราะโปรแกรมกำลังหลับเป็นเวลาหนึ่งวินาทีระหว่างแต่ละการดำเนินการของเนื้อความของการวนรอบ แต่ร่างกายของการวนรอบใช้เวลาเล็กน้อยในการดำเนินการ นี่จะไม่สำคัญในทางปฏิบัติ


ดูเหมือนว่าสิ่งนี้จะไม่แสดงค่าเริ่มต้นบนหน้าจอจนกว่าคุณจะ "ยกเลิกการหยุดชั่วคราว"
Zeppelin

"นาฬิกาจับเวลาควรเริ่มหยุดชั่วคราวและอยู่ในสถานะนี้จนกว่าผู้ใช้จะเริ่มต้นอย่างชัดเจนโดยกดปุ่ม" ควบคุม "(ดูด้านล่าง)" มีสเป็คที่ฉันพลาดหรือไม่?
Mitchell Spector

ใช่นี่ถูกต้อง แต่ก็ควรจะแสดงค่าเริ่มต้นInitially, you can start with '00:00' or with any other value in range [00:00-59:59]ซึ่งจะยังคงอยู่บนหน้าจอจนกว่าคุณจะกด 'ควบคุม' เป็นครั้งแรก ขออภัยถ้าฉันไม่สามารถกำหนดได้ชัดเจนพอ!
Zeppelin

ตกลงที่เหมาะสม - ฉันจะแก้ไข
Mitchell Spector

1
ดูดีทั้งหมดตอนนี้!
Zeppelin

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 วินาที:

นาฬิกาจับเวลาทำงาน

Ungolfed และแสดงความคิดเห็น

' 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และ\ตัดให้เป็นจำนวนเต็ม แต่มันจะเพิ่มความแม่นยำให้กับจำนวนเวลาที่บันทึกไว้: หากคุณหยุดจับเวลาก่อนที่ติ๊กคุณจะเห็นเมื่อคุณเริ่มต้นใหม่อีกครั้งว่าตัวเลขจะเปลี่ยนในเวลาน้อยกว่าหนึ่งวินาที


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

สิ่งนี้ไม่ได้ใช้อะไรนอกจาก Bash builtins (ไม่มีเครื่องมือภายนอก) อักขระควบคุมคือCtrl-Zเพื่อให้การSIGTSTPจัดการมาตรฐานหยุดนาฬิกาจับเวลาชั่วคราว

หากCtrl-Zกดในขณะที่ subshell ถูกนำหน้าจะหยุดการทำงานชั่วคราวและส่งคืนสคริปต์ภายนอกไปยังเบื้องหน้าซึ่งจะรออย่างเงียบ ๆ หากสคริปต์ด้านนอกอยู่เบื้องหน้าตัวจัดการแทร็บจะเริ่มการทำงานของ subshell ต่อและจะนับอีกครั้ง


3

Javascript ในคอนโซล Chrome ขนาด 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จำนวนชั้น

ทำและทดสอบในคอนโซล Chrome


คำตอบที่ดี คุณสามารถลบบางไบต์โดยใช้อาร์กิวเมนต์ดัมมี่สำหรับฟังก์ชั่นที่ไม่รับอาร์กิวเมนต์และคุณสามารถแทนที่อาร์กิวเมนต์แรกใน setInterval ด้วยสตริงที่มีรหัส
ลุค

1
132 B: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)
ลุค

Ohh, nice :) เรียนรู้สิ่งต่าง ๆ ที่นี่ สตริงในช่วงเวลาและ _ => g ++ ขอบคุณ :)
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ดังนั้นสตริงของโค้ดจะถูกประเมินทุก ๆ 1,000 มิลลิวินาที ชุดนี้ตัวแปรเป็น id ของช่วงเวลาเพื่อให้สามารถหยุดในภายหลัง ถ้าbมีตัวเลขมันจะประเมินค่าtrueดังนั้นช่วงเวลาจะหยุด นี่จะส่งคืนค่าundefinedดังนั้นรอบจะดำเนินต่อไป

สตริงของรหัสจะเปลี่ยน html ขององค์ประกอบด้วย id a(นาฬิกาจับเวลา) อันดับแรกนาทีจะถูกแยกวิเคราะห์โดยใช้ค่าตัวจับเวลาก่อนหน้าแยกโดยเครื่องหมายโคลอนและรับค่านาทีซึ่งเพิ่มขึ้น 0 หากค่าของวินาทีไม่ 59 (มากกว่า 58) และ 1 มิฉะนั้น modulo 60 จากนั้นค่านี้จะถูกเติม จากนั้นลำไส้ใหญ่ก็มาถึงและในไม่กี่วินาที โค้ดจะได้รับค่าเก่าเพิ่มขึ้นทีละ 1 ใช้โมดูโล 60 และใส่แผ่นเสริม


ดูเหมือนจะไม่ได้ผลเลย ฉันเพิ่งได้รับ ReferenceError: d ไม่ได้ถูกกำหนด
Alexis Tyler

คุณสามารถบันทึกได้สองสามไบต์ด้วยการลบ href = # เนื่องจากไม่จำเป็นจริง ๆ เมื่อคุณใช้ onclick
Alexis Tyler

ฉันแค่แก้ไขมัน ฉันยังลบ href ออกเพราะคุณพูดถูก ขอบคุณ!
ลุค

คุณไม่สามารถวาง onclick บนแท็ก b และระบุในคำตอบ?

ฉันคิดว่ามันใช้งานได้ มันบันทึก 9B ขอบคุณมาก!
ลุค

3

C 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;}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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มันเป็นวิธีการเข้ารหัสที่ไม่ดีใน C แต่ฉันไม่สามารถหาวิธีอื่นได้


รหัสไม่ได้รวบรวม นอกจากนี้getchar()บล็อกจนกว่าตัวอักษรบางตัวจะถูกกด
G. Sliepen

รวบรวมและทำงานบนเครื่อง linux
Abel Tom

อาจเป็นรุ่นที่ไม่ได้รับการอวด แต่รุ่นที่ตีกอล์ฟไม่ได้ ที่m=0,s=0;มันล้มเหลวแล้วเพราะคุณไม่ได้ประกาศตัวแปรเหล่านี้ที่ใดก็ได้
G. Sliepen

3

Javascript, 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)

'ปุ่มควบคุม' คือการคลิกที่เอกสาร ในการทดสอบวางรหัสในคอนโซลหรือในไฟล์ html ภายใน<script>แท็ก

คำอธิบาย:

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

ทดสอบใน Chrome


1
ยินดีต้อนรับสู่เว็บไซต์! เป็นไปได้ไหมที่จะแก้ไขลิงก์ในเว็บไซต์ทดสอบออนไลน์เช่นลองออนไลน์! เพื่อให้ผู้ใช้รายอื่นสามารถยืนยันคำตอบของคุณ
caird coinheringaahing

ขอบคุณ @cairdcoinheringaahing นี่คือด้วย jsfiddle: jsfiddle.net/xjw7o0ps
TheCopyright

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แต่จะเพิ่มขึ้นทันทีเมื่อหยุดชั่วคราว

ถ้าคุณ (เช่นฉัน) อย่ามี ncurses, คุณสามารถทดสอบโดยการเปลี่ยนที่สอง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);
        }

    }
}

แข็งแรงเล่นกอล์ฟ

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 using staticที่นี่มาจากคุณลักษณะ


2

Bash ขนาด 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รูปแบบ printf เป็นที่ถูกต้องในการทุบตี 5+


ใช้งานไม่ได้ พิมพ์เพียงและเพิ่มทีละเคาน์เตอร์เมื่อคุณกด00:00 Ctrl-Cไม่มีภาพเคลื่อนไหวของตัวจับเวลา (ทดสอบเมื่อทุบตี 5.0.7)
roblogic

1
คุณเขียนรหัสไปยังสคริปต์หรือไม่ หรืออื่น ๆ bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'โปรดลอง: @roblogic
Isaac

อ่าทำงานแล้ว! สคริปต์จะต้องทำงานด้วยbash -c:)
roblogic

1

C (gcc) , 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 ซึ่งถูกทริกเกอร์โดยการกด control-C เราให้เวลาในการชดเชยbและแสดงเวลานาฬิกาแขวนลบด้วยการชดเชยเวลา หากเราหยุดชั่วคราวเพิ่มเวลาให้สูงขึ้นทุกครั้งที่นาฬิกาแขวนติ๊กเพื่อหยุดเวลาที่แสดง

ขอบคุณ @ceilingcat สำหรับการโกนขนาด 6 ไบต์!


0

Zsh + Gnu date, 242 bytes

นำเสนอ 1 ใน 100 ของวินาที! มันต้องมีการโต้ตอบขั้ว แต่นี่คือการเชื่อมโยงติ้วอยู่แล้ว
กด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

@Isaac ไม่มีทางที่ฉันจะเอาชนะคำตอบของคุณสำหรับความกะทัดรัดและความสง่างามดังนั้นฉันคิดว่าฉันจะเพิ่มฟีเจอร์แทน ...
roblogic

1
นั่นคือเป้าหมายที่ยอดเยี่ยม @roblogic :-) .... .... ยังคงเข้าใจโค้ดของคุณอยู่ ....
ไอแซค

0

Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 โทเค็นและไบต์พื้นฐาน

 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คีย์โดยไม่มีการเปลี่ยนแปลงในสภาพเดียวกันกับการทำเครื่องหมายอัญประกาศเปิด

ใช้แป้นเว้นวรรคเป็นปุ่มควบคุม

หากต้องการทำงานกับ Commodore 128 ใน BASIC 7 ให้เปลี่ยนรายชื่อในบรรทัดต่อไปนี้:

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

เพิ่มโทเค็นพิเศษอีกเจ็ดตัวให้กับการนับ (เนื่องจากตัวเลขทั้งหมดจะถูกเก็บไว้ใน BASIC เป็น 7 ไบต์ดังนั้นจึงgoto10เป็น 8 โทเค็นไบต์ในขณะที่gotoมีเพียง 1)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.