Salin file - gaya Windows

40

Tantangan ini terinspirasi oleh xkcd :

masukkan deskripsi gambar di sini

Tantangan:

Anda akan mensimulasikan menyalin file besar (1 Gigabyte). Kecepatan transfer akan bervariasi antara 10 kB / detik hingga 100 MB / detik. Tugas Anda adalah menampilkan sisa waktu transfer file. Outputnya akan terlihat seperti:

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)

Angka nol di depan tidak perlu ditampilkan selama beberapa menit dan jam (opsional), tetapi harus ditunjukkan selama beberapa detik. Menunjukkan waktu yang tersisa hanya menggunakan detik tidak OK.

Transfer file:

  • Kecepatan transfer akan mulai dari 10 MB / detik.
  • Setiap detik, akan ada peluang 30% bahwa tingkat transfer akan berubah
  • Laju transfer baru harus dipilih secara acak (distribusi seragam) dalam kisaran [10 kB/s, 100 MB/s], dalam langkah 10 kB / s.

Catatan: Anda sebenarnya tidak perlu menyalin file.

Anda dapat memilih untuk menggunakan:, 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 Batau 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B.

Keluaran:

  • Anda mulai 01:40, bukan 01:39.
  • Anda menampilkan waktu setelah perubahan kecepatan transfer, tetapi sebelum apa pun ditransfer pada kecepatan itu
  • Detik harus ditampilkan sebagai bilangan bulat, bukan desimal. Ini opsional untuk mengumpulkan / menurunkan / terdekat.
  • Anda harus menghapus layar setiap detik, kecuali itu tidak mungkin dalam bahasa Anda.
  • Outputnya harus konstan: Time remaining: 00:00ketika transfer file selesai.

Contoh:

Saya telah mengumpulkan semua detik desimal. Asumsikan garis di bawah ini ditunjukkan dengan 1 detik di antaranya, dan layar dihapus di antara masing-masing:

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.
Stewie Griffin
sumber
1
Anda harus meletakkan teks tip alat XKCD di bawah gambar. Selamatkan orang saat harus mencarinya sendiri.
mbomb007
6
@ mbomb007, arahkan kursor :)
Stewie Griffin
Haruskah itu, "Anda mulai dari 1:40(atau 1:42) tidak 1:39(atau 1:41)"?
Jonathan Allan
Juga jika kita menggunakan 1024versi, ukuran langkah apa yang harus kita gunakan?
Jonathan Allan
Jika jam tersisa nol, bisakah kita meninggalkan output sebagai 00:00:10contoh?
AdmBorkBork

Jawaban:

9

Pyth - 70 68 byte

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

Cobalah online tanpa tidur .

Maltysen
sumber
@DigitalTrauma maaf, menggunakan jawaban Luis sebagai panduan ._.
Maltysen
@DigitalTrauma diperbaiki.
Maltysen
6
Lol. Ketika porting dari (golf) bahasa A ke (golf) bahasa B lebih mudah daripada membaca spec ;-)
Digital Trauma
@Maltysen Maaf tentang itu! :-)
Luis Mendo
2
Bisakah Anda memberikan penjelasan tentang apa yang sedang terjadi di sini?
Pasang kembali Monica
8

PowerShell , 190 215 187 byte

