Este desafio é inspirado no xkcd :
Desafio:
Você simulará a cópia de um arquivo grande (1 Gigabyte). A taxa de transferência varia entre 10 kB / segundo e 100 MB / segundo. Sua tarefa é gerar o tempo restante da transferência de arquivos. A saída deve se parecer com:
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)
Os zeros à esquerda não precisam ser exibidos por minutos e horas (opcional), mas devem ser mostrados por segundos. Mostrar o tempo restante usando apenas alguns segundos não está OK.
A transferência de arquivos:
- A taxa de transferência começará em 10 MB / segundo.
- A cada segundo, haverá uma chance de 30% de que a taxa de transferência mude
- A nova taxa de transferência deve ser escolhida aleatoriamente (distribuição uniforme) na faixa
[10 kB/s, 100 MB/s]
, em passos de 10 kB / s.
Nota: Você não precisa copiar um arquivo.
Você pode optar por usar:, 1 GB = 1000 MB, 1 MB = 1000 kB, 1 kB = 1000 B
ou 1 GB = 1024 MB, 1 MB = 1024 kB, 1 kB = 1024 B
.
Saída:
- Você começa às
01:40
, não01:39
. - Você exibe o tempo após a alteração da taxa de transferência, mas antes de qualquer coisa ser transferida nessa taxa
- Os segundos devem ser exibidos como números inteiros, não decimais. É opcional arredondar para cima / baixo / mais próximo.
- Você deve limpar a tela a cada segundo, a menos que seja impossível no seu idioma.
- A saída deve ser constante:
Time remaining: 00:00
quando a transferência do arquivo terminar.
Exemplo:
Arredondei todos os segundos decimais. Suponha que as linhas abaixo sejam mostradas com 1 segundo no meio e a tela seja limpa entre cada uma:
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
(ou1:42
) não1:39
(ou1:41
)"?1024
versão, quais são os tamanhos das etapas que devemos usar?00:00:10
por exemplo?Respostas:
Pitão -
7068 bytesExperimente online sem dormir .
fonte
PowerShell ,
190215187 bytesExperimente online! (O TIO não suporta a limpeza de tela entre linhas)
Define nosso
$f
tamanho de arquivo inicial e nossa transferência inicial$r
para1gb
e10mb
/ s, respectivamente. Então, enquanto ainda$f
restarmos íleo, fazemos um loop.Dentro do loop, as
if
selecciona um número de0
até9
, inclusive, e se é 0, 1, ou 2 (ou seja, 30% do tempo), que alteram a taxa. Isso seleciona um número inteiro aleatório entre1kb
e10mb
depois é multiplicado por10
para obter nossa contagem de etapas.Em seguida, aproveitamos o
FromSeconds
método estático daTimeSpan
biblioteca .NET para construir o tempo restante. O formato de saída dessa chamada corresponde exatamente aos requisitos de desafio, portanto, não há necessidade de formatação adicional.(Salvo um monte graças a @ConnorLSW)
fonte
-f
operador não parece fazer nada. Retirando isso e usandofor
loop em vez dewhile
, e depois alterando as duas instâncias deget-date
paradate
, consegui remover 22 bytes. Experimente online!Get-Date
porque, caso contrário, ele usa odate
comando Linux , que é diferente. Você pode soltá-lo no Windows porque o PowerShell agrupa odate
comando do Windows . Mas, obrigado pelafor
construção do loop!nal date get-date
no cabeçalho no TIO?random
(tente o comando comget-
prefpended se tudo mais falhar).MATL , 78 bytes
Obrigado a @Maltysen e @DigitalTrauma pelas correções.
Experimente no MATL Online! (pode ser necessário pressionar "Executar" várias vezes se não funcionar inicialmente).
O intérprete online atinge o tempo limite após 30 segundos. Você pode alterar
10
(tempo de pausa em décimos de segundo) para algo menor , como3
para aumentar a velocidade da exibiçãoExplicação
fonte
Ruby,
116110 bytesExperimente on-line, exceto repl.it lê
\r
como uma nova linha e também não pode ser usada,$><<
por isso é substituída por seu equivalente de 5 bytesprint
.Grite para JonasWielicki a idéia inicial de usar
\r
para redefinir a linha.Esta versão não foi testada no Windows, mas funciona no Unix.
fonte
Bash + utils comuns, 117
Implementação direta. Poucos bytes salvos dividindo por 10000:
Experimente online . Usando
sleep 0
no TIO para que você não precise esperar.clear
não funciona no TIO.fonte
JavaScript (ES6), 162 bytes
Mostra os minutos como estão com os segundos acolchoados (no chão)
Por exemplo,
123:45
fonte
console.clear
parac.clear
;-) Essa é uma ótima idéia, BTW<input id=o>
- e fazendo alguns outros 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)Bem simples, eu acho. Apaga a linha usando a seqüência e
K
comando de escape ANSI .fonte
from random import*
.d//r
é mais curto queint(d/r)
. Além disso, pode muito bem continuarr=1e7;d=1e9
desde o início.Lote, 193 bytes
Nota: Pequeno desvio para taxas de 27,68 MB / s ou menos.
fonte
C
184171155 bytesEspero que isso se qualifique.
Versão não destruída:
Explicação: Na versão golfed
i
corresponde àsize
versão ungolfed er
estárate
na versão ungolfed.j
armazena o tempo restante em segundos.Obrigado por salvar 13 bytes.
@ nmjcman101 Obrigado por salvar 16 bytes.
fonte
if(rand()%10<3)r=(rand()%10000+1)*1e4;
(Especialmente porque a taxa mínima é de 10 kB / s, não 1 MB / s como a sua solução está dizendo, e a chance de taxa deve ser uma distribuição um tanto uniforme.)j/3600,(j/60)%60,j%60
(21) coms=60;
ej/s/s,j/s%s,j%s
(20)