Пауза вдвічі довша


15

Ваше завдання полягає в тому, щоб надрукувати введення, почекати будь-яку кількість часу, надрукувати введення, почекати вдвічі час, який ви спочатку чекали, знову надрукувати вхід тощо. Початкова затримка повинна бути менше 1 години, і ви повинні мати точність +/- 5% у наступних затримках. Крім цього, обмеження часу затримки не існує.

Приклад:

Вхід: hi.

Вихід: hi(пауза 1 мс) hi(пауза 2 мс) hi(пауза 4 мс) (пауза hi8 мс) hi(пауза 16 мс) тощо.

Також дозволено:

hi(1 хвилинна пауза) hi(2 хвилинна пауза) hi(4 хвилинна пауза) hi(8 хвилинна пауза) hi(16 хвилинна пауза) тощо.

Вхід повинен бути наданий на початку програми (STDIN, параметр командного рядка, параметр функції тощо) і буде рядком.

Початкова затримка не може бути 0.


Чи потрібно вихід нескінченний, чи він може зупинитися через деякий час?
Товариш SparklePony

1
@ComradeSparklePony він повинен виводити до тих пір, поки це можливо (до теплової загибелі Всесвіту, аварії комп'ютера, потоку потоку, з пам'яті тощо)
програміст5000

@ComradeSparklePony лише в тому випадку, якщо це щось на зразок stackoverflow, поза пам'яттю і т. Д. Це y=x=>(x&&alert(x),y())буде технічно дозволено, але я б це спростував.
програміст5000

@ programmer5000 Спасибі, зрозумів.
Товариш SparklePony

Чи можна надрукувати новий рядок?
MD XF

Відповіді:


12

05AB1E , 6 байт

Код:

[=No.W

Пояснення:

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

Спробуйте в Інтернеті!


Якщо ви почнете, чекаючи 1 секунди, ви можете використовувати wзамість .W.
Райлі

@ Райлі, я не думаю, що це спрацює. wчекає секунди, незважаючи ні на що, і .Wвискакує і чекає стільки мілісекунд.
Товариш SparklePony

@ComradeSparklePony Ви маєте рацію. це мало б бути Gw.
Райлі

Я не знаю, чи це обов'язково відображає будь-яку проблему в коді, але в момент, коли я запускаю зв'язаний приклад, двигун дає мені: "Попередження: Запит перевищив 60-секундний обмеження і було припинено".
doppelgreener

@doppelgreener Так, інтернет-перекладач може бути не найкращим варіантом у цьому випадку. Офлайн працює, як принадність.
Аднан

15

Скретч, 8 блоків + 3 байти

set [n] to [1]; forever { say [x]; wait (n) secs; set [n] to ((n) * (2)) }

Еквівалент у Python:

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

1
чому "+ 3 байти"?
Коул Джонсон

2
9 блоків (наприклад, назавжди, n) + 3 байти (наприклад, x, 2)
OldBunny2800

5

Python 3, 60 56 байт

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

Журнал змін:

  • змінена рекурсивна лямбда на рекурсивну функцію (-4 байти)

Ви можете зберегти байт на printоператорі, перейшовши на Python 2 :)
numbermaniac

1
@numbermaniac Так, але тоді мені доведеться перейти на Python 2.: P
L3viathan

5

MATL , 8 байт

`GD@WY.T

Перша пауза - 2 секунди.

Спробуйте в MATL Online . Або переглянути модифіковану версію, яка відображає час, що минув з моменту запуску програми. (Якщо перекладач не працює, оновіть сторінку та повторіть спробу).

Або побачити gif:

enter image description here

Пояснення

`     % 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 З цікавості: чи працював для вас онлайн-перекладач?
Луїс Мендо

Так, так, чому?
програміст5000

@ programmer5000 Дякую Просто для перевірки. Іноді виникають проблеми з тайм-аутом
Луїс Мендо

5

Mathematica 34 32 30 29 Байт

Оригінальне рішення 34 байт:

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

Поголіть 2 байти за допомогою Do

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

Поголіть ще один байт за допомогою рекурсивного рішення @ MartinEnder

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

@ngenisis використовує ReplaceRepeated рекурсію для гоління іншого байта

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

4
Trueє 1>0. Але щось подібне трохи коротше:±n_:=#0[Print@n;Pause@#;2#]&@1
Мартін Ендер

Я ставлю 1<2до вашого коментаря. Однак ваше рекурсивне рішення дійсно зберігає байт. Дякую @MartinEnder
Келлі

±є одним байтом у кодуванні CP-1252 (кодування Windows за замовчуванням).
JungHwan Min

3
Ще коротше:1//.n_:>(Print@#;Pause@n;2n)&
ngenisis

5

Октава, 42 41 байт

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

Збережений один байт завдяки rahnema1, p*=2коротший, ніжp=p*2 .

Я не можу повірити, що я не зміг покататися на цьому, але насправді це було не так просто.

  • Вхід повинен бути на початку, тому першу частину уникнути неможливо.
  • Мені потрібно число, яке подвоюється, і воно повинно бути ініціалізовано перед циклом
    • Можна було б використовувати вхід як умовний цикл, але тоді мені доведеться мати p*=2десь ще.
    • Пауза не має значення повернення, інакше це могло бути while pause(p*=2)

