Bir dosyayı kopyala - Windows tarzı


40

Bu zorluk xkcd'den ilham alıyor :

görüntü tanımını buraya girin

Meydan okuma:

Büyük bir dosyayı (1 Gigabyte) kopyalamayı simüle edersiniz. Aktarım hızı, 10 kB / saniye ila 100 MB / saniye arasında değişecektir. Göreviniz, dosya transferinden kalan sürenin çıktısını almaktır. Çıktı şöyle görünmelidir:

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)

Öne çıkan sıfırların dakikalarca ve saatlerce gösterilmesi gerekmez (isteğe bağlı), ancak saniyelarca gösterilmesi gerekir. Sadece saniye kullanarak kalan süreyi göstermeniz tamam değildir.

Dosya aktarımı:

  • Aktarım hızı 10 MB / saniye ile başlayacaktır.
  • Her saniye, transfer hızının değişmesi% 30 şansı olacak
  • Yeni aktarım hızı [10 kB/s, 100 MB/s], 10 kB / s'lik adımlarla aralıkta rasgele (homojen dağılım) seçilmelidir .

Not: Bir dosyayı gerçekten kopyalamanıza gerek yoktur.

Kullanmayı seçebilirsiniz:, 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 Bveya 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B.

Çıktı:

  • Başlıyorsun 01:40, değil 01:39.
  • Aktarım hızı değiştikten sonra ancak bu hızda herhangi bir şey aktarılmadan önce zamanı görüntülersiniz.
  • Saniyeler, ondalık sayılar değil tam sayılar olarak gösterilmelidir. Yuvarlama / aşağı / en yakın noktaya getirmek isteğe bağlıdır.
  • Dilinizde imkansız olmadığı sürece, ekranı her saniye temizlemelisiniz.
  • Çıktı sabit olmalıdır: Time remaining: 00:00dosya aktarımı bittiğinde.

Örnek:

Ondalık saniyeleri yuvarladım. Aşağıdaki satırların arasında 1 saniye göründüğünü ve her birinin arasında ekranın silindiğini varsayalım:

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 araç ipucu metnini görüntünün altına koymalısınız. İnsanlara kendilerinin bakmak zorunda kalma zamanından tasarruf edin.
mbomb007

6
@ mbomb007, görüntüyü gezdir :)
Stewie Griffin

Bu, "Başlamanız 1:40(ya da 1:42) 1:39(ya da 1:41)" olması mı gerekir?
Jonathan Allan

Ayrıca 1024sürümü kullanıyorsak, kullanmamız gereken adım boyutları nelerdir?
Jonathan Allan

Kalan saat sıfırsa, 00:00:10örneğin çıktıyı bırakabilir miyiz ?
AdmBorkBork

Yanıtlar:


9

Pyth - 70 68 bayt

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

Uyumadan çevrimiçi deneyin .


@DigitalTrauma üzgünüm, Luis 'cevabını rehber olarak kullanıyordu.
Maltysen

@ DigitalTrauma düzeltildi.
Maltysen

6
Lol. (Golf) dili A ile (golf) dili B arasında geçiş yaparken, spesifikasyonları okumaktan daha kolaydır ;-)
Digital Trauma

@Maltysen Bunun için üzgünüm! :-)
Luis Mendo

2
Burada neler olup bittiğine dair bir açıklama yapabilir misin?
Monica,

8

PowerShell , 190 215 187 bayt

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

Çevrimiçi deneyin! (TIO, çizgiler arasındaki ekranı temizlemeyi desteklemiyor)

İlk $file boyutumuzu ve ilk transferimizin sırasıyla ve / s $ryediğini ayarlar . Sonra, hala kaldıkça, döngü kurarız.1gb10mb$f

