Diese Herausforderung ist inspiriert von xkcd :
Herausforderung:
Sie simulieren das Kopieren einer großen Datei (1 Gigabyte). Die Übertragungsrate variiert zwischen 10 kB / s und 100 MB / s. Ihre Aufgabe ist es, die verbleibende Zeit der Dateiübertragung auszugeben. Die Ausgabe sollte folgendermaßen aussehen:
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)
Führende Nullen müssen nicht für Minuten und Stunden angezeigt werden (optional), sondern müssen für Sekunden angezeigt werden. Es ist nicht OK, die verbleibende Zeit in Sekunden anzugeben.
Die Dateiübertragung:
- Die Übertragungsrate beginnt bei 10 MB / Sekunde.
- Jede Sekunde besteht eine Wahrscheinlichkeit von 30%, dass sich die Übertragungsrate ändert
- Die neue Übertragungsrate sollte zufällig (gleichmäßige Verteilung)
[10 kB/s, 100 MB/s]
in Schritten von 10 kB / s ausgewählt werden.
Hinweis: Sie müssen eine Datei nicht wirklich kopieren.
Sie können wählen:, 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 B
oder 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B
.
Ausgabe:
- Du fängst bei an
01:40
, nicht01:39
. - Sie zeigen die Zeit an, nachdem sich die Übertragungsrate geändert hat, aber bevor etwas mit dieser Rate übertragen wird
- Die Sekunden sollten als ganze Zahlen und nicht als Dezimalzahlen angezeigt werden. Es ist optional, auf / ab / am nächsten zu runden.
- Sie sollten den Bildschirm jede Sekunde löschen, es sei denn, dies ist in Ihrer Sprache nicht möglich.
- Die Ausgabe sollte konstant sein:
Time remaining: 00:00
wenn die Dateiübertragung beendet ist.
Beispiel:
Ich habe alle Dezimalsekunden aufgerundet. Angenommen, die folgenden Zeilen werden mit einem Abstand von 1 Sekunde angezeigt und der Bildschirm wird zwischen den einzelnen Zeilen gelöscht:
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
(oder1:42
) nicht1:39
(oder1:41
)"?1024
Version verwenden, welche Schrittgrößen sollten wir verwenden?00:00:10
zum Beispiel belassen ?Antworten:
Pyth -
7068 BytesProbieren Sie es online aus, ohne zu schlafen .
quelle
PowerShell ,
190215187 ByteProbieren Sie es online! (TIO unterstützt das Löschen des Bildschirms zwischen Zeilen nicht.)
Legt unsere anfängliche
$f
Ile-Größe und unser anfängliches Transfer-$r
Ate auf1gb
und10mb
/ s fest. Dann, solange wir noch$f
ile haben , schleifen wir.Innerhalb der Schleife
if
wählt der eine Zahl von0
bis9
einschließlich, und wenn es 0, 1 oder 2 ist (dh 30% der Zeit), ändern wir die Rate. Dies wählt eine zufällige Ganzzahl zwischen1kb
und diese wird10mb
dann multipliziert10
, um unsere Schrittzahl zu erhalten.Wir nutzen dann die
FromSeconds
statische Methode aus derTimeSpan
.NET-Bibliothek, um die verbleibende Zeit zu konstruieren. Das Ausgabeformat dieses Aufrufs entspricht genau den Herausforderungsanforderungen, sodass keine zusätzliche Formatierung erforderlich ist.(Ein Haufen dank @ConnorLSW gerettet)
quelle
-f
Operator scheint nichts zu tun. Indem ich das entfernte und diefor
Schleife anstelle von " to" verwendetewhile
und dann beide Instanzen von "get-date
to" ändertedate
, war ich in der Lage, 22 Bytes zu entfernen. Probieren Sie es online!Get-Date
weil es ansonsten den Linux-date
Befehl verwendet, der anders ist. Sie können es unter Windows ablegen, da PowerShell den Windows-date
Befehl umschließt . Aber danke für diefor
Loop-Konstruktion!nal date get-date
den Header in TIO einzufügen.random
(führen Sie den Befehl mitget-
vorangestellt aus, wenn alles andere fehlschlägt).MATL , 78 Bytes
Vielen Dank an @Maltysen und @DigitalTrauma für die Korrekturen.
Probieren Sie es bei MATL Online! (Möglicherweise müssen Sie mehrmals auf "Ausführen" klicken, wenn dies anfangs nicht funktioniert.)
Der Online-Dolmetscher läuft nach 30 Sekunden ab. Sie können geändert werden soll
10
(in Zehntel Sekunden Pausenzeit) etwas kleiner wie3
um die Geschwindigkeit der Anzeige zu erhöhenErläuterung
quelle
Ruby,
116110 BytesProbieren Sie es online aus, es sei denn, repl.it wird
\r
als Newline gelesen und kann auch nicht verwendet werden. Daher wird$><<
es durch das 5-Byte-Äquivalent ersetztprint
.Wenden Sie sich an JonasWielicki für die erste Idee
\r
, die Leitung zurückzusetzen.Diese Version ist unter Windows nicht getestet, funktioniert aber unter Unix.
quelle
Bash + gemeinsame Utensilien, 117
Einfache Implementierung. Ein paar Bytes gespart durch Teilen durch 10000:
Probieren Sie es online aus . Mit
sleep 0
dem TIO müssen Sie nicht warten.clear
funktioniert nicht mit TIO.quelle
JavaScript (ES6), 162 Byte
Zeigt die Minuten wie sie sind mit aufgefüllten Sekunden (Floored)
Z.B,
123:45
quelle
console.clear
zuc.clear
Das ist eine großartige Idee ;-), BTW<input id=o>
und einige andere Anpassungen vornehmen: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)Ziemlich einfach, denke ich. Löscht die Zeile mit der ANSI-Escape-Sequenz und dem
K
Befehl.quelle
from random import*
.d//r
ist kürzer alsint(d/r)
. Auch könnte genauso gutr=1e7;d=1e9
von Anfang an mitgehen .Batch, 193 Bytes
Hinweis: Geringfügige Abweichung von 27,68 MB / s oder weniger.
quelle
C
184171155 BytesIch hoffe das qualifiziert sich.
Ungolfed-Version:
Erklärung: In der Golfversion
i
entspricht dies dersize
ungolften Version undr
istrate
in der ungolften Version.j
speichert die verbleibende Zeit in Sekunden.@ValueInk Vielen Dank für das Speichern von 13 Bytes.
@ nmjcman101 Danke, dass du 16 Bytes gespart hast.
quelle
if(rand()%10<3)r=(rand()%10000+1)*1e4;
(Zumal die Mindestrate 10 kB / s beträgt und nicht 1 MB / s, wie in Ihrer Lösung angegeben, und die Ratenchance eine etwas gleichmäßige Verteilung sein sollte.)j/3600,(j/60)%60,j%60
(21) mits=60;
undj/s/s,j/s%s,j%s
(20)