Sao chép tệp - Kiểu Windows


40

Thử thách này được lấy cảm hứng từ xkcd :

nhập mô tả hình ảnh ở đây

Thử thách:

Bạn sẽ mô phỏng việc sao chép một tệp lớn (1 Gigabyte). Tốc độ truyền sẽ thay đổi trong khoảng từ 10 kB / giây đến 100 MB / giây. Nhiệm vụ của bạn là xuất thời gian còn lại của quá trình truyền tệp. Đầu ra sẽ giống như:

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)

Các số 0 đứng đầu không cần phải được hiển thị trong vài phút và giờ (tùy chọn), nhưng phải được hiển thị trong vài giây. Hiển thị thời gian còn lại chỉ sử dụng giây là không ổn.

Việc chuyển tập tin:

  • Tốc độ truyền sẽ bắt đầu ở mức 10 MB / giây.
  • Mỗi giây, sẽ có 30% cơ hội tốc độ chuyển sẽ thay đổi
  • Tốc độ truyền mới phải được chọn ngẫu nhiên (phân phối đồng đều) trong phạm vi [10 kB/s, 100 MB/s], theo các bước 10 kB / s.

Lưu ý: Bạn không cần phải sao chép một tập tin.

Bạn có thể chọn sử dụng : 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 B, hoặc 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B.

Đầu ra:

  • Bạn bắt đầu lúc 01:40, không 01:39.
  • Bạn hiển thị thời gian sau khi tốc độ truyền thay đổi, nhưng trước khi mọi thứ được chuyển ở tốc độ đó
  • Các giây nên được hiển thị dưới dạng số nguyên, không phải số thập phân. Đó là tùy chọn để làm tròn lên / xuống / gần nhất.
  • Bạn nên xóa màn hình mỗi giây, trừ khi điều đó là không thể trong ngôn ngữ của bạn.
  • Đầu ra phải không đổi: Time remaining: 00:00khi quá trình truyền tệp kết thúc.

Thí dụ:

Tôi đã làm tròn tất cả các giây thập phân. Giả sử các dòng bên dưới được hiển thị với 1 giây ở giữa và màn hình sẽ bị xóa giữa mỗi dòng:

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
Bạn nên đặt văn bản mẹo công cụ XKCD bên dưới hình ảnh. Tiết kiệm cho mọi người thời gian phải tự tìm kiếm nó.
mbomb007

6
@ mbomb007, di chuột vào hình ảnh :)
Stewie Griffin

Có nên là "bạn bắt đầu tại 1:40(hoặc 1:42) không 1:39(hoặc 1:41)"?
Jonathan Allan

Ngoài ra nếu chúng ta đang sử dụng 1024phiên bản, kích thước bước chúng ta nên sử dụng là gì?
Jonathan Allan

Nếu số giờ còn lại bằng không, chúng ta có thể để đầu ra 00:00:10chẳng hạn không?
admBorkBork

Câu trả lời:


9

Pyth - 70 68 byte

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

Hãy thử trực tuyến mà không ngủ .


@DigitalTrauma xin lỗi, đã sử dụng câu trả lời của Luis làm hướng dẫn ._.
Maltysen

@DigitalTrauma đã sửa.
Maltysen

6
Lol. Khi chuyển từ ngôn ngữ (chơi gôn) ngôn ngữ A sang (chơi gôn) ngôn ngữ B dễ dàng hơn đọc thông
số kỹ thuật

@Maltysen Xin lỗi về điều đó! :-)
Luis Mendo

2
Bạn có thể đưa ra một lời giải thích về những gì quái đang xảy ra ở đây?
Tái lập lại

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"

Hãy thử trực tuyến! (TIO không hỗ trợ xóa màn hình giữa các dòng)

Đặt $fkích thước ile ban đầu của chúng tôi và lần chuyển đầu tiên của chúng tôi $rđã ăn 1gb10mb/ s, tương ứng. Sau đó, miễn là chúng tôi vẫn còn $file, chúng tôi lặp lại.

Bên trong vòng lặp, ifchọn một số từ 0để 9bao gồm, và nếu nó là 0, 1, hoặc 2 (ví dụ, 30% thời gian), chúng ta thay đổi tốc độ. Điều này chọn một số nguyên ngẫu nhiên giữa 1kb10mbsau đó nhân 10với số đếm bước của chúng tôi.

Sau đó, chúng tôi tận dụng FromSeconds phương thức tĩnh từ TimeSpanthư viện .NET để xây dựng thời gian còn lại. Định dạng đầu ra của cuộc gọi đó hoàn toàn khớp với các yêu cầu thách thức, do đó không cần định dạng bổ sung.

(Đã lưu một bó nhờ @ConnorLSW)


1
@StewieGriffin TIO có bộ nhớ đệm đầu ra. Chọn "tắt bộ đệm đầu ra" trong ngăn Cài đặt và nó cho kết quả khác nhau.
TheBikingViking 2/2/2017

Có thể tôi đang thiếu một cái gì đó nhưng -fnhà điều hành dường như không làm gì cả. Bằng cách lấy ra và sử dụng forvòng lặp thay vì while, và sau đó thay đổi cả hai trường hợp get-datethành date, tôi đã có thể loại bỏ 22 byte. Hãy thử trực tuyến!
briantist

@briantist TIO yêu cầu Get-Datevì nếu không, nó sử dụng datelệnh Linux , khác. Bạn có thể thả nó trên Windows vì PowerShell kết thúc datelệnh Windows . Nhưng, cảm ơn cho việc forxây dựng vòng lặp!
admBorkBork

