간단한 디지털 스톱워치를 구현하면 아래에 설명 된대로 시간이 초와 분 단위로 표시됩니다.
중대한
디스플레이 및 컨트롤 섹션을 모두 읽으십시오 !
디스플레이
경과 된 시간 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
0D:03
N:D
10101:3
XIII:III
10 진수가 아닌 숫자 시스템 /베이스를 사용하는 경우 인쇄 가능한 ASCII (또는 유니 코드) 문자를 사용하여 인코딩해야합니다 (예 : 분 및 초 동안 2 진 (인쇄 불가능) 바이트를 사용하는 것은 허용되지 않음).
수치 시스템에서 허용하는 경우 출력을 적절하게 0으로 채 웁니다.
구분 문자 :
를 다른 인쇄 가능한 문자 (숫자 포함)로 바꾸는 것도 가능합니다.
통제 수단
스톱워치는 일시 정지 상태로 시작 하고 사용자가 명시 적으로 시작할 때까지 ‘control’ 키 를 눌러이 상태를 유지 해야합니다 (아래 참조).
스톱워치가 카운팅하는 동안, 사용자가 누르면, 만약 ‘제어’ 키를 다시, 스톱워치한다 일시 까지 (현재 시간을 유지하는) ‘제어’ 누르면 키를 한 번 더 누를 .
‘제어’ 키는 단일 키 스트로크, 즉 일 수 s
, 또는 예를 들면 키의 조합을 Ctrl+Shift+X
하지만, 예를 들어, 순차적으로 다수의 키를 눌러, “원자”이어야 s
다음 Enter
이다 금지 .
스톱워치 를 일시 중지 하고 다시 시작 하려면 동일한 ‘control’ 키 (또는 조합)를 사용해야합니다 .
특정 ‘control’ 키를 사용해야합니다 . 즉 ‘any key’는 허용되지 않습니다.
또는 ‘control’의 키 누르기 대신 한 번 또는 두 번의 마우스 클릭을 사용할 수 있습니다.
규칙
- 이것은 code-golf 이며 바이트 단위로 가장 짧은 답변입니다.
- 표준 코드 골프 허점이 적용됩니다.
- 프로그램은 (이론적으로) 영원히 실행될 수 있어야합니다.
답변
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
사용 !=
모두 입력이 1 또는 0 인만큼 같은 논리 XOR을 eqivilant이다.
답변
파이썬 2, 167129 바이트
Maltysen의ctrl-c
예외 를 잡는 아이디어 를 사용하여 -36 바이트 * 대부분 크레딧을 제공하십시오!
-4 (INIT DLosc 덕분 바이트 n
및 b
보다는 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’입니다.
n
및 b
는 0 “오프셋”주고 시동시와 동일한 값으로 초기화된다;p
일시 중지 된 상태를 나타내는 0으로 초기화됩니다.
컨트롤 키를 누를 때마다의 값 p
이 전환됩니다. 활성 상태로 일시 중지 상태로 전환 할 때 b
이전 활성 상태 (들)로부터 어떠한 전류 오프셋을 유지하는 새로운 값으로 갱신된다b-n
.
활성 상태 n
에서을 호출하여 현재 시간으로 반복 업데이트됩니다 time.time()
.
차이 n
와 b
,t
(분수 부분을 포함) (초)의 갯수가 다음 인 액티브 상태 (S)의 경과시.
그런 다음 경과 한 t/60
시간이 표시되고 분과 초 각각에 모드 60이 표시됩니다 (t/60%60,t%60)
. 앞에 0으로 정수 부분의 문자열 형식을 사용하여 앞에 0이 붙습니다 '...%0.2d...'
. ,
첫 번째 항목에 선행 캐리지 리턴이 있는 튜플 (후행 )을 \r
인쇄하면 이전에 인쇄 된 텍스트를 덮어 씁니다.
답변
파이썬 – 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)")
답변
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 초 동안 잠자기 때문이지만 루프 본문은 실행하는 데 약간의 시간이 걸립니다. 실제로는 중요하지 않습니다.
답변
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 초에 일시 중지됩니다.
언 골프 및 댓글
' 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 초 이내에 숫자가 변경되는 것을 볼 수 있습니다.
답변
배치, 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 바이트의 비용으로 줄일 수 있습니다.
답변
순수 배쉬, 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
처리는 스톱워치를 일시 중지합니다.
set -m
작업 제어를 활성화 합니다. 일반적으로 스크립트에서 꺼져 있습니다.- 서브 쉘 프로세스가된다 백그라운드로 (
&
) .read -t 1
사용자의 입력을 1 초 동안 기다렸다가 실패합니다.until
루프 길이만큼 계속read
실패 유지.printf
올바르게 채워지고 형식화 된 시간을 출력 합니다.$[s=s>3598?0:s+1,s/60]
산술 확장은 먼저 업데이트 된 시간을 계산 하여 줄 바꿈 여부를 확인하고 초 카운터를 증가시킨s
다음 바닥 나누기를 반환합니다s/60
.$[s%60]
남은 초를 제공합니다.
- 외부 스크립트는
trap
핸들러 를TSTP
하고 신호가 Ctrl-Z생성합니다. 때 Ctrl-Z외부 스크립트가 실행되는 동안 누르면, 그것은 실행fg>/dev/null
및 전경에 서브 쉘 백을 넣어 . 서브 쉘 명령 인쇄>/dev/null
를 중지fg
할 때마다 필요합니다. - 스크립트는 초기를 인쇄
00:00
하고 보내는STOP
신호를 받는 자식 프로세스$!
과정을 일시 중지됩니다. read
스크립트를 계속 유지하면서 영원히 입력을 기다립니다.
경우 Ctrl-Z서브 쉘이 foregrounded 동안 누르면, 그것은 실행을 일시 정지하고 자동으로 대기 전경에 외부 스크립트를 반환합니다. 외부 스크립트가 포 그라운드 인 경우 트랩 핸들러는 서브 쉘의 실행을 재개하고 다시 카운트합니다.