ファイルをコピーする-Windowsスタイル


40

この挑戦はxkcdに触発されました:

ここに画像の説明を入力してください

チャレンジ:

大きなファイル(1ギガバイト)のコピーをシミュレートします。転送速度は、10 kB /秒から100 MB /秒の間で変化します。あなたの仕事は、ファイル転送の残り時間を出力することです。出力は次のようになります。

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)

先行ゼロは、分と時間(オプション)で表示する必要はありませんが、秒で表示する必要があります。秒のみを使用して残り時間を表示することはできません。

ファイル転送:

  • 転送速度は10 MB /秒から始まります。
  • 毎秒、転送レートが変更される可能性が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.

1
XKCDツールチップテキストを画像の下に配置する必要があります。自分で調べなければならない時間を節約できます。
mbomb007

6
@ mbomb007、画像にカーソルを合わせてください:)
ウィーグリフィン

それは「あなたは1:40(または1:42)ではなく1:39(または1:41)から始める」べきでしょうか?
ジョナサンアラン

また、1024バージョンを使用している場合、使用するステップサイズはどのくらいですか?
ジョナサンアラン

残り時間がゼロの場合、00:00:10たとえば出力を残すことができますか?
AdmBorkBork

回答:


9

Pyth- 70 68バイト

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

眠らずにオンラインで試してください


@DigitalTrauma申し訳ありませんが、ルイスの答えをガイドとして使用していました。
マルティセン

@DigitalTraumaが修正されました。
マルティセン

6
笑。(ゴルフ)言語Aから(ゴルフ)言語Bへの移植は、仕様を読むよりも簡単です;-)
デジタルトラウマ

@Maltysenそれについてすみません!:-)
ルイスメンドー

2
ここで一体何が起こっているのか説明してもらえますか?
モニカの復活

8

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に食べた1gbし、10mbそれぞれ、/ S。その後、まだ$fファイルが残っている限り、ループします。

ループ内で、はifから0までの数値を選択し、90、1、または2(つまり、時間の30%)の場合、レートを変更します。この間のピックランダムな整数1kb10mbを掛けていますそして、10私たちのステップ数を取得します。

次に、.NETライブラリのFromSeconds 静的メソッドを活用して、TimeSpan残り時間を構築します。その呼び出しの出力形式はチャレンジ要件に完全に一致するため、追加の形式は必要ありません。

(@ConnorLSWに感謝します)


1
@StewieGriffin TIOには出力キャッシュがあります。[設定]ドロワーで[出力キャッシュを無効にする]を選択すると、異なる結果が得られます。
TheBikingViking

たぶん私は何かを見逃していますが、-fオペレータは何もしているようには見えません。それを取り出し、のfor代わりにループを使用し、のwhile両方のインスタンスをget-dateに変更することで、date22バイトを削ることができました。オンラインでお試しください!
briantist

@briantist TIOが必要なのはGet-Date、それ以外の場合はLinux dateコマンドを使用するためです。PowerShellはWindows dateコマンドをラップするため、Windowsにドロップできます。しかし、forループ構造に感謝します!
AdmBorkBork

@AdmBorkBorkええ、私はそれに気づきましたが、標準のWindows環境では動作します。nal date get-dateTIOのヘッダーに入れるだけでいいのかしら?
briantist

@AdmBorkBorkおよびWindowsでは、windowsのdateコマンドはラップされません。windowsの.exeではないため、無視されます。したがって、randomget-他のすべてが失敗した場合は、先頭にコマンドを追加して試してください)。
briantist

5

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

私はMATLを理解していませんが、あなたの説明からの時間の30%だけではなく、常に新しいレートを取得しているように見えます。
マルティセン

@Maltysenが修正されました。ヘッドアップをありがとう!
ルイスメンドー

@DigitalTrauma修正済み
ルイスメンドー

5

ルビー、116 110バイト

repl.it \rが改行として読み込まれ、使用できない$><<ため、同等の5バイトに置き換えられることを除いて、オンラインで試してくださいprint

