파일 복사-Windows 스타일 옵션입니다. 귀하의 언어로는 불가능하지

이 도전은 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.



답변

Pyth- 70 68 바이트

K^T5J^T3W>KZ%." r3úBTê;¥
í".D/KJ60=J?<OT3O^T4J=-KJ.d1.

잠들지 않고 온라인으로 사용해보십시오 .


답변

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는 라인 간 화면 지우기를 지원하지 않습니다)

우리의 초기 설정 $fILE 크기를 우리의 초기 전송 $r에 식사 1gb10mb각각 S /. 그런 다음, 여전히 $file이 남아있는 한 반복됩니다.

루프 내에서 if선택은 숫자 09포함 하여 숫자를 선택하고 0, 1 또는 2 (시간의 30 %)이면 비율을 변경합니다. 이 사이의 임의의 정수를 선택합니다 1kb10mb곱의 그 다음 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 0TIO에서 사용 하므로 기다릴 필요가 없습니다. clearTIO에서는 작동하지 않습니다.


답변

자바 스크립트 (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명령을 사용하여 줄을 지 웁니다 .