Drag Race Countdown


10

Desafio:

Em um cenário hipotético, o cronômetro de contagem regressiva para uma corrida tem intervalos aleatórios entre as contagens, para impedir o início prematuro, por exemplo,

3 (0.82 seconds pass), 2 (0.67 seconds pass), 1

Entrada:

nada


Resultado:

Escreva um programa (ou função) que imprima os 3 números com um intervalo aleatório de 0,50 segundos a 1 segundo entre cada contagem.


Nota:

  • O programa deve gerar cada número (3, 2, 1) com o intervalo de tempo aleatório ( qualquer número entre 0,50 e 1 até os centésimos; sem codificação codificada) entre cada um. A precisão do intervalo aleatório deve chegar às centenas (por exemplo: 0,52). Você não precisa emitir o intervalo, apenas a contagem.
  • Como o @JoKing esclareceu, quero dizer uniformemente aleatório (você pode usar o gerador pseudo-aleatório do seu idioma.
  • Como muitas pessoas esclareceram, eu realmente quero dizer qualquer número decimal entre 0,5 e 1. (0,50, 0,51, etc, até 0,98, 0,99, 1)

Isso é , então o programa com a menor contagem de bytes vence.


4
Olá LordColus, e bem-vindo ao PPCG! Este parece ser um bom primeiro desafio. Para desafios futuros, recomendamos que você entre na caixa de areia primeiro para resolver todos os detalhes.

1
@ LordColus: melhorei a declaração original e algumas outras edições, dê uma olhada e aprove se quiser.
Muhammad Salman

1
Como eu disse em um comentário anterior que foi excluído, especificar "uniformemente aleatório" é bom se você não for muito rigoroso com precisão. Como está agora, os tempos de pausa devem ser uniformes com precisão de duas casas decimais (ou são pelo menos duas casas decimais?). Isso significa que a distribuição deve ser uniforme no conjunto 0,5, 0,51, 0,52, ..., 1 ou pode ser qualquer ponto flutuante (possivelmente com mais de duas casas decimais) entre 0,5 e 1?
Luis Mendo

2
Minha edição mais recente a esclarece?
LordColus

6
@ mbomb007 Mesmo ... por que isso foi fechado novamente? É basicamente contar de 3 a 1 com duas .50-1,00 segundos de espera no meio. Realmente não é complicado.
Magic Octopus Urn

Respostas:



2

SmileBASIC, 64 62 bytes

?3M?2M?1DEF M
M=MILLISEC
WHILE MILLISEC<M+500+RND(501)WEND
END

Infelizmente, não posso usar WAIT, pois ele suporta apenas intervalos de 1/60 de segundo (nada menos normalmente não é útil, pois a entrada / saída é atualizada apenas uma vez por quadro)

Isso requer ajustes, dependendo da velocidade do sistema em que está sendo executado, portanto, pode não ser válido (46 bytes):

?3M?2M?1DEF M
FOR I=-66E4-RND(66E4)TO.NEXT
END

Versão WAIT inválida (36 bytes):

?3WAIT 30+RND(30)?2WAIT 30+RND(30)?1

2

R , 46 44 bytes

para uma contagem regressiva real:

for(i in 3:1){cat(i)
Sys.sleep(runif(1,.5))}

Experimente online!

intervalo de impressão, como eu inicialmente não entendi o desafio (46 bytes) Obrigado Giuseppe por salvar 2 caracteres.

for(i in 3:1)cat(i,format(runif(1,.5),,2)," ")

Experimente online!


Eu acredito que, runif()por padrão, tem os pontos de extremidade esquerdo e direito como 0e 1respectivamente, portanto, runif(1,.5)deve funcionar da mesma forma para -2 bytes em ambos.
Giuseppe

Boa captura, obrigado @ Giuseppe.
JayCe

2

Python 2 , 58 bytes

from time import*
for a in'321':print a;sleep(1-time()%.5)

Experimente online!

Criei um gerador de números aleatórios muito simples que leva o tempo de propagação (como muitas pessoas).


Melhorias


1-time()%.5deve fazer o truque. (Você precisa [3,2,1]pelo caminho)
Jonathan Allan

Também for a in'321' poupa outros dois
Jonathan Allan

@ JonathanAllan Muito bom ponto, atualizado.
Neil

Isso dorme uma vez antes da contagem regressiva também. Eu acho que você precisa da declaração impressa antes de dormir.
Magic Octopus Urn

@MagicOctopusUrn Concordado, atualizado.
Neil

1

APL + WIN, 37 bytes

3⋄r←⎕dl ↑n←.49+.01×2?51⋄2⋄r←⎕dl 1↓n⋄1

1

Java 8, 86 bytes

v->{for(int i=0;++i<4;Thread.sleep((int)(Math.random()*500+500)))System.out.print(i);}

Imprime sem delimitador. Se isso não for permitido, são +2 bytes mudando printpara println(delimitador de nova linha).

Experimente online.
Prove que os intervalos estão na faixa correta de [500, 1000)ms.

Explicação:

v->{                        // Method with empty unused parameter and no return-type
  for(int i=0;++i<4;        //  Loop in range [1,4)
      Thread.sleep((int)(Math.random()*500+500)))
                            //    After every iteration: sleep for [500, 1000) ms randomly
     System.out.print(i);}  //   Print the current number


1

JavaScript (Node.js) , 75 65 60 bytes

  • graças a @Shaggy por reduzir em 10 bytes
  • graças a @Kevin Cruijssen por reduzir em 5 bytes
f=(i=3)=>i&&setTimeout(f,Math.random()*500+500,i-1,alert(i))

Experimente online!



1
@ Shaggy será realmente aleatório se você estiver usando o Date? (pela segunda vez ocorreu a aleatório)
DanielIndie

1
Por que *1000%500+500? Você pode apenas usar *500+500.
Kevin Cruijssen

Com as atualizações das especificações, provavelmente não será aleatório o suficiente, mas pode valer a pena pedir esclarecimentos.
Shaggy


1

Chip -wingjj , 33 bytes

0123456e7f s
???????p*9S!ZZZtaABb

Experimente online!

Em Chip, não podemos esperar por exatamente 1 / 100 de segundo, mas podemos esperar por 1 / 256 de segundo, por isso usamos isso aqui.

p, Quando perguntado, irá parar a execução para a cabeça pilha (um byte) * 1 / 256 segundos. Em cada ciclo, sempre definir o bit alta da pilha ( 128 / 256 ) e definir todos os outros bits pilha aleatoriamente (com o ?'s). Isso fornece uma distribuição uniforme entre 0,50 e 1,00 segundos.

Alguns dos argumentos, -we -gjj, especificam que a entrada, em vez de usar stdin, deve ser uma contagem regressiva de 0xFFpara 0x00(em seguida, quebra automática). Usamos isso para fornecer os dois bits mais baixos para a contagem regressiva. Todos os outros bits de saída permanecem constantes (no valor correspondente a ASCII 0).

Finalmente, assim que terminamos, encerramos o programa com t, impedindo uma pausa após o último número.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.