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 Bo 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:00cuando 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)"?1024versión, ¿cuáles son los tamaños de paso que deberíamos usar?00:00:10por 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
$ftamaño ile y nuestra transferencia inicial$rse comió a1gbe10mb/ s, respectivamente. Luego, mientras nos$fquede un archivo restante, hacemos un bucle.Dentro del bucle, las
ifselecciona un número de0al9inclusive, y si es 0, 1, o 2 (es decir, 30% del tiempo), cambiamos la tarifa. Esto selecciona un número entero aleatorio entre1kby10mbluego que se multiplica por10para obtener nuestro recuento de pasos.Luego aprovechamos el
FromSecondsmétodo estático de laTimeSpanbiblioteca .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
-foperador no parece hacer nada. Al sacar eso y usar elforbucle en lugar dewhile, y luego cambiar ambas instancias deget-dateadate, pude recortar 22 bytes. Pruébalo en línea!Get-Dateporque de lo contrario utiliza eldatecomando Linux , que es diferente. Puede soltarlo en Windows porque PowerShell envuelve eldatecomando de Windows . Pero, gracias por laforconstrucción del bucle!nal date get-dateel 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 , como3para aumentar la velocidad de visualizaciónExplicación
fuente
Ruby,
116110 bytesPruébelo en línea, excepto que repl.it se lee
\rcomo 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
\rpara 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 0el TIO para que no tenga que esperar.clearno funciona en TIO.fuente
JavaScript (ES6), 162 bytes
Muestra minutos como está con segundos acolchados (con piso)
P.ej,
123:45fuente
console.clearac.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
Kcomando.fuente
from random import*.d//res más corto queint(d/r). Además, bien podría irr=1e7;d=1e9desde 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
icorresponde a lasizeversión sin golf yrestárateen la versión sin golf.jalmacena 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)