태그 보관물: interactive

interactive

스톱워치 구현 하여 형식 으로 표시해야합니다 (화면의 전체

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

중대한

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

디스플레이

경과 된 시간 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’의 키 누르기 대신 한 번 또는 두 번의 마우스 클릭을 사용할 수 있습니다.


규칙

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


답변

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이다.


답변

파이썬 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인쇄하면 이전에 인쇄 된 텍스트를 덮어 씁니다.


답변

파이썬 – 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처리는 스톱워치를 일시 중지합니다.

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