이 도전은 xkcd에서 영감을 얻었습니다 .
도전:
큰 파일 (1 기가 바이트) 복사를 시뮬레이션합니다. 전송 속도는 10kB / 초에서 100MB / 초 사이에서 다양합니다. 당신의 작업은 파일 전송의 남은 시간을 출력하는 것입니다. 출력은 다음과 같아야합니다.
Time remaining: 03:12 (meaning it's 3 minutes and 12 seconds left)
Time remaining: 123:12 (meaning it's 2 hours, 3 minutes and 12 seconds left)
Time remaining: 02:03:12 (optional output, meaning the same as above)
분과 시간 동안 선행 0을 표시 할 필요는 없지만 (선택 사항) 초 동안 표시해야합니다. 초만 사용하여 남은 시간을 표시하는 것은 좋지 않습니다.
파일 전송 :
- 전송 속도는 10MB / 초에서 시작됩니다.
- 1 초마다 전송률이 변경 될 확률은 30 %입니다.
- 새로운 전송 속도는
[10 kB/s, 100 MB/s]
10 kB / s의 단계 로 랜덤하게 (균일 분포) 선택해야합니다 .
참고 : 실제로 파일을 복사 할 필요는 없습니다.
1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 B
또는 을 사용하도록 선택할 수 있습니다 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B
.
산출:
- 에서 시작
01:40
하지 않습니다01:39
. - 전송 속도가 변경된 후 해당 속도로 전송되기 전에 시간을 표시합니다.
- 초는 소수점이 아닌 정수로 표시되어야합니다. 반올림 / 내림 / 가까운 옵션입니다.
- 귀하의 언어로는 불가능하지 않은 한, 매 초마다 화면을 비워야합니다.
Time remaining: 00:00
파일 전송이 끝나면 출력이 일정해야합니다 .
예:
십진수를 모두 반올림했습니다. 아래 줄이 1 초 사이에 표시되고 각 줄 사이에 화면이 지워 졌다고 가정합니다.
Time remaining: 01:40 (Transfer rate: 10 MB/s)
Time remaining: 01:39 1 GB - 10 MB
Time remaining: 01:38 1 GB - 2*10 MB
Time remaining: 01:37 1 GB - 3*10 MB
Time remaining: 01:28:54 1 GB - 4*10 MB (TR: 180 kB/s)
Time remaining: 01:28:53 1 GB - 4*10 MB - 180 kB
Time remaining: 01:28:52 1 GB - 4*10 MB - 2*180 kB
Time remaining: 00:13 1 GB - 4*10 MB - 3*180 kB (TR: 75 MB/s)
Time remaining: 00:12 1 GB - 4*10 MB - 3*180 kB - 75 MB
Time remaining: 00:11 1 GB - 4*10 MB - 3*180 kB - 2*75 MB
Time remaining: 00:10 1 GB - 4*10 MB - 3*180 kB - 3*75 MB
Time remaining: 00:09 1 GB - 4*10 MB - 3*180 kB - 4*75 MB
Time remaining: 00:08 1 GB - 4*10 MB - 3*180 kB - 5*75 MB
Time remaining: 14:09:06 1 GB - 4*10 MB - 3*180 kB - 6*75 MB (TR: 10 kB/s)
Time remaining: 14:09:05 1 GB - 4*10 MB - 3*180 kB - 6*75 MB - 10 kB
Time remaining: 00:06 1 GB - 4*10 MB - 3*180 kB - 6*75 MB - 20 kB (TR: 88.110 MB/s)
Time remaining: 00:05
Time remaining: 00:04
Time remaining: 00:03
Time remaining: 00:02
Time remaining: 00:01
Time remaining: 00:00 <- Transfer is finished. Display this.
답변
답변
PowerShell을 , 190 (215) 187 바이트
($t="Time remaining: ")+"00:01:42";for($f,$r=1gb,10mb;$f-gt0;$f-=$r){if((Random 10)-lt3){$r=(Random -mi 1kb -ma (10mb+1))*10}$t+[Timespan]::FromSeconds([int]($f/$r));sleep 1}$t+"00:00:00"
온라인으로 사용해보십시오! (TIO는 라인 간 화면 지우기를 지원하지 않습니다)
우리의 초기 설정 $f
ILE 크기를 우리의 초기 전송 $r
에 식사 1gb
와 10mb
각각 S /. 그런 다음, 여전히 $f
ile이 남아있는 한 반복됩니다.
루프 내에서 if
선택은 숫자 0
를 9
포함 하여 숫자를 선택하고 0, 1 또는 2 (시간의 30 %)이면 비율을 변경합니다. 이 사이의 임의의 정수를 선택합니다 1kb
및 10mb
곱의 그 다음 10
우리의 단계 수를 얻을 수 있습니다.
우리는 그 활용 FromSeconds
정적 방법 으로부터 TimeSpan
남은 시간을 구성 .NET 라이브러리. 해당 통화의 출력 형식은 챌린지 요구 사항과 정확히 일치하므로 추가 형식이 필요하지 않습니다.
(@ConnorLSW 덕분에 무리를 구했습니다)
답변
MATL , 78 바이트
수정 을 위해 @Maltysen 과 @DigitalTrauma 에게 감사드립니다 .
1e5 1e3`XK10&XxyXIy/t0>*12L/'MM:SS'XO'Time remaining: 'whD-r.3<?1e4Yr}K]I0>]xx
MATL Online 에서 사용해보십시오 ! 처음에 작동하지 않으면 “실행”을 여러 번 눌러야 할 수도 있습니다.
온라인 통역사가 30 초 후에 시간 초과됩니다. 당신은 변화 할 수 있습니다 10
작은 무언가 (10 분의 1 초 단위 일시 정지 시간을) 와 같은3
디스플레이의 속도를 높이기 위해
설명
1e5 % Push 1e5: file size in 10-kB units
1e3 % Push 1e3: initial rate in 10-kB/s units
` % Do...while
XK % Copy current rate into clipboard K (doesn't consume it)
10&Xx % Wait 1 second and clear screen
y % Duplicate current file size onto the top of the stack
XI % Copy it to clipboard I (doesn't consume it)
y % Duplicate current rate onto the top of the stack
/ % Divide. This gives the estimated remaining time in seconds
% It may be negative in the last iteration, because the
% "remaining" file size may have become negative
t0>* % If negative, convert to 0
12L/ % Push 86400 and divide, to convert from seconds to days
'MM:SS'XO % Format as a MM:SS string, rounding down
'Time remaining: ' % Push this string
wh % Swap, concatenate
D % Display
- % Subtract. This gives the new remaining file size
r % Push random number uniformly distributed in (0,1)
.3< % Is it less than 0.3?
? % If so
1e4Yr % Random integer between 1 and 1e4. This is the new rate
% in 10-kB/s units
} % Else
K % Push rate that was copied into clipboard K
] % End
I % Push previous remaining file size from clipboard I
0> % Is it positive?
] % End. If top of the stack is true: next iteration
xx % Delete the two numbers that are on the stack
답변
루비, 116110 바이트
repl.it가 \r
개행 문자로 읽히고 사용할 수 없으므로 $><<
5 바이트로 대체되는 것을 제외하고는 온라인으로 시도하십시오 print
.
JonasWielicki에게 \r
라인을 재설정하는 데 사용하는 초기 아이디어를 외치십시오 .
f=1e5;r=1e3;(k=f/r=rand<0.3?1+rand(1e4):r;$><<"\rTime remaining: %02d:%02d"%[k/60,k%60];f-=r;sleep 1)while f>0
이 버전은 Windows에서 테스트되지 않았지만 Unix에서 작동합니다.
답변
배쉬 + 공용 유틸리티, 117
간단한 구현. 10000으로 나누어 몇 바이트를 절약했습니다.
for((b=10**5,r=1000;b>0;r=RANDOM%10<3?RANDOM%10000+1:r,b-=r));{
clear
date -ud@$[b/r] "+Time remaining: %T"
sleep 1
}
온라인으로 사용해보십시오 . sleep 0
TIO에서 사용 하므로 기다릴 필요가 없습니다. clear
TIO에서는 작동하지 않습니다.
답변
자바 스크립트 (ES6), 162 바이트
채워진 초와 함께 분을 표시합니다 (바닥)
예 : 123:45
t=1e5
s=1e3
setInterval(c=>c.log(`Time remaining: ${c.clear(d=t/s),d/60|0}:`+`0${t-=s>t?t:s,r=Math.random,s=r()<0.3?1+r()*1e4|0:s,d%60|0}`.slice(-2)),1e3,console)
답변
3.6 파이썬 ( 212 203 바이트)
from random import*
import time,datetime
r=1e7
d=1e9
while 1:
print(f"\x1b[KTime remaining: {datetime.timedelta(seconds=d//r)}",end="\r");d=max(0,d-r);time.sleep(1)
if random()>.7:r=randint(1,1e4)*1e4
매우 간단하다고 생각합니다. ANSI 이스케이프 시퀀스 및 K
명령을 사용하여 줄을 지 웁니다 .