Tantangan ini terinspirasi oleh xkcd :
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 B
atau 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B
.
Keluaran:
- Anda mulai
01:40
, bukan01: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:00
ketika 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.
1:40
(atau1:42
) tidak1:39
(atau1:41
)"?1024
versi, ukuran langkah apa yang harus kita gunakan?00:00:10
contoh?Jawaban:
Pyth -
7068 byteCobalah online tanpa tidur .
sumber
PowerShell ,
190215187 byteCobalah online! (TIO tidak mendukung layar kliring antar baris)
Setel
$f
ukuran ile awal kami dan transfer awal kami masing-masing$r
ke1gb
dan10mb
/ s. Kemudian, selama kita masih memiliki$f
ile yang tersisa, kita mengulang.Di dalam loop,
if
memilih angka dari0
menjadi9
inklusif, dan jika itu 0, 1, atau 2 (yaitu, 30% dari waktu), kami mengubah tingkat. Ini memilih bilangan bulat acak di antara1kb
dan10mb
kemudian dikalikan dengan10
untuk mendapatkan jumlah langkah kami.Kami kemudian memanfaatkan
FromSeconds
metode statis dariTimeSpan
perpustakaan .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)
sumber
-f
operator tampaknya tidak melakukan apa-apa. Dengan mengambil itu dan menggunakanfor
loop alih-alihwhile
, dan kemudian mengubah kedua instanceget-date
menjadidate
, saya bisa mencukur 22 byte. Cobalah online!Get-Date
karena jika tidak, ia menggunakandate
perintah Linux , yang berbeda. Anda dapat menjatuhkannya di Windows karena PowerShell membungkusdate
perintah Windows . Tapi, terima kasih untukfor
konstruksi loop!nal date get-date
header di TIO?random
(coba perintah denganget-
prepended jika semuanya gagal).MATL , 78 byte
Terima kasih kepada @Maltysen dan @DigitalTrauma untuk koreksi.
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 tampilanPenjelasan
sumber
Ruby,
116110 byteCobalah online, kecuali repl.it dibaca
\r
sebagai baris baru dan juga tidak dapat digunakan$><<
sehingga diganti dengan yang setara 5-byteprint
,.Shoutout to JonasWielicki untuk ide awal menggunakan
\r
untuk mengatur ulang baris.Versi ini tidak diuji pada Windows, tetapi berfungsi di Unix.
sumber
Bash + utilitas umum, 117
Implementasi langsung. Beberapa byte disimpan dengan membagi dengan 10.000:
Cobalah online . Menggunakan
sleep 0
pada TIO sehingga Anda tidak perlu menunggu.clear
tidak bekerja di TIO.sumber
JavaScript (ES6), 162 byte
Memperlihatkan menit apa adanya dengan detik empuk (lantai)
Misalnya,
123:45
sumber
console.clear
menjadic.clear
;-) Itu ide yang bagus, BTW<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)
Python 3.6 (
212203 bytes)Cukup mudah, saya pikir. Menghapus garis menggunakan urutan dan
K
perintah escape ANSI .sumber
from random import*
.d//r
lebih pendek dariint(d/r)
. Juga, sebaiknya ikutir=1e7;d=1e9
sejak awal.Batch, 193 byte
Catatan: Bias sedikit terhadap tingkat 27,68 MB / s atau kurang.
sumber
C
184171155 byteSaya harap ini memenuhi syarat.
Versi tidak disatukan:
Penjelasan: Dalam versi golfed
i
sesuai dengansize
versi ungolfed danr
adalahrate
dalam versi ungolfed.j
menyimpan waktu yang tersisa dalam hitungan detik.@ ValueInk Terima kasih telah menyimpan 13 byte.
@ nmjcman101 Terima kasih telah menyimpan 16 byte.
sumber
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.)j/3600,(j/60)%60,j%60
(21) dengans=60;
danj/s/s,j/s%s,j%s
(20)