Skopiuj plik - styl Windows


40

To wyzwanie jest inspirowane przez xkcd :

wprowadź opis zdjęcia tutaj

Wyzwanie:

Symulujesz kopiowanie dużego pliku (1 gigabajt). Szybkość przesyłania będzie się wahać od 10 kB / sekundę do 100 MB / sekundę. Twoim zadaniem jest określenie pozostałego czasu do przesłania pliku. Dane wyjściowe powinny wyglądać następująco:

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)

Zera wiodące nie muszą być wyświetlane przez minuty i godziny (opcjonalnie), ale muszą być wyświetlane przez sekundy. Wyświetlanie czasu pozostałego przy użyciu tylko sekund jest nieprawidłowe.

Przesyłanie pliku:

  • Szybkość przesyłania rozpocznie się od 10 MB / sekundę.
  • Co sekundę będzie 30% szans na zmianę szybkości transferu
  • Nowa szybkość transferu powinna być wybierana losowo (rozkład równomierny) w zakresie [10 kB/s, 100 MB/s], w krokach co 10 kB / s.

Uwaga: Nie musisz kopiować pliku.

Możesz wybrać opcję: 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 Blub 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B.

Wynik:

  • Zaczynasz o 01:40nie 01:39.
  • Wyświetlany jest czas po zmianie szybkości przesyłania, ale zanim cokolwiek zostanie przesłane z tą prędkością
  • Sekundy powinny być wyświetlane jako liczby całkowite, a nie dziesiętne. Opcjonalnie można zaokrąglać w górę / w dół / najbliżej.
  • Powinieneś wyczyścić ekran co sekundę, chyba że jest to niemożliwe w twoim języku.
  • Dane wyjściowe powinny być stałe: Time remaining: 00:00po zakończeniu przesyłania pliku.

Przykład:

Zaokrągliłem wszystkie dziesiętne sekundy. Załóżmy, że poniższe linie są pokazane z 1 sekundą pomiędzy nimi, a ekran jest czyszczony między nimi:

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
Powinieneś umieścić tekst podpowiedzi XKCD pod obrazem. Oszczędzaj ludziom czasu na samodzielne wyszukiwanie.
mbomb007

6
@ mbomb007, najedź na obrazek :)
Stewie Griffin

Czy powinno to brzmieć: „zaczynasz od 1:40(lub 1:42) nie 1:39(lub 1:41)”?
Jonathan Allan

Także jeśli korzystamy z 1024wersji, jakie rozmiary kroków powinniśmy stosować?
Jonathan Allan

Jeśli pozostała liczba godzin wynosi zero, czy możemy 00:00:10na przykład pozostawić produkcję ?
AdmBorkBork

Odpowiedzi:


9

Pyth - 70 68 bajtów

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

Wypróbuj online bez snu .


@DigitalTrauma przepraszam, używał odpowiedzi Luisa jako przewodnika ._.
Maltysen

@DigitalTrauma naprawione.
Maltysen

6
Lol. Przenoszenie z języka A ​​do (golfa) na język B jest łatwiejsze niż czytanie specyfikacji ;-)
Cyfrowa trauma

@Maltysen Przepraszamy za to! :-)
Luis Mendo,

2
Czy możesz wyjaśnić, co się tu do cholery dzieje?
Przywróć Monikę

8

PowerShell , 190 215 187 bajtów

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

Wypróbuj online! (TIO nie obsługuje czyszczenia ekranu między liniami)

Ustawia nasz początkowy $frozmiar ile i nasz początkowy transfer odpowiednio $rdo 1gbi 10mb/ s. Następnie, dopóki mamy jeszcze tyle $f, zapętlamy.

Wewnątrz pętli ifwybiera liczbę od 0do 9włącznie, a jeśli jest to 0, 1 lub 2 (tj. 30% czasu), zmieniamy szybkość. Wybiera losową liczbę całkowitą pomiędzy, 1kba 10mbnastępnie pomnożoną przez, 10aby uzyskać naszą liczbę kroków.

Następnie wykorzystujemy FromSeconds metodę statyczną z TimeSpanbiblioteki .NET, aby skonstruować pozostały czas. Format wyjściowy tego połączenia dokładnie odpowiada wymaganiom wyzwania, więc nie ma potrzeby dodatkowego formatowania.

(Uratowałem sporo dzięki @ConnorLSW)


1
@StewieGriffin TIO ma buforowanie danych wyjściowych. Wybierz „wyłącz wyjściową pamięć podręczną” w szufladzie ustawień, aby uzyskać różne wyniki.
TheBikingViking

Może czegoś mi brakuje, ale -foperator nic nie robi. Wyciągając to i używając forpętli zamiast while, a następnie zmieniając oba przypadki get-datena date, byłem w stanie ogolić 22 bajty. Wypróbuj online!
briantist

@ Briantist TIO wymaga, Get-Dateponieważ w przeciwnym razie używa datekomendy Linux , która jest inna. Możesz upuścić go w systemie Windows, ponieważ PowerShell otacza datepolecenie systemu Windows . Ale dzięki za forbudowę pętli!
AdmBorkBork

