스톱워치 구현


23

간단한 디지털 스톱워치를 구현하면 아래에 설명 된대로 시간이 초와 분 단위로 표시됩니다.

중대한

디스플레이컨트롤 섹션을 모두 읽으십시오 !

디스플레이

경과 된 시간 MM:SS은 이전에 표시된 시간 문자열 "in-place"를 대체 하여 형식 으로 표시해야합니다 (화면의 전체 또는 일부를 지울 수도 있습니다).

스톱워치는 최소한 1 초마다 업데이트해야합니다.

예 :

0 분 0 초

00:00

0 분 33 초

00:33

1 분 50 초

01:50

처음에는 '00 : 00 '또는 [00 : 00-59 : 59] 범위의 다른 값으로 시작할 수 있습니다.

스톱워치에 도달하면으로 59:59재설정 00:00되고 계속 새로 고침됩니다.

원하는 경우 일반 패턴을 따르는 한 다른 밑 (10 진수 대신) 또는 다른 숫자 시스템을 사용할 수 있습니다.

예를 들어 다음 13:03과 같이 표시 할 수 있습니다.

소수

13:03

16 진수

0D:03

Base64

N:D

Quater-imaginary base

10101:3

로마 숫자

XIII:III

10 진수가 아닌 숫자 시스템 /베이스를 사용하는 경우 인쇄 가능한 ASCII (또는 유니 코드) 문자를 사용하여 인코딩해야합니다 (예 : 분 및 초 동안 2 진 (인쇄 불가능) 바이트를 사용하는 것은 허용되지 않음).

수치 시스템에서 허용하는 경우 출력을 적절하게 0으로 채 웁니다.

구분 문자 :를 다른 인쇄 가능한 문자 (숫자 포함)로 바꾸는 것도 가능합니다.

통제 수단

스톱워치는 일시 정지 상태로 시작 하고 사용자가 명시 적으로 시작할 때까지 'control' 키 를 눌러이 상태를 유지 해야합니다 (아래 참조).

스톱워치가 카운팅하는 동안, 사용자가 누르면, 만약 '제어' 키를 다시, 스톱워치한다 일시 까지 (현재 시간을 유지하는) '제어' 누르면 키를 한 번 더 누를 .

'제어' 키는 단일 키 스트로크, 즉 일 수 s, 또는 예를 들면 키의 조합을 Ctrl+Shift+X하지만, 예를 들어, 순차적으로 다수의 키를 눌러, "원자"이어야 s다음 Enter이다 금지 .

스톱워치 를 일시 중지 하고 다시 시작 하려면 동일한 'control' 키 (또는 조합)를 사용해야합니다 .

특정 'control' 키를 사용해야합니다 . 즉 'any key'는 허용되지 않습니다.

또는 'control'의 키 누르기 대신 한 번 또는 두 번의 마우스 클릭을 사용할 수 있습니다.


규칙

  • 이것은 이며 바이트 단위로 가장 짧은 답변입니다.
  • 표준 코드 골프 허점이 적용됩니다.
  • 프로그램은 (이론적으로) 영원히 실행될 수 있어야합니다.

'control'키를 입력 할 수 있습니까?
Loovjo

@Loovjo 예, Enter를 포함하여 단일 키 또는 키 조합이 수행됩니다 (동일한 키를 사용하여 일시 중지 한 후 다시 시작할 수있는 한).
zeppelin


1
1 초 미만의 세분성이 필요합니까? 즉, 사용자 00:05가 인쇄 한 후 약 7000 밀리 초 동안 일시 중지 한 다음 다시 시작 00:06하면 다시 시작 키를 누른 후 3000 밀리 초가 나타나야합니까, 다시 시작 키를 누른 후 1 초를 인쇄해도 괜찮습니까?
smls

@smls 다시 시작한 후 1 초 정도 기다릴 수 있습니다.
zeppelin

답변:


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사용자가 터치 스크린의 버튼을 누를 때까지이 유지됩니다.

DIALOG1사용자가 버튼을 눌렀 0는지 그리고 자동으로 닫혔는지 여부를 반환 합니다 . 따라서 사용자가 일시 정지 버튼을 누르면1 하고 표시 시간이으로 설정되어 0스톱워치를 일시 중지합니다. 사용자가 버튼을 다시 누르면 1타이머를 다시 시작하여 표시 시간을 다시으로 설정합니다 . 기본적마다 DIALOG반품 1, 표시 시간 사이의 전환 10사용 !=모두 입력이 1 또는 0 인만큼 같은 논리 XOR을 eqivilant이다.


대단해! 작동 방식에 대한 애니메이션 "스크린 캐스트"를 제공 할 수 있다면 대단히 감사하겠습니다!
zeppelin

좋아, 곧 할게요
12Me21

또한이 에뮬레이터에서 테스트 할 수 있습니다 : citra-emu.org/game/smilebasic
roblogic