回線を\rリセットするために使用する最初のアイデアについて、JonasWielickiに大声で叫んでください。

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では動作します。


4

Bash +一般的なユーティリティ、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では機能しません。


3

JavaScript(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)


私はあなたが短縮するのを忘れて考えるconsole.clearc.clear;-)素晴らしいアイデアだ。つまり、ところで
ETHproductions

@ETHproductionsおっと!ありがとう:)
ジョージリース

HTMLを追加することで、これを154バイトに減らすことができます<input id=o>--そして、他のいくつかの調整を行います。t=1e5;i=s=1e3;setInterval(_=>o.value=`Time remaining: ${(d=t/s)/60|0}:`+`0${t-=s>t?t:s,r=Math.random(),s=r<.3?1+r*1e4|0:s,d%60|0}`.slice(-2),i)
Shaggy

2

Python 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コマンドを使用して行を消去します。


1
で最初の行のスペースをスキップしますfrom random import*d//rはより短いですint(d/r)。また、r=1e7;d=1e9最初からうまくいくかもしれません。
バリューインク

@ValueInkそうですね、rとdに1eXを考えていませんでした。整数にしたかったからです。randint行を短くしたとき、私はそれを忘れていました... :)
ジョナスシェーファー

1

バッチ、193バイト

@set/ap=10000,s=p*10,r=p/10
:l
@set/at=s/r,m=t/60,n=t%%60+100,s-=r
@cls
@echo Time remaining: %m%:%n:~1%
@timeout/t>nul 1
@if %random:~-1% lss 3 set/ar=%random%%%p+1
@if %t% gtr 0 goto l

注:27.68 MB / s以下の速度へのわずかなバイアス。


1

C 184 171 155バイト

f(){i,j=0,r=1e7;for(i=1e9;i>0;i-=r){j=i/r;printf("Time remaining: %02d:%02d:%02d\r",j/3600,(j/60)%60,j%60);sleep(1);if(rand()%10<3)r=(rand()%10000)*1e4;}}

これが適切であることを願っています。

ゴルフされていないバージョン:

void f()
{
    int j=0;
    float rate=1e7; 
    for(int size=1e9;i>0; size-=rate)
    {     
       j=size/rate;      
       printf("Time remaining: %02d:%02d:%02d\r",j/3600,(j/60)%60,j%60);
       sleep(1);

       if(rand()%10<3)
          rate=(rand()%10000)*1e4;          



   }

}

説明:ゴルフバージョンでiは、ゴルフゴルフバージョンに対応し、ゴルフゴルフsizeバージョンでrrateありません。j残り時間を秒単位で保存します。

  • コピーする10 ^ 9バイトがあります。10メガバイト/秒の速度でコピーを開始しますが、
  • 確率が30%未満の場合、レートを変更します(毎秒10キロバイトから100メガバイトに変更)

@ValueInk 13バイトを保存していただきありがとうございます。

@ nmjcman101 16バイトを保存していただきありがとうございます。


これは実際に課題が言っていることを行うようには見えません。仕組みを説明できますか?
バリューインク

それは時間出力をシミュレートするだけで、データ転送の部分をどのように行うかを理解していません。それまではこれを保留にします。
アベルトム

3回繰り返してもレートは変更しません。変更される可能性は30%です。:おそらく次のような何かをしたいあなたはとてもif(rand()%10<3)r=(rand()%10000+1)*1e4;(。あなたのソリューションが言っている、とレートチャンスはやや均一に分布する必要がありますように最小レートは、10 KB /秒で、特に以来、1メガバイト/秒ではない)
バリューインク

@ValueInkどうもありがとう。:) 更新しました。作業を完了します!30%の確率部分を正確にシミュレートする方法は知りませんでした。とても明確になりました。
アベルトム・

ゴルフができますj/3600,(j/60)%60,j%60(21)s=60;j/s/s,j/s%s,j%s(20)
デビッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.