Este desafío está inspirado en xkcd :
Reto:
Simulará la copia de un archivo grande (1 Gigabyte). La velocidad de transferencia variará entre 10 kB / segundo a 100 MB / segundo. Su tarea es generar el tiempo restante de la transferencia de archivos. La salida debería verse así:
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)
Los ceros iniciales no necesitan mostrarse durante minutos y horas (opcional), pero deben mostrarse durante segundos. Mostrar el tiempo restante usando solo segundos no está bien.
La transferencia de archivos:
- La velocidad de transferencia comenzará a 10 MB / segundo.
- Cada segundo, habrá un 30% de posibilidades de que la tasa de transferencia cambie
- La nueva velocidad de transferencia debe seleccionarse al azar (distribución uniforme) en el rango
[10 kB/s, 100 MB/s]
, en pasos de 10 kB / s.
Nota: No es necesario que copie un archivo.
Puede elegir usar: 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 B
o 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B
.
Salida:
- Empiezas en
01:40
, no01:39
. - Muestra el tiempo después de que cambie la velocidad de transferencia, pero antes de que se transfiera nada a esa velocidad
- Los segundos deben mostrarse como enteros, no decimales. Es opcional redondear hacia arriba / abajo / más cercano.
- Debe borrar la pantalla cada segundo, a menos que sea imposible en su idioma.
- La salida debe ser constante:
Time remaining: 00:00
cuando finaliza la transferencia del archivo.
Ejemplo:
He redondeado todos los segundos decimales. Suponga que las líneas a continuación se muestran con 1 segundo en el medio, y la pantalla se borra entre cada una:
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
(o1:42
) no1:39
(o1:41
)"?1024
versión, ¿cuáles son los tamaños de paso que deberíamos usar?00:00:10
por ejemplo?Respuestas:
Pyth -
7068 bytesPruébalo en línea sin dormir .
fuente
PowerShell ,
190215187 bytesPruébalo en línea! (TIO no admite borrar la pantalla entre líneas)
Establece nuestra inicial
$f
tamaño ile y nuestra transferencia inicial$r
se comió a1gb
e10mb
/ s, respectivamente. Luego, mientras nos$f
quede un archivo restante, hacemos un bucle.Dentro del bucle, las
if
selecciona un número de0
al9
inclusive, y si es 0, 1, o 2 (es decir, 30% del tiempo), cambiamos la tarifa. Esto selecciona un número entero aleatorio entre1kb
y10mb
luego que se multiplica por10
para obtener nuestro recuento de pasos.Luego aprovechamos el
FromSeconds
método estático de laTimeSpan
biblioteca .NET para construir el tiempo restante. El formato de salida de esa llamada coincide exactamente con los requisitos de desafío, por lo que no es necesario un formato adicional.(Ahorré un montón gracias a @ConnorLSW)
fuente
-f
operador no parece hacer nada. Al sacar eso y usar elfor
bucle en lugar dewhile
, y luego cambiar ambas instancias deget-date
adate
, pude recortar 22 bytes. Pruébalo en línea!Get-Date
porque de lo contrario utiliza eldate
comando Linux , que es diferente. Puede soltarlo en Windows porque PowerShell envuelve eldate
comando de Windows . Pero, gracias por lafor
construcción del bucle!nal date get-date
el encabezado en TIO.random
(intente el comando conget-
antepuesto si todo lo demás falla).MATL , 78 bytes
Gracias a @Maltysen y @DigitalTrauma por las correcciones.
¡Pruébalo en MATL Online! (es posible que deba presionar "Ejecutar" varias veces si no funciona inicialmente).
El intérprete en línea agota el tiempo de espera después de 30 segundos. Es posible que desee cambiar
10
(tiempo de pausa en décimas de segundo) a algo más pequeño , como3
para aumentar la velocidad de visualizaciónExplicación
fuente
Ruby,
116110 bytesPruébelo en línea, excepto que repl.it se lee
\r
como una nueva línea y tampoco se puede usar,$><<
por lo que se reemplaza con su equivalente de 5 bytesprint
.Grite a JonasWielicki por la idea inicial de usar
\r
para restablecer la línea.Esta versión no se ha probado en Windows, pero funciona en Unix.
fuente
Bash + utilidades comunes, 117
Implementación directa. Algunos bytes guardados al dividir por 10000:
Pruébalo en línea . Utilizando
sleep 0
el TIO para que no tenga que esperar.clear
no funciona en TIO.fuente
JavaScript (ES6), 162 bytes
Muestra minutos como está con segundos acolchados (con piso)
P.ej,
123:45
fuente
console.clear
ac.clear
;-) Esa es una gran idea, por cierto<input id=o>
y haciendo otros ajustes: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)Bastante sencillo, creo. Borra la línea usando la secuencia de escape ANSI y el
K
comando.fuente
from random import*
.d//r
es más corto queint(d/r)
. Además, bien podría irr=1e7;d=1e9
desde el principio.Lote, 193 bytes.
Nota: Sesgo leve hacia tasas de 27.68 MB / so menos.
fuente
C
184171155 bytesEspero que esto califique.
Versión sin golf:
Explicación: En la versión de golf
i
corresponde a lasize
versión sin golf yr
estárate
en la versión sin golf.j
almacena el tiempo restante en segundos.@ValueInk Gracias por guardar 13 bytes.
@ nmjcman101 Gracias por guardar 16 bytes.
fuente
if(rand()%10<3)r=(rand()%10000+1)*1e4;
(Sobre todo porque la tasa mínima es de 10 kb / s, no 1 MB / s al igual que su solución está diciendo, y la posibilidad tasa debe ser una distribución algo uniforme.)j/3600,(j/60)%60,j%60
(21) cons=60;
yj/s/s,j/s%s,j%s
(20)