Tạm dừng dài gấp đôi


15

Thử thách của bạn là in đầu vào, đợi bất kỳ khoảng thời gian nào, in đầu vào, đợi gấp đôi thời gian bạn chờ ban đầu, in lại đầu vào, v.v. Độ trễ ban đầu phải dưới 1 giờ và bạn phải có độ chính xác +/- 5% trong các lần trì hoãn tiếp theo. Ngoài ra, không có hạn chế về thời gian trì hoãn.

Thí dụ:

Đầu vào : hi.

Đầu ra: hi(tạm dừng 1ms) hi(tạm dừng 2ms) hi(tạm dừng 4ms) hi(tạm dừng 8ms) hi(tạm dừng 16ms), v.v.

Cũng được phép:

hi(Tạm dừng 1 phút) hi( tạm dừng 2 phút) hi(tạm dừng 4 phút) hi(tạm dừng 8 phút) hi(tạm dừng 16 phút), v.v.

Đầu vào phải được cung cấp khi bắt đầu chương trình (STDIN, tham số dòng lệnh, hàm param, v.v.) và sẽ là một chuỗi.

Độ trễ ban đầu không thể là 0.


Là đầu ra cần phải là vô hạn, hoặc nó có thể dừng lại sau một khoảng thời gian?
Đồng chí SparklePony

1
@ComradeSparklePony nó phải xuất ra miễn là có thể (cho đến khi cái chết của vũ trụ, sự cố máy tính, dòng chảy chồng chất, hết bộ nhớ, v.v.)
lập trình

@ComradeSparklePony chỉ khi nó là một cái gì đó như stackoverflow, hết bộ nhớ, v.v. Điều này y=x=>(x&&alert(x),y())sẽ được cho phép về mặt kỹ thuật , nhưng tôi sẽ đánh giá thấp nó.
lập trình

@ lập trình5000 Cảm ơn, hiểu rồi
Đồng chí SparklePony

Tôi có thể in một dòng mới không?
MD XF

Câu trả lời:


12

05AB1E , 6 byte

Mã số:

[=No.W

Giải trình:

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

Hãy thử trực tuyến!


Nếu bạn bắt đầu bằng cách đợi 1 giây, bạn có thể sử dụng wthay vì .W.
Riley

@Riley Tôi không nghĩ rằng nó sẽ làm việc. wchờ đợi một giây không có vấn đề gì, và .Wbật lên và chờ đợi nhiều mili giây.
Đồng chí SparklePony

@ComradeSparklePony Bạn nói đúng. nó sẽ phải được Gw.
Riley

Tôi không biết liệu nó có nhất thiết phản ánh bất kỳ vấn đề nào trong mã hay không, nhưng ngay khi tôi chạy ví dụ được liên kết, công cụ sẽ cho tôi: "Cảnh báo: Yêu cầu vượt quá giới hạn thời gian 60 giây và đã bị chấm dứt."
doppelgreener

@doppelgreener Vâng, trình thông dịch trực tuyến có thể không phải là lựa chọn tốt nhất trong trường hợp này. Ngoại tuyến hoạt động như một sự quyến rũ mặc dù.
Ad Nam

15

Cào, 8 khối + 3 byte

đặt [n] thành [1];  mãi mãi {nói [x];  chờ (n) giây;  đặt [n] thành ((n) * (2))}

Tương đương trong Python:

import time
n = 1
while 1:
    print("x")
    time.sleep(n)
    n = n * 2

1
tại sao "+ 3 byte"?
Cole Johnson

2
9 khối (ví dụ: Mãi mãi, n) + 3 byte (ví dụ 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)

Thay đổi:

  • đã thay đổi lambda đệ quy thành hàm đệ quy (-4 byte)

Bạn có thể lưu một byte trên printcâu lệnh bằng cách chuyển sang Python 2 :)
numbermaniac

1
@numbermaniac Có, nhưng sau đó tôi phải chuyển sang Python 2 .: P
L3viathan

5

MATL , 8 byte

`GD@WY.T

Tạm dừng đầu tiên là 2 giây.

Hãy thử nó tại MATL Online . Hoặc xem phiên bản sửa đổi hiển thị thời gian đã trôi qua kể từ khi chương trình bắt đầu. (Nếu trình thông dịch không hoạt động, vui lòng làm mới trang và thử lại).

Hoặc xem một gif:

enter image description here

Giải trình

`     % 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 

@ lập trình viên5000 Vì tò mò: trình thông dịch trực tuyến có làm việc cho bạn không?
Luis Mendo

Vâng, nó đã làm, tại sao?
lập trình

@ lập trình5000 Cảm ơn. Chỉ để kiểm tra. Đôi khi có vấn đề thời gian chờ
Luis Mendo

5

Toán học 34 32 30 29 Byte

Giải pháp ban đầu 34 byte:

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

Cạo sạch 2 byte bằng Do

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

Tắt thêm một Byte bằng giải pháp đệ quy của @ MartinEnder

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

@ngenisis sử dụng đệ quy REPRepeat để cạo một byte khác

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

4
True1>0. Nhưng một cái gì đó như thế này ngắn hơn một chút:±n_:=#0[Print@n;Pause@#;2#]&@1
Martin Ender

Tôi đặt 1<2trước bình luận của bạn. Tuy nhiên, giải pháp đệ quy của bạn không lưu một byte. Cảm ơn @MartinEnder
Kelly Lowder

