To ostatecznie przestanie…

41

Biorąc pod uwagę ciąg wejściowy S, wydrukuj, Sa następnie niepusty separator w następujący sposób:

  • Krok 1: Sma 1/2szansę na wydrukowanie i 1/2szansę na zakończenie programu.

  • Krok 2: Sma 2/3szansę na wydrukowanie i 1/3szansę na zakończenie programu.

  • Krok 3: Sma 3/4szansę na wydrukowanie i 1/4szansę na zakończenie programu.

  • Krok n: Sma n/(n+1)szansę na wydrukowanie i 1/(n+1)szansę na zakończenie programu.

Notatki

  • Łańcuch wejściowy będzie składał się wyłącznie ze znaków akceptowanych w typie łańcucha twojego języka.

  • Można użyć dowolnego niepustego separatora, o ile zawsze jest taki sam. Oczekuje się, że separator zostanie wydrukowany po ostatnim wydruku Sprzed zakończeniem programu.

  • Program ma 1/2szansę zakończyć działanie przed wydrukowaniem czegokolwiek.

  • Końcowa nowa linia jest dopuszczalna.

  • Twoja odpowiedź musi podjąć prawdziwą próbę przestrzegania opisanych prawdopodobieństw. Oczywiście, gdy njest duża, będzie to coraz mniej prawdziwe. Odpowiednie wyjaśnienie, w jaki sposób obliczane są prawdopodobieństwa w twojej odpowiedzi (i dlaczego uwzględniają specyfikacje, pomijając problemy z pseudolosowością i dużymi liczbami) jest wystarczające.

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Fatalizować
źródło
Czy separator może być pustym ciągiem?
rturnbull
16
@rturnbull Cóż, nie, ponieważ w takim przypadku nie ma separatora.
Fatalize
Czy musimy je drukować jeden po drugim, czy możemy po prostu wydrukować je wszystkie po zakończeniu programu?
Dennis
@Dennis Jeden po drugim.
Fatalize

Odpowiedzi:

18

Pyth , 7 bajtów

WOh=hZQ

Wypróbuj online!

Jak to działa

Pseudo kod:

while rand_int_below(1 + (Z += 1)):
    print(input)
Leaky Nun
źródło
Pyth bije 05AB1E ponownie, prawda?
Erik the Outgolfer,
Czy instrukcja print nie potrzebuje własnego prawdopodobieństwa wraz z prawdopodobieństwem zakończenia?
tuskiomi
1
@tuskiomi Nah, n / (n + 1) to tylko 1-1 / (n + 1) lub 1 - (prawdopodobieństwo zakończenia).
Adowrath
29

C #, 94 85 bajtów

Moja pierwsza odpowiedź!

using System;s=>{var r=new Random();for(var i=2;r.Next(i++)>0;)Console.Write(s+" ");}

Poprzednia próba (podobało mi się goto):

using System;s=>{var i=2;var r=new Random();a:if(r.Next(i++)>0){Console.Write(s+" ");goto a;}}

Nie golfowany:

using System;
class P
{
    static void Main()
    {
        Action<string> f = s =>
        {
            var r = new Random();
            for (var i = 2; r.Next(i++) > 0;) Console.Write(s + " ");
        };

        f("test");

        Console.ReadKey();
    }
}

Uwaga: w języku C # Random.Next(N)metoda zwraca nieujemną liczbę całkowitą w zakresie [0, N-1], więc możemy po prostu sprawdzić, czy zwracana liczba jest większa niż 0.

Charlie
źródło
1
Musisz uwzględnić using System;w swojej liczbie bajtów. Można zadeklarować rinline, nie ma potrzeby, aby ustawić go do zmiennej: new Random().Next(i++). Nie potrzebujesz końcowego średnika na grze w golfa.
TheLethalCoder
1
No i fajna pierwsza odpowiedź!
Byłbym
@TheLethalCoder dziękuję za komentarze! Próbowałem użyć, new Random().Next(i++)ale kiedy próbowałem to wykonać, wynik zawsze był taki, że program się zatrzymywał bez drukowania lub program nigdy się nie zatrzymywał. Kiedy deklaruję r=new Random()i używam rzmiennej, program zatrzymuje się bardziej losowo, jak prosi OP.
Charlie
Ahhh sonduje, ponieważ pętla jest tak ciasna.
TheLethalCoder
2
@TheLethalCoder - Tak, pętla thight oznacza szansę, że ziarno generatora będzie takie samo. Patrz: msdn.microsoft.com/en-us/library/system.random.aspx#Instantiate
Erno
12