Döngünün içinde, dahil ifedilmek 0üzere bir sayı seçer 9ve eğer 0, 1 veya 2 ise (yani, zamanın% 30'u) oranı değiştiririz. Bu, arasında adım olan rasgele bir tamsayı seçer 1kbve adım sayımızı elde etmek için 10mbçarpılır 10.

Sonra kaldıraç FromSeconds statik yöntemini gelen TimeSpankalan süre oluşturmak için .NET kütüphanesine. Bu çağrının çıktı biçimi, zorunluluk gereksinimlerine tam olarak uyuyor, bu nedenle ek biçimlendirmeye gerek yok.

(@ConnorLSW sayesinde bir demet kurtardım)


1
@StewieGriffin TIO'da çıkış önbelleği var. Ayarlar çekmecesinde "çıkış önbelleğini devre dışı bırak" ı seçin ve farklı sonuçlar verir.
TheBikingViking

Belki bir şeyleri özlüyorum ama -foperatör hiçbir şey yapmıyor gibi görünüyor. O Çıkış alıp kullanarak foryerine döngü whileve sonra her iki örneği değişen get-dateiçin date, ben 22 bayt traş başardı. Çevrimiçi deneyin!
Briantist

@briantist TIO gerektirir Get-Dateçünkü aksi halde datefarklı olan Linux komutunu kullanır . PowerShell, Windows datekomutunu tamamladığı için Windows'a bırakabilirsiniz . Ancak, fordöngü yapımı için teşekkürler !
AdmBorkBork

@AdmBorkBork evet bunu farkettim, ancak hisse senedi Windows ortamında çalışacak. Merak ediyorum, sadece nal date get-dateTIO’da başlığı koymak kabul edilebilir mi?
Briantist

@AdmBorkBork ve pencerelerde windows date komutunu sarmaz, sadece Windows'ta bir .exe olmadığı için dikkate almaz, bu nedenle aynı davranışa geri döner random( get-eğer başarısız olursa , önceden hazırlanmış komutu deneyin ).
Briantist

5

MATL , 78 bayt

Düzeltmeler için @Maltysen ve @ DigitalTrauma'ya teşekkürler .

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

MATL Online'da deneyin ! (başlangıçta çalışmazsa birkaç kez "Çalıştır" tuşuna basmanız gerekebilir).

Çevrimiçi tercüman 30 saniye sonra zaman aşımına uğrar. Ekran hızını arttırmak gibi10 daha küçük bir şeyle değiştirmek (saniyenin onda birindeki zamanı duraklatmak) isteyebilirsiniz3

açıklama

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'yi anlamıyorum, ama bana açıklamanızın zamanının sadece% 30'u yerine her zaman yeni bir oran alıyorsunuz gibi geliyor.
Maltysen

@Maltysen Şimdi düzeltildi. Söylediğin için teşekkürler!
Luis Mendo

@DigitalTrauma Şimdi düzeltildi
Luis Mendo


4

Bash + ortak kullanım alanları, 117

Basit uygulama. 10000'e bölünerek kaydedilen birkaç bayt:

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
}

Çevrimiçi deneyin . sleep 0TIO'yu kullanarak beklemeniz gerekmez. clearTIO üzerinde çalışmıyor.


3

JavaScript (ES6), 162 bayt

Dolgulu saniyelerdeki gibi dakikaları gösterir (döşenmiş)

Örneğin, 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)


Sana kısaltmak unuttum düşünüyorum console.cleariçin c.clearbu BTW, harika bir fikir ;-)
ETHproductions

@ETHproductions Ooooops! Thanks :)
George Reith

HTML ekleyerek bunu 154 bayta indirebilirsin - <input id=o>- ve birkaç değişiklik daha yapabilirsin: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 bayt)

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

Oldukça basit, sanırım. ANSI çıkış sırasını ve Kkomutunu kullanarak satırı siler .


1
İle ilk satırınızda bir boşluk atlayın from random import*. d//rdaha kısa int(d/r). Ayrıca, r=1e7;d=1e9en baştan başlayabiliriz.
Value Ink,

@ValueInk Doğru, r ve d için 1eX düşünmedim çünkü tamsayı olmalarını istedim; randint hattını kısalttığım zaman bunu unuttum ... :)
Jonas Schäfer

1

Toplu iş, 193 bayt

@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

Not: 27,68 MB / s veya daha düşük oranlara karşı hafif önyargı.


1

C 184 171 155 bayt

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

Umarım bu nitelendirir.

Ungolfed versiyonu:

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;          



   }

}

Açıklama: golfed versiyonu olarak itekabül sizeungolfed versiyonu ve rbir rateungolfed versiyonu. jsaniye cinsinden kalan süreyi kaydeder.

  • Kopyalamak için 10 ^ 9 baytım var. Kopyalamayı 10 megabayt / saniye hızında başlatıyorum,
  • Olasılık% 30'dan az ise, oranı değiştirin (10 kilobayttan saniyede 100 megabayt)

@ValueInk 13 bayt kaydettiğiniz için teşekkür ederiz.

@ nmjcman101 16 bayt kaydettiğiniz için teşekkür ederiz.


Bu aslında meydan okuma ne diyor aslında yok gibi görünmüyor. Nasıl çalıştığını açıklayabilir misiniz?
Value Ink,

Sadece zaman çıktısını simüle ediyor, veri aktarma bölümünün nasıl yapılacağını çözmedim. Sanırım bunu o zamana kadar bekleyeceğim.
Abel Tom,

3 yinelemeden sonra oranı değiştiremezsiniz. % 30 değişim şansı var. Bu nedenle, muhtemelen aşağıdakine benzer bir şey yapmak istersiniz: if(rand()%10<3)r=(rand()%10000+1)*1e4;(Özellikle asgari oran 10 kB / s olduğundan, çözümünüzün söylediği gibi 1 MB / s değil ve oran şansının biraz eşit dağılım göstermesi gerekir.)
Value Ink

@ValueInk Çok teşekkürler. :) Güncellenmiş. Yapılan işi alır! % 30 olasılık kısmının tam olarak nasıl simüle edileceğini bilmiyordum. Şimdi çok daha net.
Abel Tom

golf oynayabilir j/3600,(j/60)%60,j%60(21) s=60;ve j/s/s,j/s%s,j%s(20)
Davide
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.