Jeda dua kali lebih lama

15

Tantangan Anda adalah mencetak input, menunggu sejumlah waktu, mencetak input, menunggu dua kali lipat waktu Anda menunggu, mencetak lagi input, dan sebagainya. Penundaan awal harus kurang dari 1 jam, dan Anda harus memiliki keakuratan +/- 5% pada penundaan berikutnya. Selain itu, tidak ada batasan waktu tunda.

Contoh:

Input: hi.

Output: hi(jeda 1ms) hi(jeda 2ms) hi(jeda 4ms) hi(jeda 8ms) hi(jeda 16ms), dll.

Juga diizinkan:

hi(Jeda 1 menit) hi( jeda 2 menit) hi(jeda 4 menit) hi(jeda 8 menit) hi(jeda 16 menit), dll.

Input harus disediakan di awal program (STDIN, parameter baris perintah, parameter fungsi, dll.) Dan akan berupa string.

Penundaan awal tidak boleh 0.

programmer5000
sumber
Apakah output perlu tak terbatas, atau bisakah itu berhenti setelah beberapa waktu?
Kamerad SparklePony
1
@ComradeSparklePony itu harus menampilkan selama itu bisa (sampai panasnya kematian alam semesta, crash komputer, stackoverflow, kehabisan memori, dll)
programmer5000
@ComradeSparklePony hanya jika itu adalah sesuatu seperti stackoverflow, kehabisan memori, dll. Ini y=x=>(x&&alert(x),y())secara teknis akan diizinkan, tetapi saya akan menurunkannya.
programmer5000
@ programmer5000 Terima kasih, mengerti.
Kamerad SparklePony
Bisakah saya mencetak baris baru?
MD XF

Jawaban:

12

05AB1E , 6 byte

Kode:

[=No.W

Penjelasan:

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

Cobalah online!

Adnan
sumber
Jika Anda memulai dengan menunggu 1 detik, Anda dapat menggunakannya wsebagai gantinya .W.
Riley
@Riley Saya tidak berpikir itu akan berhasil. wmenunggu satu detik tidak peduli apa pun, dan .Wmuncul a dan menunggu banyak milidetik.
Kamerad SparklePony
@ComradeSparklePony Anda benar. itu harus Gw.
Riley
Saya tidak tahu apakah itu mencerminkan masalah dalam kode, tetapi saat saya menjalankan contoh terkait, mesin memberi saya: "Peringatan: Permintaan melebihi batas waktu 60 detik dan telah dihentikan."
doppelgreener
@doppelgreener Ya, juru bahasa online mungkin bukan pilihan terbaik dalam kasus ini. Offline bekerja seperti pesona.
Adnan
15

Gores, 8 blok + 3 byte

atur [n] ke [1];  selamanya {katakan [x];  tunggu (n) dtk;  atur [n] ke ((n) * (2))}

Setara dengan Python:

import time
n = 1
while 1:
    print("x")
    time.sleep(n)
    n = n * 2
OldBunny2800
sumber
1
mengapa "+ 3 byte"?
Cole Johnson
2
9 blok (mis. Selamanya, n) + 3 byte (mis. X, 2)
OldBunny2800
5

Python 3, 60 56 byte

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

Changelog:

  • mengubah lambda rekursif ke fungsi rekursif (-4 byte)
L3viathan
sumber
Anda dapat menyimpan byte pada printpernyataan dengan beralih ke Python 2 :)
numbermaniac
1
@numbermaniac Ya, tapi kemudian saya harus beralih ke Python 2.: P
L3viathan
5

MATL , 8 byte

`[email protected]

Jeda pertama adalah 2 detik.

Cobalah di MATL Online . Atau lihat versi modifikasi yang menampilkan waktu yang berlalu sejak program dimulai. (Jika penerjemah tidak berfungsi, segarkan laman dan coba lagi).

Atau lihat gif:

masukkan deskripsi gambar di sini

Penjelasan

`     % 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 
Luis Mendo
sumber
@ programmer5000 Karena penasaran: apakah penerjemah online bekerja untuk Anda?
Luis Mendo
Ya, memang, mengapa?
programmer5000
@ programmer5000 Terima kasih. Hanya untuk memeriksanya. Terkadang ada masalah batas waktu
Luis Mendo
5

Mathematica 34 32 30 29 Bytes

Solusi asli 34 Bytes:

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

Shave off 2 bytes dengan Do

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

Cukur satu Byte lagi dengan solusi rekursif @ MartinEnder

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

@ngenisis menggunakan rekursi ReplaceRepeat untuk memotong byte lain

1//.n_:>(Print@#;Pause@n;2n)&
Kelly Lowder
sumber
4
Trueadalah 1>0. Tetapi sesuatu seperti ini sedikit lebih pendek:±n_:=#0[Print@n;Pause@#;2#]&@1
Martin Ender
Saya menempatkan 1<2sebelum komentar Anda. Namun, solusi rekursif Anda memang menghemat satu byte. Terima kasih @MartinEnder
Kelly Lowder
±adalah satu byte dalam pengkodean CP-1252 (pengodean Windows standar).
JungHwan Min
3
Bahkan lebih pendek:1//.n_:>(Print@#;Pause@n;2n)&
ngenisis
5