2
Трюк, який я навчився з rahnema1: input(0)працює
Луїс Мендо

1
@LuisMendo На жаль, трюк не працює в останній версії октави :(
rahnema1

4

Java (OpenJDK 8) , 113 байт

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

Спробуйте в Інтернеті!

-60 байт завдяки Leaky Nun!


2
+1 для "Не використовуйте Java для гри в гольф. Це погана ідея." Чи можете ви додати посилання TIO?
програміст5000

@ programmer5000 Звичайно, але це не працює, оскільки TIO чекає закінчення коду.
HyperNeutrino

2
Чому інтерфейс замість класу?
праворуч

2
@rightfold інтерфейс дозволяє опустити publicв public static void main.
Лина монашка

1
@ColeJohnson аргументи потрібні.
Лина монашка

4

R, 50 48 байт

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

повертає анонімну функцію, яка має один обов'язковий аргумент, рядок для друку. Не друкує нових рядків, просто виплескує xна екран. i- необов'язковий аргумент, який за замовчуванням 1, чекає iсекунд і подвоюється i.

-2 байти завдяки pajonk

Спробуйте в Інтернеті!


Чому б не почати i=1потім використовувати i=i*2в кінці і просто спати i?
pajonk

це чудова ідея ... я це зміню.
Джузеппе

4

Рубі, 34 28 23 22 (+2 за -n) = 24 байти

3 байти збережено завдяки Value Ink!

1 байт збережено завдяки daniero

loop{print;sleep$.*=2}

Починається з 2, потім 4і т.д.

Пояснення

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

Він спатиме одну секунду, перш ніж прочитати вхід, але ви можете вже ввести його
Джон Дворак

Якщо запустити програму Ruby з -nпрапором, ви можете пропустити початковий getsдзвінок, тому що прапор обробляє це за вас
Value Ink

printбез аргументу рівнозначно puts$_- один байт збережений
daniero

4

Аліса , 16 байт

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

Спробуйте в Інтернеті! (Звичайно, тут не так багато, але ви можете перевірити, наскільки часто це було надруковано протягом однієї хвилини.)

Пояснення

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 байт

Закреслений 44 все ще є регулярним 44; (

Ця відповідь вже забезпечує гідне рішення, але ми можемо зберегти ще кілька байт.

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

Анонімна функція, беручи за аргумент практично все, що можна роздрукувати x. Починається за 2 секунди і подвоюється кожен раз після цього. Зловживає тим фактом, який Tза замовчуванням визначається так, як TRUEоцінюється 1.

Крім того, поки цей коментар все ще отримає зелене світло від ОП, ми можемо зробити його ще коротшим, але я не думаю, що це в дусі виклику. Часи очікування 0 більше заборонені.

function(x)repeat cat(x)

2
дивись на тебе, зловживаючи таким бідним T. у коротшій версії відповіді вам навіть не потрібні дужки, просто пробіл.
Джузеппе

1
Гей, якщо Tце не сподобається, Tможна постояти за себе. Також приємна знахідка :)
JAD

3

Cubix , 30 байт

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

Спробуйте тут

Це відображається на кубі довжиною сторони 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
      . . .
      . . .

о, уау, це схоже на акуратну мову
Скідсдев


3

PHP, 31 байт

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

спить 1, 2, 4, 8, ... секунди. Запустити як трубаphp -nR '<code>'

Працюватиме до 63-го друку (на 64-бітній машині), після цього більше не буде очікування.
Версія 1 видасть попередження sleep() expects parameter 1 to be integer, float given,
версія 2 видасть одне попередження sleep(): Number of seconds must be greater than or equal to 0.

Вставте @перед тим, sleepщоб вимкнути попередження.




2

CJam, 26 байт

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

Не працює належним чином у TIO.

Перша пауза - 20 мілісекунд.

Пояснення

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 байт

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

C, 35 байт як функція

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

Вводиться як аргумент командного рядка.


2

Пакетна, 62 байти

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

Це виявилося, що байт коротший, ніж явне подвоєння tв циклі:

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


2

C #, 80 79 байт

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

Збережено один байт завдяки @raznagul.


Ви можете зберегти 1 байт, перемістивши Writeоператор до тіла циклу.
рознагал

@raznagul Не знаю, як я пропустив це, дякую!
TheLethalCoder

2

Python 2, 54 байти

Використовує тривалий обчислення замість часових бібліотек.

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

Тепер я помічаю, що моя відповідь схожа на вашу. Я не читав вашої відповіді під час публікації, але якщо ви хочете включити моє рішення у своє, я з радістю видалю свою відповідь.
Тім

2

PowerShell, 35 33 30 29 Байт

З корисною підказкою від будь-чого і Джоуї

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

Пояснення

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

Виконується з:

"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
Помістіть $a=1як ініціалізацію в, forщоб зберегти ще один байт ( for($a=1){...}). Крім того, я не впевнений, чи варто рахувати %, оскільки фактичний розпорядок роботи, який ви виконуєте, є лише блоком скриптів. (Мої виклики, як правило, досить суворі щодо того, щоб вимагати програми, виконуючи такі роздуми, але з усього питання, я все ще не зовсім впевнений, як рахувати різні способи використання PowerShell.)
Joey

@Joey, солодкий, що працює. Дякую за пораду
SomeShinyMonica

2

Python 3, 49 байт

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.