±là một byte trong mã hóa CP-1252 (mã hóa Windows mặc định).
JungHwan tối

3
Thậm chí ngắn hơn:1//.n_:>(Print@#;Pause@n;2n)&
ngenisis

5

Octave, 42 41 byte

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

Đã lưu một byte nhờ rahnema1, p*=2ngắn hơn p=p*2.

Tôi không thể tin rằng tôi đã không thể đánh gôn này, nhưng thực ra nó không dễ như vậy.

  • Đầu vào phải được bắt đầu, vì vậy phần đầu tiên là không thể tránh được.
  • Tôi cần một số được nhân đôi và nó phải được khởi tạo trước vòng lặp
    • Có thể sử dụng đầu vào như một điều kiện cho vòng lặp, nhưng sau đó tôi sẽ phải có p*=2 một nơi khác.
    • Tạm dừng không có giá trị trả về, nếu không nó có thể đã được while pause(p*=2)

2
Một mẹo tôi học được từ rahnema1: input(0)hoạt động
Luis Mendo

1
@LuisMendo Thật không may, mẹo này không hoạt động trong phiên bản gần đây của octave :(
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]);}}

Hãy thử trực tuyến!

-60 byte nhờ Leaky Nun!


2
+1 cho "Không sử dụng Java để chơi gôn. Đó là một ý tưởng tồi." Bạn có thể thêm một liên kết TIO?
lập trình

@ lập trình viên5000 Chắc chắn, nhưng nó không hoạt động, vì TIO chờ mã hoàn tất.
HyperNeutrino

2
Tại sao một giao diện thay vì một lớp?
đúng vào

2
@rightprint Một giao diện cho phép bạn bỏ qua phần publictrong public static void main.
Leaky Nun

1
@ColeJohnson các đối số được yêu cầu.
Leaky Nun

4

R, 50 48 byte

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

trả về một hàm ẩn danh có một đối số bắt buộc, chuỗi cần in. In không có dòng mới, chỉ nhổ xra trên màn hình. ilà một đối số tùy chọn mặc định 1, chờ trong igiây và tăng gấp đôii .

-2 byte nhờ vào pyjama

Hãy thử trực tuyến!


Tại sao không bắt đầu i=1sau đó sử dụng i=i*2vào cuối và ngủ chỉ i?
pyjama

đó là một ý tưởng tuyệt vời ... tôi sẽ thay đổi điều đó
Giuseppe

4

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

3 byte được lưu nhờ vào Ink Ink!

Lưu 1 byte nhờ daniero

loop{print;sleep$.*=2}

Bắt đầu 2, sau đó 4, vv

Giải trình

-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.

Nó sẽ ngủ một giây trước khi đọc thông tin đầu vào, nhưng bạn có thể nhập nó rồi
John Dvorak

Bắt đầu chương trình Ruby với -ncờ cho phép bạn bỏ qua getscuộc gọi ban đầu , vì cờ sẽ xử lý nó cho bạn
Value Ink

printkhông có đối số tương đương với puts$_- một byte được lưu
daniero

4

Alice , 16 byte

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

Hãy thử trực tuyến! (Tất nhiên không có nhiều để xem ở đó, nhưng bạn có thể kiểm tra tần suất được in trong vòng một phút.)

Giải trình

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

Vượt qua 44 vẫn là 44 thường xuyên (

Câu trả lời này đã cung cấp một giải pháp hợp lý, nhưng chúng ta có thể tiết kiệm thêm một số byte.

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

Hàm ẩn danh thực tế lấy bất cứ thứ gì có thể in thành đối số x. Bắt đầu lúc 2 giây và tăng gấp đôi mỗi lần sau đó. Lạm dụng thực tế Ttheo mặc định được xác định là TRUEđánh giá1 .

Ngoài ra, miễn là nhận xét này vẫn bật đèn xanh từ OP, chúng ta có thể làm cho nó ngắn hơn nữa, nhưng tôi không nghĩ rằng đó là tinh thần của thách thức. Thời gian chờ là 0 không được phép nữa.

function(x)repeat cat(x)

2
look at you, abusing poor T like that. in the shorter version of the answer, you don't even need braces, just a space.
Giuseppe

1
Hey, if T doesn't like it, T can stand up for itself. Also, nice find :)
JAD

3

Cubix, 30 bytes

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

Try it here

This maps onto a cube with side length 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 this looks like a neat language
Skidsdev


3

PHP, 31 bytes

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

sleeps 1, 2, 4, 8, ... seconds. Run as pipe with php -nR '<code>'

Will work until the 63rd print (on a 64 bit machine), after that there will be no more waiting.
Version 1 will yield warnings sleep() expects parameter 1 to be integer, float given,
Version 2 will yield one warning sleep(): Number of seconds must be greater than or equal to 0.

Insert @ before sleep to mute the warnings.



2

Python 3, 61 bytes

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

Similar to @L3viathan's golf, but uses while loop


2

CJam, 26 bytes

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

Doesn't work properly on TIO.

The first pause is 20 milliseconds.

Explanation

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 as a function

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

Takes input as a command line argument.


2

Batch, 62 bytes

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

This turned out to be a byte shorter than explicitly doubling t in a loop:

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

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.

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.


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

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

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.


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

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


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.


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

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

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.