Zatrzymaj się dwa razy dłużej


15

Wyzwanie polega na wydrukowaniu danych wejściowych, odczekaniu dowolnej ilości czasu, wydrukowaniu danych wejściowych, odczekaniu dwukrotnie czasu początkowego oczekiwania, wydrukowaniu danych wejściowych ponownie itd. Początkowe opóźnienie musi wynosić mniej niż 1 godzinę, a dokładność kolejnych opóźnień musi wynosić +/- 5%. Poza tym nie ma ograniczenia czasu opóźnienia.

Przykład:

Wejście: hi.

Wyjście: hi(przerwa 1ms) hi(przerwa 2ms) hi(przerwa 4ms) hi(przerwa 8ms) hi(przerwa 16ms) itp.

Dozwolone są również:

hi(Przerwa 1 minuta) hi( przerwa 2 minuty) hi( przerwa 4 minuty) hi(przerwa 8 minut) hi(przerwa 16 minut) itp.

Dane wejściowe należy podać na początku programu (STDIN, parametr wiersza polecenia, parametr funkcji itp.) I będzie to ciąg znaków.

Początkowe opóźnienie nie może wynosić 0.


Czy wynik musi być nieskończony, czy może zatrzymać się po pewnym czasie?
Towarzysz SparklePony

1
@ComradeSparklePony musi wyprowadzać tak długo, jak to możliwe (do śmierci termicznej wszechświata, awarii komputera, przepełnienia stosu, braku pamięci itp.)
programista

@ComradeSparklePony tylko wtedy, gdy jest to coś takiego jak przepełnienie stosu, brak pamięci itp. To y=x=>(x&&alert(x),y())byłoby technicznie dozwolone, ale chciałbym to zagłosować.
programista

@ programmer5000 Dzięki, rozumiem.
Towarzysz SparklePony,

Czy mogę wydrukować nowy wiersz?
MD XF

Odpowiedzi:


12

05AB1E , 6 bajtów

Kod:

[=No.W

Wyjaśnienie:

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

Wypróbuj online!


Jeśli zaczniesz od 1 sekundy, możesz użyć wzamiast .W.
Riley

@ Riley Nie sądzę, żeby to zadziałało. wczeka jedną sekundę bez względu na wszystko, .Wwyskakuje i czeka tyle milisekund.
Towarzysz SparklePony

@ComradeSparklePony Masz rację. musiałoby być Gw.
Riley

Nie wiem, czy to koniecznie odzwierciedla jakiś problem w kodzie, ale w momencie uruchomienia połączonego przykładu silnik daje mi: „Ostrzeżenie: żądanie przekroczyło 60-sekundowy limit czasu i zostało zakończone”.
doppelgreener

@doppelgreener Tak, tłumacz online może nie być najlepszą opcją w tym przypadku. Offline działa jednak jak urok.
Adnan

15

Scratch, 8 bloków + 3 bajty

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

Odpowiednik w Pythonie:

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

1
dlaczego „+ 3 bajty”?
Cole Johnson

2
9 bloków (np. Na zawsze, n) + 3 bajty (np. X, 2)
OldBunny2800

5

Python 3, 60 56 bajtów

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

Dziennik zmian:

  • zmieniono funkcję rekurencyjnej lambda na funkcję rekurencyjną (-4 bajty)

Możesz zapisać bajt na printwyciągu, przełączając się na Python 2 :)
numbermaniac

1
@numbermaniac Tak, ale musiałbym przełączyć się na Python 2.: P
L3viathan

5

MATL , 8 bajtów

`GD@WY.T

Pierwsza przerwa to 2 sekundy.

Wypróbuj w MATL Online . Lub zobacz zmodyfikowaną wersję, która wyświetla czas, jaki upłynął od uruchomienia programu. (Jeśli interpreter nie działa, odśwież stronę i spróbuj ponownie).

Lub zobacz gif:

enter image description here

Wyjaśnienie

`     % 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 Z ciekawości: czy tłumacz online działał dla Ciebie?
Luis Mendo

Tak, dlaczego?
programista

@ programmer5000 Thanks. Tylko do sprawdzenia. Czasami występują problemy z
przekroczeniem

5

Mathematica 34 32 30 29 bajtów

Oryginalne rozwiązanie 34 bajtów:

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

Ogol 2 bajty za pomocą Do

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

Ogol jeszcze jeden bajt dzięki rekurencyjnemu rozwiązaniu @ MartinEnder

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

@ngenisis używa rekurencji ReplaceRepeated, aby zgolić kolejny bajt

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

4
Truejest 1>0. Ale coś takiego jest nieco krótsze:±n_:=#0[Print@n;Pause@#;2#]&@1
Martin Ender