@AdmBorkBork tak, zauważyłem to, ale w zwykłym środowisku Windows to zadziałałoby. Zastanawiam się, czy dopuszczalne jest umieszczenie nal date get-datenagłówka w TIO?
briantist

@AdmBorkBork i w systemie Windows nie zawija polecenia daty systemu Windows, po prostu ignoruje je, ponieważ nie jest to .exe w systemie Windows, więc wraca do tego samego zachowania co random(wypróbuj polecenie z poleceniem get-poprzedzonym, jeśli wszystko inne zawiedzie).
briantist

5

MATL , 78 bajtów

Dzięki @Maltysen i @DigitalTrauma za poprawki.

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

Wypróbuj w MATL Online! (może być konieczne kilkukrotne naciśnięcie przycisku „Uruchom”, jeśli początkowo nie działa).

Tłumacz online przekroczył limit czasu po 30 sekundach. Możesz zmienić 10(czas pauzy w dziesiątych sekundach) na coś mniejszego, na przykład3 w celu zwiększenia szybkości wyświetlania

Wyjaśnienie

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

Nie rozumiem MATL, ale wydaje mi się, że zawsze otrzymujesz nową stawkę zamiast tylko 30% czasu od twojego wyjaśnienia.
Maltysen

@Maltysen Poprawione teraz. Dzięki za heads-up!
Luis Mendo,

@DigitalTrauma Poprawione teraz
Luis Mendo


4

Bash + wspólne narzędzia, 117

Prosta implementacja. Kilka bajtów zaoszczędzonych przez podzielenie przez 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
}

Wypróbuj online . Korzystanie sleep 0z TIO, więc nie musisz czekać. clearnie działa na TIO.


3

JavaScript (ES6), 162 bajty

Pokazuje minuty bez wypełnienia sekund (zmienne)

Na przykład, 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)


Chyba zapomniałeś, aby skrócić console.cleardo c.clear;-) To świetny pomysł, BTW
ETHproductions

@ETHproductions Ooooops! Dzięki :)
George Reith,

Możesz to zmniejszyć do 154 bajtów, dodając HTML - <input id=o>i wprowadzając kilka innych poprawek: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 bajtów)

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

Myślę, że całkiem proste. Usuwa linię za pomocą sekwencji ucieczki ANSI i Kpolecenia.


1
Pomiń spację w pierwszym wierszu za pomocą from random import*. d//rjest krótszy niż int(d/r). Równie dobrze może iść r=1e7;d=1e9od samego początku.
Wartość tuszu

@ValueInk Racja, nie myślałem o 1eX dla rid, ponieważ chciałem, aby były liczbami całkowitymi; kiedy skróciłem linię randinta, zapomniałem o tym ... :)
Jonas Schäfer

1

Partia, 193 bajtów

@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

Uwaga: Nieznaczne odchylenie w kierunku prędkości 27,68 MB / s lub mniej.


1

C 184 171 155 bajtów

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

Mam nadzieję, że to się kwalifikuje.

Wersja bez golfa:

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;          



   }

}

Objaśnienie: W wersji golfowej iodpowiada wersji bez golfa sizei rjest ratew wersji bez golfa.jprzechowuje pozostały czas w sekundach.

  • Mam 10 ^ 9 bajtów do skopiowania. Zaczynam kopiować z prędkością 10 megabajtów / sekundę,
  • Jeśli prawdopodobieństwo jest mniejsze niż 30%, zmień szybkość (z 10 kilobajtów na 100 megabajtów na sekundę)

@ValueInk Dziękujemy za zapisanie 13 bajtów.

@ nmjcman101 Dziękujemy za zapisanie 16 bajtów.


To nie wygląda na to, że faktycznie robi to, co mówi wyzwanie. Czy możesz wyjaśnić, jak to działa?
Wartość tuszu

To po prostu symuluje czas wyjściowy, nie zorientowałem się, jak wykonać część przesyłania danych. Chyba odłożę to do tego czasu.
Abel Tom

Nie zmieniasz stawki po 3 iteracjach. Ma 30% szansy na zmianę. Prawdopodobnie chcesz zrobić coś podobnego do następującego: if(rand()%10<3)r=(rand()%10000+1)*1e4;(Zwłaszcza, że ​​minimalna szybkość wynosi 10 kB / s, a nie 1 MB / s, jak mówi twoje rozwiązanie, a szansa na szybkość powinna być nieco jednolita.)
Wartość Ink

@ValueInk Dziękuję bardzo. :) Zaktualizowano. Wykonuje pracę! Nie wiedziałem, jak dokładnie symulować część 30% prawdopodobieństwa. Teraz o wiele jaśniej.
Abel Tom

możesz grać w golfa j/3600,(j/60)%60,j%60(21) z s=60;i j/s/s,j/s%s,j%s(20)
Davide
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.