R, 47 46 43 bajtów

43 bajty z powodu Robina Rydera w komentarzach.

s=scan(,"")
while(sample(T<-T+1)-1)print(s)

Wypróbuj online!

Wyjaśnienie

s=scan(,"")  # Takes input from stdin.
             T<-T+1    # T is 1 by default, so this
                       # evaluates to 2, and will increment
                       # at each step.
      sample(T<-T+1)   # Take a sample of size 2, i.e. generate
                       # a list of integers from 1 to 2 in random order
      sample(T<-T+1)-1 # Subtract one from every element of this list.
while(sample(T<-T+1)-1)# while() will treat the first value in this list
                       # as a logical value, i.e. FALSE for zero and TRUE
                       # for nonzero values. The other elements of the list
                       # are ignored, triggering a warning.
                       print(s) # print s
rturnbull
źródło
Czy to się kiedyś kończy?
mfloren
@mfloren Tak, jak wszystkie inne odpowiedzi tutaj, jest stochastyczny, z szansą na zakończenie maleje w miarę postępu, ale w końcu się skończy. Istnieje szansa .5, że nic nie wydrukuje! Spróbuj uruchomić go kilka razy i porównaj wyniki.
rturnbull
function(s)jest krótszy niżs=scan(,'');
JAD
1
I pryr::f(while(runif(1)<T/(T<-T+1))print(s))jest jeszcze krótszy.
JAD
1
@JarkoDubbeldam Niestety nie można (ab) wykorzystanie Ti Ffunkcje anonimowe, ponieważ modyfikuje zmienną globalną i oznacza, że funkcja może być wywołana tylko raz. Zobacz tutaj : „funkcja rozwiązania działa niezmiennie niezależnie od tego, ile razy była wcześniej wywoływana”.
rturnbull
11

05AB1E , 8 bajtów