Umieszczam 1<2przed twoim komentarzem. Jednak rozwiązanie rekurencyjne oszczędza bajt. Dzięki @MartinEnder
Kelly Lowder

±to jeden bajt w kodowaniu CP-1252 (domyślne kodowanie w systemie Windows).
JungHwan Min

3
Jeszcze krótszy:1//.n_:>(Print@#;Pause@n;2n)&
ngenisis

5

Oktawa, 42 41 bajtów

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

Zapisany jeden bajt dzięki rahnema1 p*=2jest krótszy niż p=p*2.

Nie mogę uwierzyć, że nie byłem w stanie zagrać w golfa, ale tak naprawdę nie było to takie łatwe.

  • Dane wejściowe muszą być na początku, więc nie można uniknąć pierwszej części.
  • Potrzebuję liczby, która się podwoi, i musi być zainicjowana przed pętlą
    • Można by użyć danych wejściowych jako warunku dla pętli, ale wtedy musiałbym mieć p*=2gdzie indziej.
    • Pauza nie ma wartości zwracanej, w przeciwnym razie mogłaby być while pause(p*=2)

2
Sztuczka, której nauczyłem się od rahnema1: input(0)działa
Luis Mendo

1
@LuisMendo Niestety sztuczka nie działa w najnowszej wersji oktawy :(
rahnema1

4

Java (OpenJDK 8) , 113 bajtów

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

Wypróbuj online!

-60 bajtów dzięki Leaky Nun!


2
+1 za „Nie używaj Javy do gry w golfa. To zły pomysł”. Czy możesz dodać link do TIO?
programista

@ programmer5000 Pewnie, ale to nie działa, ponieważ TIO czeka na zakończenie kodu.
HyperNeutrino

2
Dlaczego interfejs zamiast klasy?
prawej strony

2
@rightfold Interfejs pozwala pominąć publicw public static void main.
Leaky Nun

1
@ColeJohnson argumenty są wymagane.
Leaky Nun

4

R, 50 48 bajtów

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

zwraca anonimową funkcję, która ma jeden obowiązkowy argument, ciąg do wydrukowania. Nie drukuje nowych wierszy, po prostu wypluwa xna ekranie. ijest opcjonalnym argumentem, domyślnie ustawiony na 1, czeka na isekundy i podwaja sięi .

-2 bajty dzięki pajonk

Wypróbuj online!


Dlaczego nie zacząć od i=1użycia i=i*2na końcu i po prostu spać i?
pajonk

to świetny pomysł ... zmienię to.
Giuseppe,

4

Rubinowy, 34 28 23 22 (+2 za -n) = 24 bajty

3 bajty zapisane dzięki Value Ink!

1 bajt zapisany dzięki Daniero

loop{print;sleep$.*=2}

Rozpoczyna się 2, a następnie 4, etc.

Wyjaśnienie

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

Będzie spał sekundę przed odczytaniem danych wejściowych, ale możesz je już wprowadzić
John Dvorak

Uruchomienie programu Ruby z -nflagą pozwala pominąć początkowe getswywołanie, ponieważ flaga sobie z tym poradzi
Value Ink

printbez argumentu jest równoważny puts$_- zapisano jeden bajt
daniero

4

Alice , 16 bajtów

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

Wypróbuj online! (Oczywiście nie ma tam wiele do zobaczenia, ale możesz sprawdzić, jak często drukowano w ciągu jednej minuty).

Wyjaśnienie

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 bajtów

Przekreślone 44 jest nadal regularne 44; (

Ta odpowiedź już zapewnia przyzwoite rozwiązanie, ale możemy zaoszczędzić trochę więcej bajtów.

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

Anonimowa funkcja przyjmująca praktycznie wszystko do wydrukowania jako argument x. Zaczyna się po 2 sekundach i podwaja się za każdym razem. Nadużywa Tdomyślnie zdefiniowanego TRUEkryterium oceny 1.

Tak długo, jak długo ten komentarz otrzyma zielone światło od OP, możemy go jeszcze skrócić, ale nie sądzę, że jest to zgodne z duchem wyzwania. Czasy oczekiwania 0 nie są już dozwolone.

function(x)repeat cat(x)

2
spójrz na siebie, wykorzystując biednych w Tten sposób. w krótszej wersji odpowiedzi nie potrzebujesz nawet aparatów ortodontycznych, tylko spację.
Giuseppe,

1
Hej, jeśli się Tto nie podoba, Tmoże się bronić. Także miłe znalezisko :)
JAD

3

Cubix , 30 bajtów

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

Wypróbuj tutaj

Mapuje to na sześcian o długości boku 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
      . . .
      . . .

och, wow, wygląda to na fajny język
Skidsdev


3

PHP, 31 bajtów

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

śpi 1, 2, 4, 8, ... sekund. Uruchom jako potok zphp -nR '<code>'

Będzie działał do 63. wydruku (na komputerze 64-bitowym), po tym nie będzie już czekania.
Wersja 1 wyświetla ostrzeżenia sleep() expects parameter 1 to be integer, float given,
wersja 2 wyświetla jedno ostrzeżenie sleep(): Number of seconds must be greater than or equal to 0.

Włóż @wcześniej, sleepaby wyciszyć ostrzeżenia.



2

Python 3, 61 bajtów

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

Podobne do golfa @ L3viathan, ale używa whilepętli


2

CJam, 26 bajtów

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

Nie działa poprawnie w TIO.

Pierwsza przerwa to 20 milisekund.

Wyjaśnienie

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 bajtów

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

C, 35 bajtów jako funkcja

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

Pobiera dane wejściowe jako argument wiersza poleceń.


2

Partia, 62 bajty

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

Okazało się, że jest to bajt krótszy niż jawne podwojenie tw pętli:

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

2

Siatka , 12 bajtów

1idp~dw2*~2j

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Oszczędność jednego bajtu dzięki @raznagul.


Możesz zapisać 1 bajt, przenosząc Writeinstrukcję do treści pętli.
raznagul

@raznagul Nie wiem, jak mi tego brakowało, dzięki!
TheLethalCoder

2

Python 2, 54 bajty

Wykorzystuje długie obliczenia zamiast bibliotek czasowych.

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

Teraz zauważam, że moja odpowiedź jest podobna do twojej. Nie czytałem twojej odpowiedzi, kiedy pisałem, ale jeśli chcesz włączyć moje rozwiązanie do twojego, chętnie usunę moją odpowiedź.
Tim

2

PowerShell, 35 33 30 29 bajtów

Z pomocną wskazówką od czegokolwiek i Joeya

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

Wyjaśnienie

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

Wykonano z:

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

1
powinieneś być w stanie użyć pustego zamiast zamiast:% {$ a = 1; for () {$ _; sleep ($ a * = 2)}} ``
cokolwiek

Dzięki! Próbowałem wcześniej użyć pętli for, ale założyłem for(;;). Nawet nie próbował usunąć średników.
SomeShinyMonica

1
Umieść $a=1jako inicjalizację w, foraby zapisać kolejny bajt ( for($a=1){...}). Nie jestem też pewien, czy to policzyć %, ponieważ faktycznie wykonywana rutyna to tylko blok skryptu. (Moje wyzwania są raczej surowe, jeśli chodzi o wymaganie programu, unikanie takich rozmyślań, ale w przypadku jakichkolwiek pytań wciąż nie jestem pewien, jak policzyć różne sposoby korzystania z programu PowerShell.)
Joey

@Joey, słodki, który działa. Dzięki za wskazówkę
SomeShinyMonica

2

Python 3, 49 bajtów

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

Wykorzystuje niewielkie opóźnienie +=operacji i wykonuje je xrazy. xpodwaja się, dodając jeden do siebie tyle razy, ile wartość x.

Zaczyna się od 6^6(46656), aby trzymać się maksymalnie 5% zmienności opóźnienia.


Sprytne, ale to świnia pamięci.
eush77

@ eush77 tak, na moim tablecie zakończył się po zaledwie 7 iteracjach pętli! Spodziewam się, że potrwa to trochę dłużej na moim pulpicie.
Tim

1

Perl 6 , 39 bajtów

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

Spróbuj ( printzastąpione, aby dodać informacje o czasie)

Rozszerzony:

  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 bajtów

Przekreślone 44 to wciąż 44

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

Nie lubisz bomb ostrzegawczych?

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

Technicznie poprawne, ale nadużywające luk prawnych:

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

-3 bajty dzięki Cyoce, -2 dzięki Business Cat, -2 dzięki Neilowi


2
Wydaje mi się, że nie jestem w stanie przetestować tego poprawnie, ale prawdopodobnie możesz zrobić, i=1,y=x=>(alert(x),setTimeout(y,i*=2))aby zaoszczędzić kilka bajtów
Business Cat

1
Poszedłem do przodu i zredagowałem wiadomość kredytową dla Cyoce; jeśli chcesz to zmienić, możesz edytować / przywracać.
HyperNeutrino

1
Jak o i=1,y=x=>setTimeout(y,i*=2,console.log(x))?
Neil

1

Common Lisp, 49 bajtów

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

pierwsze opóźnienie powinno być 1drugie.


1
Masz 321 powtórzeń!
programista

@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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.