@AdmBorkBork yeah Tôi nhận thấy điều đó, nhưng trong môi trường Windows có sẵn, nó sẽ hoạt động. Tôi tự hỏi liệu có thể chấp nhận để đặt nal date get-datetiêu đề trong TIO không?
nghĩa tự do

@AdmBorkBork và trên các cửa sổ, nó không bao gồm lệnh ngày của windows, nó chỉ bỏ qua nó vì nó không phải là .exe trên windows, vì vậy nó rơi trở lại hoạt động tương tự như random(thử lệnh với lệnh được chuẩn bị get-trước nếu thất bại).
briantist

5

MATL , 78 byte

Cảm ơn @Maltysen@DigitalTrauma đã sửa chữa.

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

Hãy thử nó tại MATL Online! (bạn có thể cần nhấn "Chạy" nhiều lần nếu nó không hoạt động ban đầu).

Thông dịch viên trực tuyến hết thời gian sau 30 giây. Bạn có thể muốn thay đổi 10(tạm dừng thời gian trong phần mười giây) thành một cái gì đó nhỏ hơn, chẳng hạn như3 để tăng tốc độ hiển thị

Giải trình

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

Tôi không hiểu MATL, nhưng đối với tôi như thể bạn luôn nhận được một tỷ lệ mới thay vì chỉ 30% thời gian từ lời giải thích của bạn.
Maltysen

@Maltysen Sửa ngay. Cảm ơn cho những người đứng đầu lên!
Luis Mendo

@DigitalTrauma Đã sửa ngay
Luis Mendo

5

Ruby, 116 110 byte

Hãy thử trực tuyến, ngoại trừ repl.it đọc \rdưới dạng dòng mới và cũng không thể sử dụng $><<để nó được thay thế bằng tương đương 5 byte của nó print.

Gửi lời đến JonasWielicki cho ý tưởng ban đầu về việc sử dụng \rđể thiết lập lại dòng.

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

Phiên bản này chưa được kiểm tra trên Windows, nhưng hoạt động trên Unix.


4

Bash + dụng cụ chung, 117

Thực hiện đơn giản. Một vài byte được lưu bằng cách chia cho 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
}

Hãy thử trực tuyến . Sử dụng sleep 0trên TIO để bạn không phải chờ đợi. clearkhông hoạt động trên TIO.


3

JavaScript (ES6), 162 byte

Hiển thị phút như với số giây được đệm (thả nổi)

Ví dụ, 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)


Tôi nghĩ rằng bạn đã quên rút ngắn console.clearlại c.clear;-) Đó là một ý tưởng tuyệt vời, BTW
Sản xuất ETH

@ETHproductions Ooooops! Cảm ơn :)
George Reith

Bạn có thể giảm xuống còn 154 byte bằng cách thêm HTML - <input id=o>- và thực hiện một vài điều chỉnh khác: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 byte)

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

Khá đơn giản, tôi nghĩ vậy. Xóa dòng bằng Klệnh và lệnh thoát ANSI .


1
Bỏ qua một khoảng trống trong dòng đầu tiên của bạn với from random import*. d//rngắn hơn int(d/r). Ngoài ra, cũng có thể đi với r=1e7;d=1e9từ đầu.
Mực giá trị

@ValueInk Phải, tôi đã không nghĩ về 1eX cho r và d vì tôi muốn chúng là số nguyên; Khi tôi rút ngắn dòng randint, tôi đã quên mất điều đó ... :)
Jonas Schäfer

1

Mẻ, 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

Lưu ý: Độ lệch nhẹ đối với tốc độ 27,68 MB / s trở xuống.


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

Tôi hy vọng điều này đủ điều kiện.

Phiên bản bị đánh cắp:

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;          



   }

}

Giải thích: Trong phiên bản golf itương ứng với sizephiên bản không có người nhận và rratephiên bản không có người nhận. jlưu trữ thời gian còn lại trong vài giây.

  • Tôi có 10 ^ 9 byte để sao chép. Tôi bắt đầu sao chép với tốc độ 10 Megabyte / giây,
  • Nếu xác suất nhỏ hơn 30%, hãy thay đổi tốc độ (từ 10 kilobyte thành 100 Megabyte mỗi giây)

@ValueInk Cảm ơn bạn đã lưu 13 byte.

@ nmjcman101 Cảm ơn bạn đã lưu 16 byte.


Điều này không giống như nó thực sự làm những gì thách thức nói. Bạn có thể giải thích làm thế nào nó hoạt động?
Mực giá trị

Nó chỉ mô phỏng đầu ra thời gian, tôi chưa tìm ra cách thực hiện phần truyền dữ liệu. Đoán tôi sẽ giữ điều này cho đến khi đó.
Abel Tom

Bạn không thay đổi tỷ lệ sau 3 lần lặp. Nó có 30% cơ hội thay đổi. Vì vậy, bạn có thể muốn làm một cái gì đó tương tự như sau: if(rand()%10<3)r=(rand()%10000+1)*1e4;(Đặc biệt vì tốc độ tối thiểu là 10 kB / s, không phải 1MB / s như giải pháp của bạn đang nói, và cơ hội tỷ lệ sẽ là một phân phối hơi đồng đều.)
Value Ink

@ValueInk Cảm ơn rất nhiều. :) Đã cập nhật. Hoàn thành công việc! Tôi không biết chính xác làm thế nào để mô phỏng phần xác suất 30%. Bây giờ rõ ràng hơn nhiều.
Abel Tom

bạn có thể chơi gôn j/3600,(j/60)%60,j%60(21) với s=60;j/s/s,j/s%s,j%s(20)
Davide
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.