Copiar un archivo - estilo Windows

40

Este desafío está inspirado en xkcd :

ingrese la descripción de la imagen aquí

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, no 01: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.
Stewie Griffin
fuente
1
Debe colocar el texto de información sobre herramientas XKCD debajo de la imagen. Ahorre a la gente el tiempo de tener que buscarlo ellos mismos.
mbomb007
66
@ mbomb007, desplace la imagen :)
Stewie Griffin
¿Debería ser eso, "comienzas en 1:40(o 1:42) no 1:39(o 1:41)"?
Jonathan Allan
Además, si estamos usando la 1024versión, ¿cuáles son los tamaños de paso que deberíamos usar?
Jonathan Allan
Si las horas restantes son cero, ¿podemos dejar la salida como, 00:00:10por ejemplo?
AdmBorkBork

Respuestas:

9

Pyth - 70 68 bytes

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

Pruébalo en línea sin dormir .

Maltysen
fuente
@DigitalTrauma lo siento, estaba usando la respuesta de Luis como guía ._.
Maltysen
@DigitalTrauma corregido.
Maltysen
66
Jajaja Cuando la transferencia del idioma (golf) A al lenguaje (golf) B es más fácil que leer la especificación ;-)
Digital Trauma
@ Maltysen Lo siento por eso! :-)
Luis Mendo
2
¿Puedes dar una explicación de qué diablos está pasando aquí?
David dice que reinstale a Mónica
8

PowerShell , 190 215 187 bytes

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

Prué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ó a 1gbe 10mb/ s, respectivamente. Luego, mientras nos $fquede un archivo restante, hacemos un bucle.

Dentro del bucle, las ifselecciona un número de 0al 9inclusive, y si es 0, 1, o 2 (es decir, 30% del tiempo), cambiamos la tarifa. Esto selecciona un número entero aleatorio entre 1kby 10mbluego que se multiplica por 10para obtener nuestro recuento de pasos.

Luego aprovechamos el FromSeconds método estático de la TimeSpanbiblioteca .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)

AdmBorkBork
fuente
1
@StewieGriffin TIO tiene almacenamiento en caché de salida. Seleccione "deshabilitar caché de salida" en el cajón Configuración y obtendrá resultados diferentes.
TheBikingViking
Tal vez me falta algo, pero el -foperador no parece hacer nada. Al sacar eso y usar el forbucle en lugar de while, y luego cambiar ambas instancias de get-datea date, pude recortar 22 bytes. Pruébalo en línea!
briantist
@briantist TIO requiere Get-Dateporque de lo contrario utiliza el datecomando Linux , que es diferente. Puede soltarlo en Windows porque PowerShell envuelve el datecomando de Windows . Pero, gracias por la forconstrucción del bucle!
AdmBorkBork
@AdmBorkBork, sí, lo noté, pero en un entorno de Windows estándar funcionaría. Me pregunto si es aceptable poner nal date get-dateel encabezado en TIO.
briantist
@AdmBorkBork y en Windows no ajusta el comando de fecha de Windows, simplemente lo ignora porque no es un .exe en Windows, por lo que recurre al mismo comportamiento que random(intente el comando con get-antepuesto si todo lo demás falla).
briantist
5

MATL , 78 bytes

Gracias a @Maltysen y @DigitalTrauma por las correcciones.

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

¡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ón

Explicación

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
Luis Mendo
fuente
No entiendo MATL, pero me parece que siempre obtienes una nueva tarifa en lugar de solo el 30% del tiempo de tu explicación.
Maltysen
@Maltysen Corregido ahora. ¡Gracias por el aviso!
Luis Mendo
@DigitalTrauma Corregido ahora
Luis Mendo
4

Bash + utilidades comunes, 117

Implementación directa. Algunos bytes guardados al dividir por 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
}

Pruébalo en línea . Utilizando sleep 0el TIO para que no tenga que esperar. clearno funciona en TIO.

Trauma digital
fuente
3

JavaScript (ES6), 162 bytes

Muestra minutos como está con segundos acolchados (con piso)

P.ej, 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)

George Reith
fuente
Creo que olvidó acortar console.cleara c.clear;-) Esa es una gran idea, por cierto
ETHproductions
@ETHproductions ¡Ooooops! Gracias :)
George Reith
Puede reducir esto a 154 bytes agregando HTML - <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)
Shaggy
2

Python 3.6 ( 212 203 bytes)

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

Bastante sencillo, creo. Borra la línea usando la secuencia de escape ANSI y el Kcomando.

Jonas Schäfer
fuente
1
Omita un espacio en su primera línea con from random import*. d//res más corto que int(d/r). Además, bien podría ir r=1e7;d=1e9desde el principio.
Value Ink
@ValueInk Correcto, no pensé en 1eX para R y D porque quería que fueran enteros; cuando acorté la línea randint, me olvidé de eso ... :)
Jonas Schäfer
1

Lote, 193 bytes.

@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

Nota: Sesgo leve hacia tasas de 27.68 MB / so menos.

Neil
fuente
1

C 184 171 155 bytes

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

Espero que esto califique.

Versión sin golf:

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;          



   }

}

Explicación: En la versión de golf icorresponde a la sizeversión sin golf yr está rateen la versión sin golf. jalmacena el tiempo restante en segundos.

  • Tengo 10 ^ 9 bytes para copiar. Empiezo a copiar a una velocidad de 10 Megabytes / segundo,
  • Si la probabilidad es inferior al 30%, cambie la velocidad (de 10 kilobytes a 100 megabytes por segundo)

@ValueInk Gracias por guardar 13 bytes.

@ nmjcman101 Gracias por guardar 16 bytes.

Abel Tom
fuente
Esto no parece que realmente haga lo que dice el desafío. ¿Puedes explicar cómo funciona?
Value Ink
Simplemente simula la salida del tiempo, no he descubierto cómo hacer la parte de transferencia de datos. Supongo que voy a poner esto en espera hasta entonces.
Abel Tom
No cambia la velocidad después de 3 iteraciones. Tiene un 30% de posibilidades de cambiar. Así que es probable que desee hacer algo similar a lo siguiente: 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.)
Valor de tinta
@ValueInk Muchas gracias. :) Actualizado. ¡Hace el trabajo! No sabía exactamente cómo simular la parte de probabilidad del 30%. Mucho más claro ahora.
Abel Tom
puedes jugar al golf j/3600,(j/60)%60,j%60(21) con s=60;y j/s/s,j/s%s,j%s(20)
Davide