Pausar o dobro do tempo


15

Seu desafio é imprimir a entrada, aguardar qualquer quantidade de tempo, imprimir a entrada, esperar duas vezes o tempo inicialmente esperado, imprimir a entrada novamente e assim por diante. O atraso inicial deve ser menor que 1 hora e você deve ter uma precisão de +/- 5% nos atrasos subsequentes. Fora isso, não há restrição no tempo de atraso.

Exemplo:

Entrada: hi.

Saída: hi(1ms de pausa) hi(2ms de pausa) hi(4ms de pausa) hi(8ms de pausa) hi(16ms de pausa), etc.

Também é permitido:

hi(Pausa de 1 minuto) hi( pausa de 2 minutos) hi( pausa de 4 minutos) hi(pausa de 8 minutos) hi(pausa de 16 minutos) etc.

A entrada deve ser fornecida no início do programa (STDIN, parâmetro da linha de comandos, parâmetro da função, etc.) e será uma sequência.

O atraso inicial não pode ser 0.


A saída precisa ser infinita ou pode parar após algum tempo?
Camarada SparklePony

1
@ComradeSparklePony ele deve saída, desde que ele pode (até a morte calor do universo, pane no computador, stackoverflow, falta de memória, etc)
programmer5000

@ComradeSparklePony apenas se for algo como stackoverflow, falta de memória, etc. Isso y=x=>(x&&alert(x),y())seria tecnicamente permitido, mas eu o rebaixaria.
Programmer5000 #

@ programmer5000 Obrigado, entendi.
Camarada SparklePony

Posso imprimir uma nova linha?
MD XF

Respostas:


12

05AB1E , 6 bytes

Código:

