Пауза вдвое дольше


15

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

Пример:

Вход: hi.

Выход: hi(1 мс пауза) hi(2ms пауза) hi(4ms пауза) hi(8ms пауза) hi(пауза 16мс) и т.д.

Также разрешено:

hi(1-минутная пауза) hi(2-минутная пауза) hi(4-минутная пауза) hi(8-минутная пауза) hi(16-минутная пауза) и т. Д.

Ввод должен быть предоставлен в начале программы (STDIN, параметр командной строки, параметр функции и т. Д.) И будет строкой.

Начальная задержка не может быть 0.


Должен ли вывод быть бесконечным или он может остановиться через некоторое время?
Товарищ SparklePony

1
@ComradeSparklePony он должен выводить как можно дольше (пока не произойдет тепловая смерть вселенной, сбой компьютера,
programmer5000

@ComradeSparklePony только если это что - то вроде StackOverflow, из памяти и т.д. Это y=x=>(x&&alert(x),y())было бы технически разрешены, но я бы downvote его.
programmer5000

@ 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выдает a и ждет столько миллисекунд.
Товарищ SparklePony

@ComradeSparklePony Вы правы. это должно быть Gw.
Райли

Я не знаю, обязательно ли это отражает какую-либо проблему в коде, но в тот момент, когда я запускаю связанный пример, движок выдает мне: «Предупреждение: запрос превысил 60-секундный лимит времени и был прерван».
Doppelgreener

@doppelgreener Да, онлайн-переводчик может быть не лучшим вариантом в этом случае. Оффлайн работает как шарм, хотя.
Аднан,

15

Царапина, 8 блоков + 3 байта

установите [n] в [1];  навсегда {скажем [х];  подождите (n) секунд;  установите [n] в ((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)

Changelog:

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

Вы можете сохранить байт в printоператоре, переключившись на Python 2 :)
numbermaniac

1
@numbermaniac Да, но тогда мне придется переключиться на Python 2.: P
L3viathan

5

MATL , 8 байт

`GD@WY.T

Первая пауза составляет 2 секунды.

Попробуйте это на MATL Online . Или посмотрите измененную версию, которая отображает время, прошедшее с момента запуска программы. (Если переводчик не работает, обновите страницу и попробуйте снова).

Или посмотреть GIF:

введите описание изображения здесь

объяснение

`     % 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 Из любопытства: сработал ли для вас онлайн-переводчик?
Луис Мендо,

Да, почему?
programmer5000

@ 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 Мин

3
Еще короче:1//.n_:>(Print@#;Pause@n;2n)&
нгенисис

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 байт благодаря Лики Нун!


2
+1 за «Не используйте Java для игры в гольф. Это плохая идея». Не могли бы вы добавить ссылку TIO?
programmer5000

@ 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?
Пайонк

это отличная идея ... Я изменю это.
Джузеппе

4

Ruby, 34 28 23 22 (+2 для -n) = 24 байта

3 байта сохранены благодаря Value Ink!

1 байт сохранен благодаря Даньеро

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

Р, 44 43 байта

Вычеркнуто 44 все еще регулярно 44; (

Этот ответ уже дает достойное решение, но мы можем сэкономить еще несколько байтов.

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

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

Кроме того, пока этот комментарий все еще получает зеленый свет от OP, мы можем сделать его еще короче, но я не думаю, что это в духе задачи. Время ожидания 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
      . . .
      . . .

Ух ты, это похоже на аккуратный язык
Skidsdev


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

Python 3, 61 байт

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

Похож на гольф @ L3viathan, но использует whileцикл


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
вы должны иметь возможность использовать пустое значение вместо вместо:% {$ a = 1; for () {$ _; sleep ($ a * = 2)}} ``
что угодно

Благодарность! Я пытался использовать цикл for, но я положил for(;;). Даже не пытался удалить точки с запятой.
SomeShinyMonica

1
Поместите в $a=1качестве инициализации в, forчтобы сохранить еще один байт ( for($a=1){...}). Кроме того, я не уверен, стоит ли считать %, поскольку текущая подпрограмма, которую вы выполняете, это просто блок скрипта. (Мои проблемы, как правило, довольно строгие в том, чтобы требовать программу, обходя подобные размышления, но по поводу чего- либо, я все еще не совсем уверен, как рассчитывать различные способы использования PowerShell.)
Джои,

@ Джои, милая, это работает. Спасибо за совет
SomeShinyMonica

2

Python 3, 49 байт

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

Использует небольшую задержку +=операции и выполняет ее xраз. xудваивается, добавляя один к себе столько раз, сколько значениеx .

Начинается с 6^6(46656), чтобы придерживаться максимальной 5% вариации задержки.


Умно, но это боров памяти.
eush77

@ eush77 да, на моем планшете он завершился всего за 7 итераций цикла! Я ожидаю, что это будет длиться несколько дольше на моем рабочем столе.
Тим

1

Perl 6 , 39 байт

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

Попробуйте ( printпереопределено, чтобы добавить информацию о времени)

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

Вычеркнуто 44 все еще 44

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

Не любите боевые бомбы?

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

Технически правильно, но не правильно:

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

-3 байта благодаря Cyoce, -2 благодаря Business Cat, -2 благодаря Neil


2
Кажется, я не могу проверить это должным образом, но вы, вероятно, могли бы сделать это, i=1,y=x=>(alert(x),setTimeout(y,i*=2))чтобы сэкономить пару байтов
Business Cat

1
Я пошел дальше и отредактировал кредитное сообщение для Cyoce; если вы хотите изменить его, не стесняйтесь редактировать / откатывать.
HyperNeutrino

1
Как насчет i=1,y=x=>setTimeout(y,i*=2,console.log(x))?
Нил

1

Common Lisp, 49 байт

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

Первая задержка должна быть 1второй.


1
У вас есть 321 представитель!
programmer5000

@ programmer5000 у вас 3683 представителя!
Cyoce

1

Pyth, 7 байт

#|.d~yT

Объяснение:

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

1

TI-BASIC, 36 байтов

Начальный период ожидания составляет 1 секунду.

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

1

Ракетка, 51 байт

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

пример

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