Oktaf, 42 41 byte

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

Disimpan satu byte berkat rahnema1, p*=2lebih pendek dari p=p*2.

Saya tidak percaya saya belum bisa bermain golf ini, tapi sebenarnya itu tidak mudah.

  • Masukan harus di awal, jadi bagian pertama tidak mungkin untuk dihindari.
  • Saya perlu nomor yang menjadi dua kali lipat, dan itu harus diinisialisasi di depan loop
    • Mungkin saja untuk menggunakan input sebagai persyaratan untuk loop, tetapi kemudian saya harus memiliki p*=2tempat lain.
    • Jeda tidak memiliki nilai balik, jika tidak bisa while pause(p*=2)
Stewie Griffin
sumber
2
Trik yang saya pelajari dari rahnema1: input(0)works
Luis Mendo
1
@LuisMendo Sayangnya trik ini tidak berfungsi dalam versi oktaf terbaru :(
rahnema1
4

Java (OpenJDK 8) , 113 byte

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

Cobalah online!

-60 bytes berkat Leaky Nun!

HyperNeutrino
sumber
2
+1 untuk "Jangan gunakan Java untuk bermain golf. Itu ide yang buruk." Bisakah Anda menambahkan tautan TIO?
programmer5000
@ programmer5000 Tentu, tetapi tidak berhasil, karena TIO menunggu kode selesai.
HyperNeutrino
2
Mengapa antarmuka bukan kelas?
sayap kanan
2
@ rightfold Antarmuka memungkinkan Anda untuk menghilangkan publicin public static void main.
Leaky Nun
1
@ColeJohnson argumen diperlukan.
Leaky Nun
4

R, 50 48 byte

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

mengembalikan fungsi anonim yang memiliki satu argumen wajib, string untuk dicetak. Tidak mencetak baris baru, hanya dimuntahkan xdi layar. iadalah argumen opsional yang defaultnya 1, menunggu idetik dan ganda i.

-2 byte berkat pajonk

Cobalah online!

Giuseppe
sumber
Mengapa tidak mulai saat i=1itu gunakan i=i*2di akhir dan tidur saja i?
pajonk
itu ide yang bagus ... saya akan mengubahnya.
Giuseppe
4

Ruby, 34 28 23 22 (+2 untuk -n) = 24 byte

3 byte disimpan berkat Value Ink!

1 byte disimpan berkat daniero

loop{print;sleep$.*=2}

Mulai dari 2, lalu 4, dll.

Penjelasan

-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.
Cyoce
sumber
Ini akan tidur satu detik sebelum membaca input, tetapi Anda sudah dapat memasukkannya
John Dvorak
Memulai program Ruby dengan -nflag memungkinkan Anda melewati getspanggilan awal , karena flag akan menanganinya untuk Anda
Value Ink
printtanpa argumen setara dengan puts$_- satu byte disimpan
daniero
4

Alice , 16 byte

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

Cobalah online! (Tidak banyak melihat di sana tentu saja, tetapi Anda dapat memeriksa seberapa sering itu dicetak dalam satu menit.)

Penjelasan

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.
Martin Ender
sumber
4

R, 44 43 byte

Dicoret 44 masih teratur 44; (

Jawaban ini sudah memberikan solusi yang layak, tetapi kita dapat menghemat lebih banyak byte.

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

Fungsi anonim praktis mengambil apa pun yang dapat dicetak sebagai argumen x. Mulai 2 detik dan dua kali lipat setiap kali sesudahnya. Menyalahgunakan fakta yang Tsecara default didefinisikan sebagai TRUEyang dievaluasi 1.

Juga, selama komentar ini masih mendapat lampu hijau dari OP, kita bisa membuatnya lebih pendek, tapi saya pikir itu bukan semangat tantangan. Waktu tunggu 0 tidak diizinkan lagi.

function(x)repeat cat(x)
JAD
sumber
2
lihat dirimu, menyalahgunakan orang miskin Tseperti itu. dalam versi jawaban yang lebih pendek, Anda bahkan tidak perlu kawat gigi, hanya sebuah spasi.
Giuseppe
1
Hei, jika Ttidak suka, Tbisa berdiri sendiri. Juga, nice find :)
JAD
3

Cubix , 30 byte

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

Coba di sini

Ini memetakan ke sebuah kubus dengan panjang sisi 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
      . . .
      . . .
MickyT
sumber
oh wow ini sepertinya bahasa yang rapi
Skidsdev
3

Bash , 37 byte

for((t=1;;t*=2)){ sleep $t;echo $1;};

Untuk beberapa alasan TIO tidak akan menampilkan output sampai Anda menghentikan eksekusi program.

Cobalah online!

Maxim Mikhaylov
sumber
Ya, itu hanya mengembalikan output setelah selesai.
Jonathan Allan
3

PHP, 31 byte

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

tidur 1, 2, 4, 8, ... detik. Jalankan sebagai pipa denganphp -nR '<code>'

Akan bekerja hingga cetakan ke-63 (pada mesin 64 bit), setelah itu tidak akan ada lagi menunggu.
Versi 1 akan menghasilkan peringatan sleep() expects parameter 1 to be integer, float given,
Versi 2 akan menghasilkan satu peringatan sleep(): Number of seconds must be greater than or equal to 0.

Masukkan @sebelum sleepuntuk membisukan peringatan.

Titus
sumber
3

TI-Basic, 21 byte

Prompt Str0
1
While 1
Disp Str0
Wait Ans
2Ans
End
pizzapants184
sumber
2

Python 3, 61 byte

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

Mirip dengan golf @ L3viathan, tetapi menggunakan whileloop

Wondercricket
sumber
2

CJam, 26 byte

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

Tidak berfungsi dengan baik di TIO.

Jeda pertama adalah 20 milidetik.

Penjelasan

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)
Kucing Bisnis
sumber
2