[NÌL.R#,

Wypróbuj online!

Wyjaśnienie

[         # start loop
 NÌL      # push range [1 ... current_iteration+2]
    .R    # pick a random number
      #   # if true (1), exit loop
       ,  # print input
Emigna
źródło
@Fatalize: To robi dla mnie. Spróbuj uruchomić go kilka razy. Ma 50% szansy, że nic nie wyprowadzi, więc mógłbyś być „nieszczęśliwy”.
Emigna
11
Dziedziczny problem losowych zadań. Czasami wszystkie szanse są przeciwko tobie.
J_F_B_M
@J_F_B_M nieodłączny?
Leaky Nun
1
@LeakyNun Nie, jest to „Problem dziedziczenia” (prawdopodobieństwo zdarzeń nie jest dziedziczone z poprzednich zdarzeń). J_F_B_M wyraźnie odnosił się do błędu Hazardzisty.
aebabis
11

JavaScript, 60 58 54 bajtów

f=(s,n=1)=>Math.random()<n/++n?console.log(s)+f(s,n):0

Wyprowadzi ciąg s. Separator, który jest drukowany po zakończeniu programu, to NaNlub 0.

f=(s,n=1)=>Math.random()<n/++n?console.log(s)+f(s,n):0

f('test')

Math.random()zwraca wartość z zakresu od 0 do 1. Jeśli ta wartość jest niższa n/(n+1), to sbędzie pritned.

4 bajty zapisane dzięki @Neil

Thomas W.
źródło
1
Dlaczego nie użyć n/++n?
Neil,
1
@Neil dzięki, zapisane 4 bajty!
Thomas W
2
Jeśli twoim środowiskiem była przeglądarka, której możesz użyć alertzamiast console.logzapisywać 6 bajtów - fragment kodu może w alert = console.lograzie potrzeby wyświetlać nieprzeszkadzające dane wyjściowe (jeśli dozwolone - nie zapisuje bajtów, pomaga tylko zachować rozsądek)
Craig Ayre
10

Java 8, 72 62 61 bajtów

s->{for(int n=2;Math.random()<1f/n++;System.out.println(s));}

-10 bajtów dzięki @cliffroot .
-1 bajt dzięki @JollyJoker .

Separator to nowa linia.

Wyjaśnienie:

Wypróbuj tutaj.

s->{                          // Method with String parameter and no return-type
  for(                        //  Loop
    int n=2;                  //   Start `n` on 2
    Math.random()<1f/n++;     //   Continue loop as long as a random decimal (0.0-1.0)
                              //   is smaller than 1/`n` (and increase `n` by 1 afterwards)
    System.out.println(s)     //   Print the input-String
  );                          //  End of loop
}                             // End of method
Kevin Cruijssen
źródło
2
nie mogę się w tej chwili sprawdzić, ale dlaczego nie umieścić ifwarunku w forbloku warunków?
Cliffroot
@cliffroot to jest w forpętli.
Okx,
1
@Okx Miałem na myśli warunek, kiedy forpętla powinna się zakończyć, aby nie wymagała wyraźnego return. Drugie wyrażenie wewnątrz instrukcji.
Cliffroot
@cliffroot Ah, rozumiem.
Okx,
1
Czy int n=2i 1f/n++zadziała?
JollyJoker
9

Mathematica, 43 bajty

(n=1;While[RandomInteger@n>0,Print@#;n++])&

JungHwan Min zapisał 1 bajt (powyżej) i zasugerował coś lepszego (poniżej)

Mathematica, 37 bajtów

For[n=1,RandomInteger@n++>0,Print@#]&
J42161217
źródło
1
RandomInteger@n!=0jest taki sam jak RandomInteger@n<1w tym przypadku i n++można go połączyć RandomInteger@n. Ponadto Forjest (prawie zawsze) krótszy niż While: -5 bajtówFor[n=1,RandomInteger@n++>0,Print@#]&
JungHwan Min
Wygrywa „For”! Zamieściłem odpowiedź zbyt
J42161217
For[n=1,!n∣Hash[# n++],Print@#]&działałby również przy 34 bajtach, zakładając, że skrót jest dość przypadkowy. Losowość zależy jednak od danych wejściowych. Na przykład spróbuj% /@ Alphabet[]
Kelly Lowder,
8

Clojure, 61 56 bajtów

Och, dlaczego nie poszedłem z for? Ale tak naprawdę trzeba być pedantycznym doseq, jak forocenia się leniwie.

#(doseq[n(range):while(>(rand-int(+ n 2))0)](println %))

Oryginał:

#(loop[n 2](if(>(rand-int n)0)(do(println %)(recur(inc n)))))
NikoNyrh
źródło
nie (>(+(rand-int n)2)0)zawsze jest prawda?
Cliffroot
Ach, dobry chwyt, chciałem zwiększyć n!
NikoNyrh
8

> <> , 124 112 bajtów

i:0( ?v
 &5a ~/
&p0[^ >"\_\^x0!>"0&1+:&p1&:&p2&:&p3&:&p4&:&p0&1+:&p3&:&p4&:
=?v[/!}l]:?!;1
{:   ?^  >
:o>_ {:?!^

Wypróbuj online! (Możesz również obejrzeć go na placu zabaw dla ryb , ale z powodu pewnych błędów musisz dodać znak }po lczwartej linii i dodać kilka znaków nowego wiersza po kodzie, aby działał poprawnie.)

Losowość jest trudna w> <>. Jedyną losową instrukcją jest losowe wybieranie xkierunku ryby z czterech opcji (w lewo, w prawo, w górę iw dół), więc przekształcenie tego w coś z prawdopodobieństwem 1 / n nie jest proste.

Sposób ten polega na tym, że za pomocą możliwości samodomodowania> <> buduje się Wieżę Losowości pod kodem, więc na przykład w czwartym etapie kod wygląda następująco:

i:0( ?v
 &5a ~/
&p0[^ >"\_\^x0!>"0&1+:&p1&:&p2&:&p3&:&p4&:&p0&1+:&p3&:&p4&:
=?v[/!}l]:?!;1
{:   ?^  >
:o>_ {:?!^
>!0x^
\  _\
>!0x^
\  _\
>!0x^
\  _\
>!0x^
\  _\

Ryba zaczyna się na dole wieży. Na każdym poziomie wieży xjest uwięziony między dwoma lustrami, więc ryba może uciec tylko poprzez przejście w lewo lub w prawo. Każdy z tych kierunków wysyła rybę na następny poziom wieży, ale pójście w lewo również popycha a 0na stos. Zanim ryba dotrze na szczyt wieży, stos zawiera pewną liczbę 0s, a liczba ta następuje po rozkładzie dwumianowym z próbami n, a p  = 1/2.

Jeśli długość stosu wynosi 0 (co ma prawdopodobieństwo 1/2 n ), program zatrzymuje się. Jeśli długość wynosi 1 (z prawdopodobieństwem n / 2 n ), ryba drukuje dane wejściowe i nową linię i buduje kolejny poziom wieży. Jeśli długość jest cokolwiek innego, ryba odrzuca stos i wraca na dół wieży. W efekcie spośród możliwości, które faktycznie coś robią, n z nich wypisuje łańcuch wejściowy, a jedna z nich zatrzymuje program, dając wymagane prawdopodobieństwa.

Nie drzewo
źródło
7

Python 3 , 72 69 66 bajtów

  • Zaoszczędź 3 bajty dzięki Jonathanowi Allanowi : Importuj stenografię i zacznij liczyć od 2.
  • Zaoszczędzono 3 bajty dzięki L3viathan : Pointed randint () był włącznie, a także skrócił się podczas warunku.
from random import*
s=input();i=1
while randint(0,i):print(s);i+=1

Wypróbuj online!

Officialaimm
źródło
1
Jest takie ustawienie, aby wyłączyć bufor wyjściowy - tak
Jonathan Allan
2
Wydaje mi się , że akceptowalne jest „wyłączanie” dużych liter (nie mogę włożyć angielskiego mózgu w sprzęt, „... (i dlaczego szanują specyfikacje, ignorując problemy z pseudolosowością i dużymi liczbami) ...” ignorując - prawda?) Jeśli tak, to możesz to zrobić random()<1/i.
Jonathan Allan
1
Czy to nie zaczyna się od prawdopodobieństwa ⅓? randintjest włącznie. Następnie możesz skrócić tę linię dowhile randint(0,i):print(s);i+=1
L3viathan
1
Właśnie wymyśliłem to samo rozwiązanie.
Esolanging Fruit
Zaktualizowany link TIO. Teraz liczba bajtów jest taka sama jak w przypadku wersji zmiennoprzecinkowej.
Jonathan Allan
6

QBIC , 19 17 bajtów

Porzucono =1, zmieniono warunki, zapisano 2 bajty

{p=p+1~_rp||?;\_X

Wyjaśnienie

{       Infinitely DO
p=p+1   Add 1 to p (p starts as 0, so on first loop is set to 1, then 2 etc...)
~       IF
  _rp|| a random number between 0 and p
        (implicitly: is anything but 0)
?;      THEN print A$ (which gets read from the cmd line)
\_X     ELSE QUIT
        END IF and LOOP are auto-added at EOF
Steenbergh
źródło
6

Braingolf , 23 bajty

#|V12[R!&@v!r?<1+>1+]|;

Wypróbuj online!

Generuje liczbę losową, xgdzie 0 <= x < n+1kończy się, jeśli xwynosi 0, w przeciwnym razie przyrosty ni pętle. Separator jest|

Wyjaśnienie:

#|V12[R!&@v!r?<1+>1+]|;  Implicit input of commandline args to stack
#|                       Push |
  V                      Create stack2 and switch to it
   12                    Push 1, then 2
     [..............]    Do-While loop, will run indefinitely unless conditional skips
                         Closing bracket
      R                  Return to stack1
       !&@               Print entire stack without popping
          v              Switch to stack2
           !r            Generate random number 0 <= x < n where n is last item on stack
             ?           If last item is greater than 0..
              <          ..Move first item to end of stack
               1+        ..and increment, this is the loop counter number
                 >       ..Move back
                  1+     ..and increment, this is the upper range of the RNG
                    ]    ..end loop
                     |   Endif
                      ;  Suppress implicit output
Skidsdev
źródło
6

Alice , 18 bajtów

/?!\v
\iO/>]qhUn$@

Wypróbuj online!

Wyjaśnienie

/     Reflect to SE. Switch to Ordinal.
i     Read all input as a string and push it to the stack.
!     Store the string on the tape.
/     Reflect to E. Switch to Cardinal.
>     Ensure that the IP moves east. This begins the main loop.

  ]   Move the tape head to the right. We'll be using the tape head's 
      position as a counter variable. Note that this tape head is independent
      of the one used in Ordinal mode to point at the input string.
  q   Push the tape head's position to the stack.
  h   Increment it (so that it's 2 initially).
  U   Get a uniformly random number in [0,n).
  n   Logical NOT. Gives 1 with probability 1/n and 0 otherwise.
  $@  Terminate the program if we got a  1.
  \   Reflect to NE. Switch to Ordinal.
  ?   Retrieve the input from the tape.
  O   Print it with a trailing linefeed.
  \   Reflect to E. Switch to Cardinal.

v     Send the IP south where it runs into the > to start the next
      loop iteration.
Martin Ender
źródło
6

PHP , 31 bajtów

for(;rand()%~++$c;)echo$argn._;

Wypróbuj online!

Jörg Hülsermann
źródło
3

Węgiel drzewny , 14 bajtów

A²γW‽γ«θ_A⁺γ¹γ

Wypróbuj online! Link jest do pełnej wersji kodu. Używa _jako separatora. Uwaga: buforowanie danych wyjściowych jest wyłączone, więc proszę nie hamować serwera Dennisa!

Neil
źródło
3

MATL , 9 bajtów

`G@QYrq]x

Wypróbuj online!

Wyjaśnienie

`        % Do...while
  G      %   Push input
  @      %   Push iteration index k, starting at 1
  QYrq   %   Random integer uniformly distributed in {0, 1, ..., k}. This is the
         %   loop condition. If non-zero (which occurs with probability k/(1+k))
         %   proceed with next iteration; else exit loop
]        % End
x        % Delete, as there are one too many strings. Implicitly display the stack
Luis Mendo
źródło
3

Perl 6 ,  50 41 38 36  26 bajtów

{put $_//last for (($,$_),*⊎$_...*).map(*.pick)}

Spróbuj

{eager ->{(++$).rand>.5??.put!!last}...*}

Spróbuj

{eager ->{(++$).rand>.5??.put!!0}...0}

Spróbuj

{eager ->{(++$).rand>.5&&.put}...!*}

Spróbuj

.put while (++$/).rand>.5

(z -nargumentem wiersza poleceń)

Spróbuj

Brad Gilbert b2gills
źródło
3

Python 3 , 55 bajtów

v=s=input();i=2
while hash(v)%i:print(s);i+=1;v=hash(v)

Wyjaśnienie

Aby uniknąć konieczności importowania losowego, wykorzystałem fakt, że wbudowana funkcja mieszająca jest losowo uruchamiana za każdym razem, gdy uruchamiany jest proces python (przynajmniej w systemie MacOS). Każdy skrót ostatniego skrótu powinien generować serię pseudolosowych liczb całkowitych.

Jeśli skrót jest wystarczająco pseudolosowy, modulo z ijest z prawdopodobieństwem zero 1/i.

Notatki

Trochę przeszkadza mi nadmiarowa wartość skrótu, ale bez przypisywania „do” lub „warunku” w Pythonie jestem trochę utknięty.

Zestaw Ham
źródło
Czy wiesz, czy iterowane hashowanie zawsze będzie obejmować całą przestrzeń liczb losowych, czy może utknie w cyklu? Większość języków programowania używa obecnie losowych algorytmów mieszających, aby uniknąć celowego powodowania kolizji mieszających, ale nie jestem pewien, jak gwarancje losowości algorytmów mieszających wypadają w porównaniu z PRNG.
To słuszna kwestia. I nie jestem pewien, to zajmie trochę analizy implementacji skrótu Pythona (bez bardziej wyczerpującego sprawdzenia). Myślałem, że to zabawne rozwiązanie, nawet jeśli istnieje szansa, że ​​może nie być w 100% pseudolosowe = p
Kit Ham
I'm a little bothered...rekurencja?
Felipe Nardi Batista
3

DO#

Jest to taka sama długość jak górna odpowiedź C #, ale:

using System;s=>{var x=(1<<31)/new Random().Next();for(;++x>0;)Console.Write(s+" ");}

Chciałem tylko zaznaczyć, że niektóre matematyki mogą dawać prawidłowe prawdopodobieństwo.

int.MaxValue/new Random().Next()-1

Jest równa

(int)(1 / new Random().NextDouble()) - 1;

A funkcja f (x) = 1 / x-1 to:

f (1) = 0

f (1/2) = 1

f (1/3) = 2

f (1/4) = 3

Więc 1/2 szansy na zaokrąglenie w dół do 0, 1/6 szansy na zaokrąglenie w dół do 1, a 1 / (n + 1) (n + 2) szansę na zaokrąglenie w dół do n.

Może jakiś inny język mógłby na tym skorzystać.

EDYCJA: Naprawiono mój błąd

Pomyślałem o czymś, co mogłoby go zmniejszyć.

EDYCJA EDYCJA: Po prostu się mylę. Wyciągnąłem losowy z pętli, ponieważ jeśli zostanie oceniony wielokrotnie, nie zadziała.

EDYCJA EDYCJA EDYCJA: Pozbyłem się zmiennej i. Przestanę próbować to teraz zmniejszyć. Nie, skłamałem. Pozbyłem się innego bajtu.

Geoffrey
źródło
2

C, 41 bajtów

n;f(char*s){for(n=1;rand()%++n;puts(s));}

Zakłada, że randjest zaszczepiony. Wypróbuj online!

MD XF
źródło
„Zakłada, że randjest zaszczepiony”. - Czy to uzasadnione założenie? randjest wymagany przez standard, aby mieć domyślnie ustaloną wartość początkową równą 1 i wszystkie znane mi implementacje właśnie to robią. Jeśli ta funkcja wykonuje tylko to, o co prosi wyzwanie, w połączeniu z innym kodem, myślę, że inny kod musi zostać uwzględniony w odpowiedzi i liczbie bajtów.
hvd
2

braingasm , 22 bajty

edycja: Ta sama liczba bajtów, ale zdałem sobie sprawę, że mogę się zakraść w nowej Lfunkcji imitacji taśmy .

,[>,]>L+[+$rzQ>[.>]:>]

Używa 0jako separatora. Działa tak:

,[>,]                   Read a byte and move to next cell until end of input.
     >                  After the loop we're in an empty cell;
                          Leave it empty and move to the next.
      L                 Set tape limit here:
                          The tape will then wrap around if we move further.
       +                Increase current cell by one.
                          This cell will be our counter.
        [            ]  Loop until the counter is zero.
                          That won't happen, so it's an infinite loop.
         +              Increase again, so the first time the counter is 2.
          $r            Get a random number, 0 <= r > current cell
            zQ          Quit the program if that random number was 0
              >         Wrap around to the start of the tape.
               [.>]     Print the input stored on the tape
                          The loop will stop at the blank cell.
                   :    Print the blank cell as a number ("0")
                    >   Go to the next (last) cell
daniero
źródło
2

Python , 54 bajty

lambda s:int(1/random()-1)*(s+'|')
from random import*

Wypróbuj online!

Wygenerowano liczbę kopii, jak floor(1/p)-1przy pjednolitym wyborze z przedziału jednostek. Liczba kopii przypada, ngdy 1/p-1mieści się pomiędzy ni n+1, co dzieje się, kiedy 1/(n+2) < p < 1/(n+1). Dzieje się tak z prawdopodobieństwem 1/(n+1)-1/(n+2)lub 1/((n+1)*(n+2). Jest to pożądane prawdopodobieństwo wydania nkopii: 1/2prob 0, 1/6prob 1, 1/12prob 2, ...

xnor
źródło
Dlaczego jest form random import*na dole?
CalculatorFeline
@CalculatorFeline Kolejność nie ma znaczenia. Definicja funkcji działa w obie strony.
xnor
@CalculatorFeline Aby przejść do bajtów, nie pisząc f=i nie umieszczając go w nagłówku TIO
Pan Xcoder
To ma sens.
CalculatorFeline
2

C ++, 97 96 57 bajtów

Oto moja pierwsza próba na codegolf :)

#include<iostream>
int main(){std::string S;std::cin>>S;int i=1;while(rand()%++i)puts(S.data());}

Za pomocą zapisałem jeden bajt for

#include<iostream>
int main(){std::string S;std::cin>>S;for(int i=1;rand()%++i;)puts(S.data());}

Zaoszczędzono 39 bajtów, ponieważ wydaje się, że nikt nie liczy włączeń

void p(string S){for(int i=1;rand()%++i;)puts(S.data());}

bez golfa

#include <iostream>
int main()
{
  // Create and read string from inputstream
  std::string S;
  std::cin >> S;       

  // rand % i: create random int in range [0, i-1]
  // Zero is seen as false and all positive int as true
  int i = 1;
  while (rand() % ++i) 
    puts(S.data());    
}
Michiel uit het Broek
źródło
Możesz wziąć ciąg jako argument z linii poleceń
Maliafo
Uwzględniane są liczone, chyba że znajdziesz kompilator, który domyślnie je zawiera
Felipe Nardi Batista
2

F #, 161 bajtów

Zdecydowanie nie jest to najlepszy język do gry w golfa, ale postanowiłem spróbować (poza tym nie wiem nic o F #, więc wszelkie wskazówki, jak poprawić moją odpowiedź, będą mile widziane).

let f s=
 let r,z=System.Random(),(<>)0
 let p _=printfn"%s"s
 seq {for i in 2|>Seq.unfold(fun i->Some(i,i+1))do yield r.Next(i)}|>Seq.takeWhile z|>Seq.iter p

Wykonaj z:

[<EntryPoint>]
let main argv =
    "test" |> f
    0

Zapisuje nową linię jako separator.

Charlie
źródło
2

Rubinowy , 29 + 1 = 30 bajtów

Używa -nflagi.

i=1;puts$_ while i>rand(i+=1)

Wypróbuj online!

Wartość tuszu
źródło
Ponieważ pobierasz dokładnie jeden wiersz danych wejściowych, możesz użyć $. specjalna zmienna zamiast i . Zapewne można również wymienić puts$_z print, ale nie jest jasne zasady, które obsługują.
histocrat
2

JS (ES6), 47 bajtów

x=>{for(i=1;Math.random()<i/(i+1);i++)alert(x)}

W przeciwieństwie do innych odpowiedzi ES6, używa to pętli for i ostrzegających bomb zamiast rekurencji. Separator, który jest drukowany po zatrzymaniu programu, jest niezdefiniowany.


źródło
2

PowerShell, 31 bajtów

for($i=2;random($i++)){"$args"}

Get-Random $iwypisuje ngdzie 0 <= n < $i, separator jest domyślną nową linią.

TessellatingHeckler
źródło
1
29 bajtów?
Veskah
1

Python, 75 bajtów

Druga odpowiedź na Python jest krótsza, ale chciałem spróbować w inny sposób:

from random import*
f=lambda d=1,s=input():randint(0,d)and s+'!'+f(d+1)or''
L3viathan
źródło