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.