C, 51 byte

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

C, 35 byte sebagai fungsi

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

Mengambil input sebagai argumen baris perintah.

Cleblanc
sumber
2

Batch, 62 byte

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

Ini ternyata lebih pendek dari byte yang secara eksplisit digandakan tdalam satu lingkaran:

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

Reticular, 12 bytes

1idp~dw2*~2j

Try it online!

Explanation

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.
Conor O'Brien
sumber
2

C#, 80 79 bytes

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

Saved one byte thanks to @raznagul.

TheLethalCoder
sumber
You can save 1 byte by moving the Write statement to the body of the loop.
raznagul
@raznagul Don't know how I missed that one, thanks!
TheLethalCoder
2

Python 2, 54 bytes

Uses a lengthy calculation instead of timing libraries.

def f(x,a=1):
 while 1:a*=2;exec'v=9**9**6;'*a;print x
Skyler
sumber
I now notice that my answer is similar to yours. I had not read your answer when I posted, but if you would like to incorporate my solution into yours I'll happily remove my answer.
Tim
2

PowerShell, 35 33 30 29 Bytes

With a helpful hint from whatever and Joey

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

Explanation

%{          # 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

Executed with:

"hi"|%{for($a=1){$_;sleep($a*=2)}}
SomeShinyMonica
sumber
1
you should be able to use an empty for instead of the while: %{$a=1;for(){$_;sleep($a*=2)}}``
whatever
Thanks! I had tried using a for loop before but I put for(;;). Didn't even try to remove the semi-colons.
SomeShinyMonica
1
Put the $a=1 as the initialization into the for to save another byte (for($a=1){...}). Also, I'm not sure whether to count the %, as the actual routine you're running is just a script block. (My challenges tend to be rather strict about requiring a program, sidestepping such ponderings, but for anything goes questions I'm still not quite sure how to count various ways of using PowerShell.)
Joey
@Joey, sweet that does work. Thanks for the tip
SomeShinyMonica
2

Python 3, 49 bytes

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

Uses the slight delay of the += operation and executes it x times. x doubles by adding one to itself as many times as the value of x.

It starts at 6^6 (46656) to stick to the maximum of 5% variation in the delay.

Tim
sumber
Clever, but this is a memory hog.
eush77
@eush77 yes, on my tablet it terminated after just 7 iterations of the loop! I expect it would last a few longer on my desktop.
Tim
1

Perl 6, 39 bytes

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

Try it (print overridden to add timing information)

Expanded:

  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
Brad Gilbert b2gills
sumber
1

JS (ES6), 44 42 40 38 36 bytes

Crossed out 44 is still 44

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

Don't like alert bombs?

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

Technically correct, but loophole-abusing:

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

-3 bytes thanks to Cyoce, -2 thanks to Business Cat, -2 thanks to Neil

programmer5000
sumber
2
I don't seem to be able to test this properly, but you could probably do i=1,y=x=>(alert(x),setTimeout(y,i*=2)) to save a couple bytes
Business Cat
1
I went ahead and edited in a credit message for Cyoce; if you want to change it, feel free to edit/rollback.
HyperNeutrino
1
How about i=1,y=x=>setTimeout(y,i*=2,console.log(x))?
Neil
1

Common Lisp, 49 bytes

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

first delay should be 1 second.


sumber
1
You have 321 rep!
programmer5000
@programmer5000 you have 3683 rep!
Cyoce
1

Pyth, 7 bytes

#|.d~yT

Explanation:

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

TI-BASIC, 36 bytes

Initial wait period is 1 second.

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

Racket, 51 bytes

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

Example

➜  ~  racket -e '((λ(s)(do([n 1(* n 2)])(#f)(displayln s)(sleep n)))"Hello")'
Hello
Hello
Hello
Hello
Hello
^Cuser break
Winny
sumber