9

파이썬 2, 167129 바이트

Maltysen의ctrl-c 예외 를 잡는 아이디어 를 사용하여 -36 바이트 * 대부분 크레딧을 제공하십시오!
-4 (INIT DLosc 덕분 바이트 nb보다는 0 f())
-1 바이트 FlipTack 덕분에 (사용 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.
(Windows 7, 64 비트에서 Python 2.7.8으로
테스트, Linux, 64 비트에서 Python 2.7.13으로 Brian Minton에서 테스트)

또한 하나의 라이너로 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),

(Windows 7, 64 비트에서 Python 2.7.8으로 테스트했습니다. 그러나이 코드는 msvcrt 라이브러리 )

제어 키는 'p'입니다.

nb는 0 "오프셋"주고 시동시와 동일한 값으로 초기화된다;p일시 중지 된 상태를 나타내는 0으로 초기화됩니다.

컨트롤 키를 누를 때마다의 값 p이 전환됩니다. 활성 상태로 일시 중지 상태로 전환 할 때 b이전 활성 상태 (들)로부터 어떠한 전류 오프셋을 유지하는 새로운 값으로 갱신된다b-n .

활성 상태 n에서을 호출하여 현재 시간으로 반복 업데이트됩니다 time.time().

차이 nb,t (분수 부분을 포함) (초)의 갯수가 다음 인 액티브 상태 (S)의 경과시.

그런 다음 경과 한 t/60시간이 표시되고 분과 초 각각에 모드 60이 표시됩니다 (t/60%60,t%60). 앞에 0으로 정수 부분의 문자열 형식을 사용하여 앞에 0이 붙습니다 '...%0.2d...'. ,첫 번째 항목에 선행 캐리지 리턴이 있는 튜플 (후행 )을 \r인쇄하면 이전에 인쇄 된 텍스트를 덮어 씁니다.


아 네, 잘 잡았습니다. 원래 원래는 작성 ^=했지만 어떤 시점에서 전환하는 동안 전환했습니다.
Jonathan Allan

@DLosc, 정말로 감사합니다 ...
Jonathan Allan

Windows 전용이 아닙니다. 방금 Python 2.7.13으로 Linux 64 비트에서 이것을 테스트했으며 작동했습니다. (Ctrl-C의 제어 키 사용)
Brian Minton

@BrianMinton 감사합니다.
Jonathan Allan

의 필요성 무엇 .인은 %0.2d? 그것은 그대로 작동합니다%02d
Felipe Nardi Batista

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:합니까? 나는 그것을하고있는 나의 작업 버전을 가지고있다.
Jonathan Allan

@JonathanAllan 오, 멋지다.
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 초 동안 작동한다는 것입니다 (이 시점에서 bash는 정수 오버플로를 제공합니다).

93 바이트 버전은 진정으로 영원히 작동합니다.

원래 문제에는 "이론적으로 프로그램이 영원히 실행될 수 있어야합니다."라는 요구 사항이 포함되었습니다.

2 ^ 63 초 동안 실행해도 해당 요구 사항을 충족 할 수 있으면 90 바이트 솔루션이 작동합니다. 그 기간은 우주 시대의 20 배 이상입니다!

프로그램이 그보다 오래 실행될 수 있으면 93 바이트 솔루션을 사용해야합니다.


아마도이 솔루션과 게시 된 다른 솔루션 중 일부 는 실제 경과 시간보다 매우 느리게 떨어질 것 입니다. 이 미끄러짐은 루프 본문이 실행될 때마다 프로그램이 1 초 동안 잠자기 때문이지만 루프 본문은 실행하는 데 약간의 시간이 걸립니다. 실제로는 중요하지 않습니다.


"일시 중지"할 때까지 화면에 초기 값이 표시되지 않는 것 같습니다.
zeppelin

"스톱워치는 일시 정지 상태로 시작하고 사용자가 명시 적으로 시작할 때까지 'control'키를 눌러야합니다 (아래 참조)." 내가 놓친 사양이 있습니까?
Mitchell Spector

그렇습니다. 그러나 여전히 초기 값을 표시해야합니다.이 값 Initially, you can start with '00:00' or with any other value in range [00:00-59:59]은 처음으로 'control'을 누를 때까지 화면에 유지됩니다. 내가 이것을 명확하게 공식화 할 수 없다면 죄송합니다!
zeppelin

알겠습니다. 이해하겠습니다. 수정하겠습니다.
Mitchell Spector

1
지금은 모두 좋아 보인다!
zeppelin

5

Q 기본, 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 초에 일시 중지됩니다.

Stopwatch running

언 골프 및 댓글