[=No.W

Explicação:

[        # Start an infinite loop
 =       # Print the top of the stack without popping
  No     # Compute 2 ** (iteration index)
    .W   # Wait that many milliseconds

Experimente online!


Se você começar aguardando 1 segundo, poderá usar em wvez de .W.
Riley

@Riley Eu não acho que isso funcionaria. wespera um segundo, não importa o quê, e faz .Wum e aguarda tantos milissegundos.
Camarada SparklePony

@ComradeSparklePony Você está certo. teria que ser Gw.
Riley

Não sei se isso reflete necessariamente algum problema no código, mas no momento em que executo o exemplo vinculado, o mecanismo me fornece: "Aviso: a solicitação excedeu o limite de 60 segundos e foi encerrada".
Doppelgreener

@doppelgreener Sim, o intérprete on-line pode não ser a melhor opção nesse caso. O offline funciona como um encanto.
Adnan


5

Python 3, 60 56 bytes

import time
def f(x,i=1):print(x);time.sleep(i);f(x,i*2)

Changelog:

  • mudou lambda recursiva para função recursiva (-4 bytes)

Você poderia salvar um byte na printdeclaração por mudar para Python 2 :)
numbermaniac

1
@numbermaniac Sim, mas então eu teria que mudar para Python 2.: P
L3viathan

5

MATL , 8 bytes

`GD@WY.T

A primeira pausa é de 2 segundos.

Experimente no MATL Online . Ou veja um versão modificada que exibe o tempo decorrido desde o início do programa. (Se o intérprete não funcionar, atualize a página e tente novamente).

Ou veja um gif:

insira a descrição da imagem aqui

Explicação

`     % Do...while
  G   %   Push input
  D   %   Display
  @   %   Push iteration index (1-based)
  W   %   2 raised to that
  Y.  %   Pause for that time
  T   %   Push true. This will be used as loop confition
      % End (implicit). The top of the stack is true, which produces an infinite loop 

@ programmer5000 Por curiosidade: o intérprete on-line funcionou para você?
Luis Mendo

Sim, porque?
Programmer5000 #

@ programmer5000 Obrigado. Só para verificar. Às vezes há problemas de tempo limite
Luis Mendo

5

Mathematica 34 32 30 29 Bytes

Solução original 34 bytes:

For[x=.1,1<2,Pause[x*=2];Print@#]&

Raspe 2 bytes com Do

x=1;Do[Pause[x*=2];Print@#,∞]&

Raspe mais um byte com a solução recursiva do @ MartinEnder

±n_:=#0[Print@n;Pause@#;2#]&@1

O @ngenisis usa a recursão ReplaceRepeated para remover outro byte

1//.n_:>(Print@#;Pause@n;2n)&

4
Trueé 1>0. Mas algo assim é um pouco mais curto:±n_:=#0[Print@n;Pause@#;2#]&@1
Martin Ender

Eu coloquei o 1<2antes de seu comentário. No entanto, sua solução recursiva salva um byte. Obrigado @MartinEnder
Kelly Lowder

±é um byte na codificação CP-1252 (codificação padrão do Windows).
JungHwan Min

3
Ainda mais curto:1//.n_:>(Print@#;Pause@n;2n)&
ngenisis

5

Oitava, 42 41 bytes

x=input('');p=1;while p*=2,pause(p),x,end

Salvo um byte graças a rahnema1, p*=2é menor que p=p*2.

Não acredito que não fui capaz de jogar isso, mas na verdade não foi tão fácil.

  • A entrada deve estar no início, portanto, é impossível evitar a primeira parte.
  • Preciso de um número dobrado e ele deve ser inicializado na frente do loop
    • Seria possível usar a entrada como condicional para o loop, mas então eu teria que ter p*=2outro lugar.
    • A pausa não tem um valor de retorno, caso contrário, poderia ter sido while pause(p*=2)

2
Um truque que aprendi com rahnema1: input(0)obras
Luis Mendo

1
@LuisMendo Infelizmente o truque não funciona na versão recente do oitava :(
rahnema1

4

Java (OpenJDK 8) , 113 bytes

interface M{static void main(String[]a)throws Exception{for(int i=1;;Thread.sleep(i*=2))System.out.print(a[0]);}}

Experimente online!

-60 bytes graças a Leaky Nun!


2
+1 em "Não use Java para jogar golfe. É uma má idéia." Você pode adicionar um link TIO?
Programmer5000 #

@ programmer5000 Claro, mas não funciona, porque o TIO aguarda a conclusão do código.
HyperNeutrino

2
Por que uma interface em vez de uma classe?
rightfold

2
@rightfold Uma interface permite-lhe omitir o publicno public static void main.
Freira vazando

1
@ColeJohnson os argumentos são obrigatórios.
Leaky Nun

4

R, 50 bytes 48

function(x,i=1)repeat{cat(x);Sys.sleep(i);i=i*2}

retorna uma função anônima que possui um argumento obrigatório, a sequência a ser impressa. Não imprime novas linhas, apenas cospe xna tela. ié um argumento opcional cujo padrão é 1, aguarda isegundos e dobra i.

-2 bytes graças a pajonk

Experimente online!


Por que não começar e i=1depois usar i=i*2no final e dormir apenas i?
Pajonk

é uma ótima ideia ... vou mudar isso.
Giuseppe

4

Ruby, 34 28 23 22 (+2 para -n) = 24 bytes

3 bytes salvos graças ao Value Ink!

1 byte salvo graças a daniero

loop{print;sleep$.*=2}

Começa em 2 , então 4etc.

Explicação

-n                       # read a line from STDIN
  loop{                } # while(true):
       print;            # print that line
             sleep$.*=2  # multiply $. by 2, then sleep that many seconds. 
                         # $. is a Ruby special variable that starts at 1.

Ele vai dormir um segundo antes de ler a entrada, mas pode introduzi-lo já
John Dvorak

Iniciando o programa de Ruby com a -nbandeira permite ignorar a inicial getschamada, porque a bandeira vai lidar com isso para você
Valor Ink

printsem um argumento é equivalente a puts$_- um byte salvo
daniero

4

Alice , 16 bytes

1/?!\v
T\io/>2*.

Experimente online! (Claro que não há muito para ver lá, mas você pode verificar com que frequência foi impresso em um minuto.)

Explicação

1    Push 1 to the stack. The initial pause duration in milliseconds.
/    Reflect to SE. Switch to Ordinal.
i    Read all input.
!    Store it on the tape.
/    Reflect to E. Switch to Cardinal.
>    Move east (does nothing but it's the entry of the main loop).
2*   Double the pause duration.
.    Duplicate it.
     The IP wraps around to the first column.
T    Sleep for that many milliseconds.
\    Reflect to NE. Switch to Ordinal.
?    Retrieve the input from the tape.
o    Print it.
\    Reflect to E. Switch to Cardinal.
v    Move south.
>    Move east. Run another iteration of the main loop.

4

R, 44 43 bytes

O riscado 44 ainda é regular 44;

Essa resposta já fornece uma solução decente, mas podemos economizar mais alguns bytes.

function(x)repeat{cat(x);Sys.sleep(T<-T*2)}

Função anônima, tendo praticamente qualquer coisa imprimível como argumento x. Começa em 2 segundos e dobra toda vez depois. Abusa o fato de que, Tpor padrão, é definido como o TRUEqual é avaliado 1.

Além disso, desde que esse comentário ainda receba uma luz verde do OP, podemos torná-lo ainda mais curto, mas não acho que esteja no espírito do desafio. Tempos de espera de 0 não são mais permitidos.

function(x)repeat cat(x)

2
olhe para você, abusando de pobres Tassim. na versão mais curta da resposta, você nem precisa de aparelho, apenas um espaço.
Giuseppe

1
Ei, se Tnão gostar, Tpode se defender. Além disso, agradável encontrar :)
JAD

3

Cubix , 30 bytes

/(?:u<q.;1A>?ou2$/r;w;q^_q.\*/

Experimente aqui

É mapeado para um cubo com comprimento lateral 3.

      / ( ?              # The top face does the delay.  It takes the stack element with the
      : u <              # delay value, duplicates and decrements it to 0.  When 0 is hit the
      q . ;              # IP moves into the sequence which doubles the delay value.
1 A > ? o u 2 $ / r ; w  # Initiates the stack with one and the input.  For input hi this
; q ^ _ q . \ * / . . .  # gives us 1, -1, 10, 105, 104.  There is a little loop that prints 
. . . . . . . . . . . .  # each item in the stack dropping it to the bottom until -1 is hit.
      . . .              # Then the delay sequence is started om the top face
      . . .
      . . .

oh wow esta parece ser uma linguagem pura
Skidsdev


3

PHP, 31 bytes

for(;;sleep(2**$i++))echo$argn;
for(;;sleep(1<<$i++))echo$argn;

dorme 1, 2, 4, 8, ... segundos. Executar como tubo comphp -nR '<code>'

Funcionará até a 63ª impressão (em uma máquina de 64 bits), depois disso não haverá mais espera.
A versão 1 gera avisos sleep() expects parameter 1 to be integer, float given, a
versão 2 gera um aviso sleep(): Number of seconds must be greater than or equal to 0.

Insira @antes sleeppara silenciar os avisos.



2

Python 3, 61 bytes

import time;i=1;x=input()
while 1:print(x);time.sleep(i);i*=2

Semelhante ao golfe do @ L3viathan, mas usa whileloop


2

CJam, 26 bytes

qKes{es1$-Y$<{W$o;2*es}|}h

Não funciona corretamente no TIO.

A primeira pausa é de 20 milissegundos.

Explicação

q                           e# Push the input.
 K                          e# Push 20 (the pause time).
  es                        e# Push the time (number of milliseconds since the Unix epoch).
    {                       e# Do:
     es1$-                  e#  Subtract the stored time from the current time.
          Y$<{              e#  If it's not less than the pause time:
              W$o           e#   Print the input.
                 ;2*es      e#   Delete the stored time, multiply the pause time by 2, push
                            e#     the new time.
                      }|    e#  (end if)
                        }h  e# While the top of stack (not popped) is truthy.
                            e#  (It always is since the time is a positive integer)

2

C, 51 bytes

main(c,v)char**v;{puts(v[1]);sleep(c);main(2*c,v);}

C, 35 bytes em função

c=1;f(n){puts(n);sleep(c*=2);f(n);}

Recebe entrada como um argumento de linha de comando.


2

Lote, 62 bytes

@set/at=%2+0,t+=t+!t
@echo %1
@timeout/t>nul %t%
@%0 %1 %t%

Acabou sendo um byte mais curto do que explicitamente dobrando tem um loop:

@set t=1
:g
@echo %1
@timeout/t>nul %t%
@set/at*=2
@goto g

2

Reticular , 12 bytes

1idp~dw2*~2j

Experimente online!

Explicação

1idp~dw2*~2j
1               push 1 (initial delay)
 i              take line of input
  d             duplicate it
   p            print it
    ~           swap
     d          duplicate it
      w         wait (in seconds)
       2*       double it
         ~      swap
          2j    skip next two characters
1i              (skipped)
  d             duplicate input
   p            print...
                etc.

2

C #, 80 bytes

s=>{for(int i=1;;System.Threading.Thread.Sleep(i*=2))System.Console.Write(s);};

Guardou um byte graças a @raznagul.


Você pode salvar 1 byte movendo a Writeinstrução para o corpo do loop.
raznagul

@raznagul Não sei como eu perdi essa, obrigado!
TheLethalCoder

2

Python 2, 54 bytes

Usa um cálculo demorado em vez de cronometrar bibliotecas.

def f(x,a=1):
 while 1:a*=2;exec'v=9**9**6;'*a;print x

Agora percebo que minha resposta é semelhante à sua. Eu não tinha lido sua resposta quando postei, mas se você quiser incorporar minha solução à sua, removerei minha resposta com prazer.
Tim

2

PowerShell, 35 33 30 29 bytes

Com uma dica útil de qualquer coisa e Joey

%{for($a=1){$_;sleep($a*=2)}}

Explicação

%{          # Foreach
for($a=1){  # empty for loop makes this infinite and sets $a
$_;         # prints current foreach item
sleep($a*=2)# Start-Sleep alias for $a seconds, reassign $a to itself times 2           
}}          # close while and foreach

Executado com:

"hi"|%{for($a=1){$_;sleep($a*=2)}}

1
você deve poder usar um vazio para em vez do tempo:% {$ a = 1; for () {$ _; sleep ($ a * = 2)}} ``
qualquer que seja

Obrigado! Eu tentei usar um loop for antes, mas eu coloquei for(;;). Nem sequer tentou remover o ponto e vírgula.
SomeShinyMonica #

1
Coloque o $a=1como a inicialização no forpara salvar outro byte ( for($a=1){...}). Além disso, não tenho certeza se deve contar %, pois a rotina atual que você está executando é apenas um bloco de script. (Meus desafios tendem a ser bastante rigoroso sobre a necessidade de um programa, evitando tais ponderações, mas para alguma coisa der perguntas que eu ainda não estou muito certo como contar várias maneiras de usar PowerShell.)
Joey

@ Joey, doce que funciona. Obrigado pela dica
SomeShinyMonica 11/17/17

2

Python 3, 49 bytes

b=input();x=6**6
while 1:print(b);exec("x+=1;"*x)

Usa o pequeno atraso da +=operação e a executa xvezes. xdobra adicionando uma a si mesma quantas vezes o valor de x.

Começa em 6^6(46656) para manter a variação máxima de 5% no atraso.


Inteligente, mas isso é um porco da memória.
Eush77 13/05

@ eush77 sim, no meu tablet terminou após apenas 7 iterações do loop! Espero que dure mais um pouco na minha área de trabalho.
Tim

1

Perl 6 , 39 bytes

print(once slurp),.&sleep for 1,2,4...* 

Experimente (print substituído para adicionar informações de tempo)

Expandido:

  print(        # print to $*OUT
    once slurp  # slurp from $*IN, but only once
  ), 
  .&sleep       # then call sleep as if it was a method on $_

for             # do that for (sets $_ to each of the following)

  1, 2, 4 ... * # deductive sequence generator

1

JS (ES6), 44 42 40 38 36 bytes

Riscado 44 ainda é 44

i=1,y=x=>setTimeout(y,i*=2,alert(x))

Não gosta de bombas de alerta?

i=1,y=x=>setTimeout(y,i*=2,console.log(x))

Tecnicamente correto, mas abusando de brechas:

y=x=>(x&&alert(x),y())

-3 bytes graças a Cyoce, -2 graças a Business Cat, -2 graças a Neil


2
Eu não parecem ser capazes de testar isso corretamente, mas você provavelmente poderia fazer i=1,y=x=>(alert(x),setTimeout(y,i*=2))para salvar um casal bytes
Cat Negócios

1
Fui em frente e editei uma mensagem de crédito para Cyoce; se você quiser alterá-lo, sinta-se à vontade para editar / reverter.
HyperNeutrino

1
Que tal i=1,y=x=>setTimeout(y,i*=2,console.log(x))?
819 Neil

1

Lisp comum, 49 bytes

(do((a(read))(i 1(* 2 i)))(())(print a)(sleep i))

o primeiro atraso deve ser o 1segundo.


1
Você tem 321 representantes!
Programmer5000 #

@ programmer5000 você tem 3683 representantes!
Cyoce

1

Pitão, 7 bytes

#|.d~yT

Explicação:

#           Infinitely loop
  .d         Delay for 
      T      10 seconds
    ~y       and double T each time
 |           print input every iteration, too

1

TI-BASIC, 36 bytes

O período de espera inicial é de 1 segundo.

1→L
Input Str1
checkTmr(0→T
While 1
While L>checkTmr(T
End
Disp Str1
2L→L
End

1

Raquete, 51 bytes

(λ(s)(do([n 1(* n 2)])(#f)(displayln s)(sleep n)))

Exemplo

➜  ~  racket -e '((λ(s)(do([n 1(* n 2)])(#f)(displayln s)(sleep n)))"Hello")'
Hello
Hello
Hello
Hello
Hello
^Cuser break
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.