($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"

Cobalah online! (TIO tidak mendukung layar kliring antar baris)

Setel $fukuran ile awal kami dan transfer awal kami masing-masing $rke 1gbdan 10mb/ s. Kemudian, selama kita masih memiliki $file yang tersisa, kita mengulang.

Di dalam loop, ifmemilih angka dari 0menjadi 9inklusif, dan jika itu 0, 1, atau 2 (yaitu, 30% dari waktu), kami mengubah tingkat. Ini memilih bilangan bulat acak di antara 1kbdan 10mbkemudian dikalikan dengan 10untuk mendapatkan jumlah langkah kami.

Kami kemudian memanfaatkan FromSeconds metode statis dari TimeSpanperpustakaan .NET untuk membangun sisa waktu. Format output dari panggilan itu sama persis dengan persyaratan tantangan, jadi tidak perlu untuk pemformatan tambahan.

(Menyimpan banyak berkat @ConnorLSW)

AdmBorkBork
sumber
1
@StewieGriffin TIO memiliki output caching. Pilih "nonaktifkan cache output" di laci Pengaturan, dan hasilnya berbeda.
TheBikingViking
Mungkin saya kehilangan sesuatu tetapi -foperator tampaknya tidak melakukan apa-apa. Dengan mengambil itu dan menggunakan forloop alih-alih while, dan kemudian mengubah kedua instance get-datemenjadi date, saya bisa mencukur 22 byte. Cobalah online!
briantist
@briantist memerlukan TIO Get-Datekarena jika tidak, ia menggunakan dateperintah Linux , yang berbeda. Anda dapat menjatuhkannya di Windows karena PowerShell membungkus dateperintah Windows . Tapi, terima kasih untuk forkonstruksi loop!
AdmBorkBork
@ AdmBorkBork ya saya perhatikan itu, tetapi dalam lingkungan Windows saham itu akan bekerja. Saya bertanya-tanya apakah dapat diterima untuk hanya memasukkan nal date get-dateheader di TIO?
briantist
@ AdmBorkBork dan di windows itu tidak membungkus perintah tanggal windows, itu hanya mengabaikannya karena itu bukan .exe di windows, jadi jatuh kembali ke perilaku yang sama seperti random(coba perintah dengan get-prepended jika semuanya gagal).
briantist
5

MATL , 78 byte

Terima kasih kepada @Maltysen dan @DigitalTrauma untuk koreksi.

1e5 1e3`XK10&XxyXIy/t0>*12L/'MM:SS'XO'Time remaining: 'whD-r.3<?1e4Yr}K]I0>]xx

Cobalah di MATL Online! (Anda mungkin perlu menekan "Jalankan" beberapa kali jika awalnya tidak bekerja).

Penerjemah online akan habis setelah 30 detik. Anda mungkin ingin mengubah 10(jeda waktu dalam sepersepuluh detik) menjadi sesuatu yang lebih kecil seperti3 untuk meningkatkan kecepatan tampilan

Penjelasan

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
Luis Mendo
sumber
Saya tidak mengerti MATL, tetapi bagi saya sepertinya Anda selalu mendapatkan nilai baru, bukan hanya 30% dari waktu dari penjelasan Anda.
Maltysen
@Maltysen Dikoreksi sekarang. Terimakasih atas peringatannya!
Luis Mendo
@DigitalTrauma Dikoreksi sekarang
Luis Mendo
4

Bash + utilitas umum, 117

Implementasi langsung. Beberapa byte disimpan dengan membagi dengan 10.000:

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
}

Cobalah online . Menggunakan sleep 0pada TIO sehingga Anda tidak perlu menunggu. cleartidak bekerja di TIO.

Trauma Digital
sumber
3

JavaScript (ES6), 162 byte

Memperlihatkan menit apa adanya dengan detik empuk (lantai)

Misalnya, 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)

George Reith
sumber
Saya pikir Anda lupa menyingkat console.clearmenjadi c.clear;-) Itu ide yang bagus, BTW
ETHproduksi
@ EHProduksi Ooooops! Terima kasih :)
George Reith
Anda bisa mendapatkan ini hingga 154 byte dengan menambahkan HTML - <input id=o>- dan membuat beberapa penyesuaian lainnya: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 bytes)

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

Cukup mudah, saya pikir. Menghapus garis menggunakan urutan dan Kperintah escape ANSI .

Jonas Schäfer
sumber
1
Lewati spasi di baris pertama Anda dengan from random import*. d//rlebih pendek dari int(d/r). Juga, sebaiknya ikuti r=1e7;d=1e9sejak awal.
Nilai Tinta
@ ValueInk Benar, tidak memikirkan 1eX untuk r dan d karena saya ingin mereka menjadi bilangan bulat; ketika saya memperpendek garis randint, saya lupa tentang itu ... :)
Jonas Schäfer
1

Batch, 193 byte

@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

Catatan: Bias sedikit terhadap tingkat 27,68 MB / s atau kurang.

Neil
sumber
1

C 184 171 155 byte

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;}}

Saya harap ini memenuhi syarat.

Versi tidak disatukan:

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;          



   }

}

Penjelasan: Dalam versi golfed isesuai dengan sizeversi ungolfed dan radalah ratedalam versi ungolfed. jmenyimpan waktu yang tersisa dalam hitungan detik.

  • Saya memiliki 10 ^ 9 byte untuk disalin. Saya mulai menyalin dengan kecepatan 10 Megabytes / detik,
  • Jika probabilitas kurang dari 30%, ubah kurs (dari 10 kilobyte menjadi 100 Megabita per detik)

@ ValueInk Terima kasih telah menyimpan 13 byte.

@ nmjcman101 Terima kasih telah menyimpan 16 byte.

Abel Tom
sumber
Ini sepertinya tidak benar-benar melakukan apa yang dikatakan tantangan. Bisakah Anda menjelaskan cara kerjanya?
Value Ink
Itu hanya mensimulasikan output waktu, saya belum tahu bagaimana melakukan bagian transfer data. Kira saya akan menahan ini sampai saat itu.
Abel Tom
Anda tidak mengubah nilai setelah 3 iterasi. Ini memiliki peluang 30% untuk berubah. Jadi Anda mungkin ingin melakukan sesuatu yang mirip dengan yang berikut: if(rand()%10<3)r=(rand()%10000+1)*1e4;(Terutama karena tingkat minimum adalah 10 kB / dtk, bukan 1MB / dt seperti yang dikatakan oleh solusi Anda, dan peluang laju harus distribusi yang agak seragam.)
Value Ink
@ ValueInk Terima kasih banyak. :) Diperbarui. Dapatkan pekerjaan selesai! Saya tidak tahu bagaimana tepatnya mensimulasikan bagian probabilitas 30%. Jauh lebih jelas sekarang.
Abel Tom
Anda dapat bermain golf j/3600,(j/60)%60,j%60(21) dengan s=60;dan j/s/s,j/s%s,j%s(20)
Davide