' 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\잘라 내기 정수에. 그러나 시간을 절약 할 수있는 정확도가 높아집니다. 틱 바로 전에 타이머를 일시 중지하면 타이머를 다시 시작하면 1 초 이내에 숫자가 변경되는 것을 볼 수 있습니다.


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타이머가 일시 중지됩니다. 출력 깜박임은 3 바이트 또는 4 바이트의 비용으로 줄일 수 있습니다.


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 내장 (외부 도구 없음) 만 사용합니다. 제어 문자는 Ctrl-Z이므로 표준 SIGTSTP처리는 스톱워치를 일시 중지합니다.

경우 Ctrl-Z서브 쉘이 foregrounded 동안 누르면, 그것은 실행을 일시 정지하고 자동으로 대기 전경에 외부 스크립트를 반환합니다. 외부 스크립트가 포 그라운드 인 경우 트랩 핸들러는 서브 쉘의 실행을 재개하고 다시 카운트합니다.


3

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의 첫 번째 인수를 코드가 포함 된 문자열로 바꿀 수 있습니다.
Luke

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 + 자바 스크립트 (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 밀리 초마다 코드 문자열이 평가됩니다. 변수를 간격의 ID로 설정하므로 나중에 중지 할 수 있습니다. b숫자가 포함 되면로 평가 true되므로 구간이 중지됩니다. 이것은 값을 반환undefined 하므로주기가 계속됩니다.

코드 문자열은 요소의 html을 id a(스톱워치)로 변경합니다. 먼저 이전 스톱워치 값을 가져와 콜론으로 나누고 분 값을 가져 와서 분을 구문 분석합니다. 분 값은 초가 59 (58보다 크지 않은 경우)가 0이면 증가하고 그렇지 않으면 1입니다. 그런 다음이 값이 채워집니다. 그런 다음 콜론과 마지막 초가옵니다. 코드는 단순히 이전 값을 가져 와서 1 씩 증가시키고 모듈로 60을 취하고 선택적으로 채 웁니다.


이것은 전혀 작동하지 않는 것 같습니다. 방금 ReferenceError를 얻습니다 : d는 정의되지 않았습니다
Alexis Tyler

href = #을 제거하여 onclick을 사용하므로 실제로 필요하지 않으므로 몇 바이트를 절약 할 수도 있습니다.
Alexis Tyler

방금 수정했습니다. 당신이 옳았 기 때문에 나는 또한 href를 제거했습니다. 감사!
Luke

onclick을 b 태그에 넣고 대답에 지정할 수 없습니까?

나는 그것이 효과가 있다고 생각합니다. 9B를 절약했습니다. 고마워요!
Luke

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루프를 반복하고 카운팅을 다시 시작하십시오.

이제 gotoC에서 나쁜 코딩 방법을 알고 있지만 다른 방법으로는 알 수 없습니다.


코드가 컴파일되지 않습니다. 또한 getchar()일부 문자를 누를 때까지 차단합니다.
G. Sliepen

리눅스 머신에서 컴파일 및 실행
Abel Tom

골프화되지 않은 버전이지만 골프 버전은 그렇지 않습니다. m=0,s=0;이 변수를 어디에도 선언하지 않았기 때문에 이미 실패했습니다.
G. Sliepen

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)

'제어 키'는 문서를 클릭하는 것입니다. 이를 테스트하려면 코드를 콘솔 또는 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
사이트에 오신 것을 환영합니다! 온라인 사용해보기 와 같은 온라인 테스트 사이트에 대한 링크에서 편집 할 수 있습니까? 다른 사용자가 답변을 확인할 수 있도록 하시겠습니까?
케언 트 코 헤어 링가

@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은 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의 printf에 대한 형식은 5+ 떠들썩한 파티에서 유효합니다.


작동하지 않습니다. 00:00당신이 때 카운터를 인쇄 하고 증가합니다 Ctrl-C. 타이머의 애니메이션이 없습니다. (bash 5.0.7에서 테스트)
roblogic

1
스크립트에 코드를 작성 했습니까? 또는 다른 방법으로 시도하십시오 : bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'. @roblogic
이삭

아, 효과가있었습니다! 스크립트가 실행되어야합니다 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);}

온라인으로 사용해보십시오!

control-C를 눌러 트리거되는 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

@Isaac, 간결함과 우아함에 대한 답변을 이길 수있는 방법이 없으므로 대신 기능을 추가 할 것이라고 생각했습니다.
roblogic

1
그것은 훌륭한 목표입니다 @roblogic :-) .... .... 여전히 코드 이해 ....
Isaac

0

코모도어 베이직 (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 를 따르는 것과 동일한 조건에서 시프트가없는 키 있습니다.

스페이스 바를 제어 키로 사용하십시오.

BASIC 7에서 Commodore 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 개의 토큰을 더 추가합니다 (모든 숫자가 BASIC에 7 바이트로 저장되므로 goto108 개의 토큰 화 된 바이트 goto가 아니라 1입니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.