Dies wird irgendwann aufhören ...

41

Bei einer vorgegebenen Eingabezeichenfolge wird auf folgende Weise Sgedruckt, Sgefolgt von einem nicht leeren Trennzeichen:

  • Schritt 1: Es Sbesteht die Möglichkeit, dass das Programm 1/2gedruckt wird und 1/2beendet wird.

  • Schritt 2: Es Sbesteht die Möglichkeit, dass das Programm 2/3gedruckt wird und 1/3beendet wird.

  • Schritt 3: Es Sbesteht die Möglichkeit, dass das Programm 3/4gedruckt wird und 1/4beendet wird.

  • Schritt n: Es Sbesteht die Möglichkeit, dass das Programm n/(n+1)gedruckt wird und 1/(n+1)beendet wird.

Anmerkungen

  • Die Eingabezeichenfolge besteht nur aus Zeichen, die im Zeichenfolgentyp Ihrer Sprache zulässig sind.

  • Jedes nicht leere Trennzeichen kann verwendet werden, solange es immer dasselbe ist. Es wird erwartet, dass das Trennzeichen nach dem letzten Druck von gedruckt wird, Sbevor das Programm beendet wird.

  • Das Programm kann 1/2vor dem Drucken beendet werden.

  • Eine abschließende neue Zeile ist akzeptabel.

  • Ihre Antwort muss einen echten Versuch machen, die beschriebenen Wahrscheinlichkeiten zu respektieren. Offensichtlich nwird dies immer weniger wahr sein , wenn es groß ist. Es reicht aus, zu erklären, wie Wahrscheinlichkeiten in Ihrer Antwort berechnet werden (und warum sie die Spezifikationen einhalten, wobei Pseudozufälligkeiten und Probleme mit großen Zahlen unberücksichtigt bleiben).

Wertung

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Tödlich
quelle
Kann das Trennzeichen eine leere Zeichenfolge sein?
Turnbull
16
@rturnbull Naja nein, denn in diesem Fall gibt es kein Trennzeichen.
Fatalize
Müssen wir diese nacheinander drucken, oder können wir sie nur alle drucken, wenn das Programm beendet wird?
Dennis
@Dennis Einer nach dem anderen.
Fatalize

Antworten:

18

Pyth , 7 Bytes

WOh=hZQ

Probieren Sie es online!

Wie es funktioniert

Pseudocode:

while rand_int_below(1 + (Z += 1)):
    print(input)
Undichte Nonne
quelle
Pyth schlägt doch wieder 05AB1E, oder?
Erik der Outgolfer
Benötigt der Ausdruck nicht eine eigene Wahrscheinlichkeit zusammen mit der Abbruchwahrscheinlichkeit?
Tuskiomi
1
@tuskiomi Nah, n / (n + 1) ist nur 1-1 / (n + 1) oder 1 - (Wahrscheinlichkeit der Beendigung).
Adowrath
29

C #, 94-85 Bytes

Meine erste Antwort!

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

Vorheriger Versuch (das hat mir gefallen goto):

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

Ungolfed:

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

Hinweis: In C # gibt die Random.Next(N)Methode eine nicht negative Ganzzahl im Bereich [0, N-1] zurück, sodass wir nur überprüfen können, ob die zurückgegebene Zahl größer als 0 ist.

Charlie
quelle
1
Sie müssen using System;in Ihre Byteanzahl aufnehmen. Sie können erklären , rkeine Notwendigkeit , inline, um es auf eine Variable gesetzt: new Random().Next(i++). Das nachgestellte Semikolon brauchen Sie auf der Golffunk nicht.
TheLethalCoder
1
Oh und schöne erste Antwort! Wäre kürzer gewesen als mein Versuch :)
TheLethalCoder
@TheLethalCoder vielen Dank für Ihre Kommentare! Ich habe versucht, zu verwenden, new Random().Next(i++)aber als ich versuchte, das auszuführen, war das Ergebnis immer, dass das Programm entweder gestoppt wurde, ohne etwas zu drucken, oder das Programm nie gestoppt wurde. Wenn ich r=new Random()die rVariable deklariere und verwende , stoppt das Programm nach dem Zufallsprinzip, während das OP fragt.
Charlie
Ahhh probs weil die Schleife so eng ist.
TheLethalCoder
2
@TheLethalCoder - Ja, eine dichte Schleife bedeutet, dass der Startwert des Generators derselbe ist. Siehe: msdn.microsoft.com/en-us/library/system.random.aspx#Instantiate
Erno
12

R, 47 46 43 Bytes

43 Bytes wegen Robin Ryder in den Kommentaren.

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

Probieren Sie es online!

Erläuterung

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
quelle
Wird dies jemals beendet?
mfloren
@mfloren Ja, wie alle anderen Antworten hier ist es stochastisch, wobei die Kündigungswahrscheinlichkeit im Verlauf abnimmt, aber irgendwann endet es. Es besteht die Chance, dass nichts gedruckt wird! Versuchen Sie es mehrmals und vergleichen Sie die Ausgaben.
Turnbull
function(s)ist kürzer alss=scan(,'');
JAD
1
Und pryr::f(while(runif(1)<T/(T<-T+1))print(s))ist noch kürzer.
JAD
1
@JarkoDubbeldam Leider können Sie Tund Fmit anonymen Funktionen nicht (ab) verwenden , da dadurch eine globale Variable geändert wird und die Funktion nur einmal aufgerufen werden kann. Siehe hier : "Die Lösungsfunktion wird unabhängig davon, wie oft sie zuvor aufgerufen wurde, konsistent ausgeführt."
Turnbull
11

05AB1E , 8 Bytes

[NÌL.R#,

Probieren Sie es online!

Erläuterung

[         # start loop
 NÌL      # push range [1 ... current_iteration+2]
    .R    # pick a random number
      #   # if true (1), exit loop
       ,  # print input
Emigna
quelle
@Fatalize: Das tut es für mich. Versuchen Sie es ein paar Mal. Es besteht eine 50% ige Chance, dass nichts ausgegeben wird, sodass Sie möglicherweise "Pech" hatten.
Emigna
11
Das Erbproblem zufälliger Aufgaben. Manchmal sind alle Chancen gegen dich.
J_F_B_M
@J_F_B_M inhärent?
Undichte Nonne
1
@LeakyNun Nein, es ist das "Inherit Problem" (die Wahrscheinlichkeit von Ereignissen wird nicht von früheren Ereignissen geerbt). J_F_B_M bezog sich eindeutig auf den Fehlschluss des Spielers.
Aebabis
11

Javascript, 60 58 54 Bytes

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

Gibt einen String aus s. Das Trennzeichen, das beim Beenden des Programms ausgegeben wird, ist NaNoder 0.

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

f('test')

Math.random()Gibt einen Wert zwischen 0 und 1 zurück. Wenn dieser Wert darunter liegt n/(n+1), swird gedruckt.

4 Bytes gespart dank @Neil

Thomas W
quelle
1
Warum nicht benutzen n/++n?
Neil
1
@Neil danke, 4 Bytes gespart!
Thomas W
2
Wenn Ihre Umgebung ein Browser wäre, den Sie verwenden könnten, alertanstatt console.log6 Bytes zu speichern, könnte das Snippet alert = console.logauf Wunsch eine nicht aufdringliche Ausgabe anzeigen (falls zulässig - speichert keine Bytes, hilft nur, einen gesunden Menschen zu behalten)
Craig Ayre
10

Java 8, 72 62 61 Bytes

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

-10 Bytes dank @cliffroot .
-1 Byte dank @JollyJoker .

Trennzeichen ist eine neue Zeile.

Erläuterung:

Probieren Sie es hier aus.

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
quelle
2
Ich kann im Moment nicht prüfen, aber warum nicht die ifBedingung in den forBedingungsblock einfügen?
Cliffroot
@ Cliffroot Es ist in der forSchleife.
Okx
1
@Okx Ich meinte Bedingung, wann die forSchleife enden soll, damit es nicht explizit benötigt wird return. Der zweite Ausdruck in der Anweisung.
Cliffroot
@ Cliffroot Ah, ich verstehe.
Okx
1
Würde int n=2und 1f/n++arbeiten?
JollyJoker
9

Mathematica, 43 Bytes

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

JungHwan Min sparte 1 Byte (oben) und schlug etwas Besseres vor (unten)

Mathematica, 37 Bytes

For[n=1,RandomInteger@n++>0,Print@#]&
J42161217
quelle
1
RandomInteger@n!=0ist das gleiche wie RandomInteger@n<1in diesem Fall und n++kann mit zusammengeführt werden RandomInteger@n. Auch Forist (fast immer) kürzer als While: -5 BytesFor[n=1,RandomInteger@n++>0,Print@#]&
JungHwan Min
"Für" gewinnt! Ich habe auch deine Antwort gepostet
J42161217
For[n=1,!n∣Hash[# n++],Print@#]&würde auch bei 34 Bytes arbeiten, vorausgesetzt, der Hash ist ziemlich zufällig. Die Zufälligkeit hängt jedoch von der Eingabe ab. Zum Beispiel versuchen% /@ Alphabet[]
Kelly Lowder
8

Clojure, 61 56 Bytes

Oh, warum bin ich überhaupt nicht mit einem forgefahren? Aber um pedantisch doseqzu sein, muss man so forvorgehen , wie es faul bewertet wird.

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

Original:

#(loop[n 2](if(>(rand-int n)0)(do(println %)(recur(inc n)))))
NikoNyrh
quelle
ist nicht (>(+(rand-int n)2)0)immer wahr?
Cliffroot
Ah guter Fang, ich wollte erhöhen n!
NikoNyrh
8

> <> , 124 112 Bytes

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

Probieren Sie es online! (Sie können es auch auf dem Fischspielplatz ansehen , aber aufgrund einiger Fehler müssen Sie in der vierten Zeile ein }nach dem leinfügen und nach dem Code ein paar neue Zeilen einfügen, damit es richtig funktioniert.)

Zufälligkeit ist in> <> schwierig. Die einzige zufällige Anweisung ist x, die die Richtung des Fisches zufällig aus vier Auswahlmöglichkeiten (links, rechts, oben und unten) auswählt, sodass es nicht einfach ist , daraus etwas mit der Wahrscheinlichkeit 1 / n zu machen .

In diesem Code wird mithilfe der selbstmodifizierenden Funktionen von> <> ein Tower of Randomness unter dem Code erstellt. In der vierten Phase sieht der Code beispielsweise folgendermaßen aus:

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

Der Fisch beginnt am Fuße des Turms. Auf jeder Ebene des Turms xist der zwischen zwei Spiegeln eingeschlossen, sodass der Fisch nur nach links oder rechts entkommen kann. In jede dieser Richtungen wird der Fisch in die nächste Ebene des Turms befördert, aber wenn Sie nach links gehen, wird auch a 0auf den Stapel geschoben. Bis der Fisch die Spitze des Turms erreicht, enthält der Stapel eine Anzahl von 0s, und diese Anzahl folgt einer Binomialverteilung mit n Versuchen und p  = 1/2.

Wenn die Länge des Stapels 0 ist (was eine Wahrscheinlichkeit von 1/2 n hat ), wird das Programm angehalten. Wenn die Länge 1 ist (mit einer Wahrscheinlichkeit von n / 2 n ), druckt der Fisch die Eingabe und eine neue Zeile und baut eine weitere Ebene des Turms auf. Wenn die Länge etwas anderes ist, wirft der Fisch den Stapel ab und kehrt zum Boden des Turms zurück. Tatsächlich drucken n von ihnen aus den Möglichkeiten, die tatsächlich etwas bewirken, die Eingabezeichenfolge, und einer von ihnen hält das Programm an und gibt die erforderlichen Wahrscheinlichkeiten an.

Kein Baum
quelle
7

Python 3 , 72 69 66 Bytes

  • 3 Bytes gespart dank Jonathan Allan : Kurzschrift importieren und ab 2 zählen.
  • 3 Bytes gespart dank L3viathan : Pointed Randint () war inklusive und verkürzt auch während Bedingung.
from random import*
s=input();i=1
while randint(0,i):print(s);i+=1

Probieren Sie es online!

officialaimm
quelle
1
Es gibt eine Einstellung, mit der der Ausgabecache deaktiviert werden kann
Jonathan Allan,
2
Ich denke, es ist akzeptabel, für große n "aus" zu sein (ich kann das englische Gehirn nicht in Gang bringen, "... (und warum sie die Spezifikationen respektieren, Pseudozufälligkeit und Probleme mit großen Zahlen ignorieren) ..." außer Acht lassen - richtig?) Wenn ja, dann können Sie tun random()<1/i.
Jonathan Allan
1
Beginnt das nicht mit der Wahrscheinlichkeit ⅓? randintist inklusive. Sie können diese Zeile dann aufwhile randint(0,i):print(s);i+=1
L3viathan
1
Ich habe gerade die gleiche Lösung gefunden.
Esolanging Fruit
TIO-Link aktualisiert. Jetzt ist die Anzahl der Bytes auch die gleiche wie bei der Gleitkommaversion.
Jonathan Allan
6

QBIC , 19 17 Bytes

Gelöschte =1, umgeschaltete Bedingungen, 2 Bytes gespart

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

Erläuterung

{       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
quelle
6

Braingolf , 23 Bytes

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

Probieren Sie es online!

Zufallszahl erzeugt , xwo 0 <= x < n+1, beendet , wenn x0 ist , andernfalls inkrementiert nund Schleifen. Trennzeichen ist|

Erläuterung:

#|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
quelle
6

Alice , 18 Bytes

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

Probieren Sie es online!

Erläuterung

/     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
quelle
3

Holzkohle , 14 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Verwendet _als Trennzeichen. Hinweis: Das Zwischenspeichern von Ausgaben ist deaktiviert, also hämmern Sie bitte nicht Dennis 'Server!

Neil
quelle
3

MATL , 9 Bytes

`G@QYrq]x

Probieren Sie es online!

Erläuterung

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

Perl 6 ,  50 41 38 36  26 Bytes

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

Versuch es

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

Versuch es

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

Versuch es

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

Versuch es

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

(mit -nKommandozeilenargument)

Versuch es

Brad Gilbert b2gills
quelle
3

Python 3 , 55 Bytes

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

Erläuterung

Um nicht zufällig importieren zu müssen, habe ich die Tatsache ausgenutzt, dass der integrierte Hash jedes Mal zufällig gesetzt wird, wenn ein Python-Prozess gestartet wird (zumindest unter MacOS). Jeder Hash des letzten Hash sollte eine Reihe von Pseudozufallszahlen erzeugen.

Wenn der Hash pseudozufällig genug ist, ist das Modulo imit Wahrscheinlichkeit Null 1/i.

Anmerkungen

Der überflüssige Hash stört mich ein wenig, aber ohne eine Unterbrechung oder die Zuweisung von Bedingungen in Python stecke ich ein wenig fest.

Kit Ham
quelle
Wissen Sie, ob iteriertes Hashing immer den gesamten Bereich von Zufallszahlen abdeckt, oder ob es möglicherweise in einem Zyklus hängen bleibt? Die meisten Programmiersprachen verwenden heutzutage randomisierte Hash-Algorithmen, um zu vermeiden, dass Personen absichtlich Hash-Kollisionen verursachen. Ich bin mir jedoch nicht sicher, wie die Zufallsgarantien der Hash-Algorithmen mit denen eines PRNG verglichen werden.
Es ist ein fairer Punkt. Und ich bin mir nicht sicher, ob eine Analyse der Python-Hash-Implementierung erforderlich ist, um sie zu überprüfen (ohne eine ausführlichere Prüfung). Ich dachte, es wäre eine unterhaltsame Lösung, auch wenn es eine Chance gibt, dass es nicht zu 100% pseudozufällig ist = p
Kit Ham
I'm a little bothered...Rekursion?
Felipe Nardi Batista
3

C #

Dies ist dieselbe Länge wie die obere C # -Antwort, aber:

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

Ich wollte nur darauf hinweisen, dass einige Mathematik die richtige Wahrscheinlichkeit produzieren kann.

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

Ist äquivalent zu

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

Und die Funktion f (x) = 1 / x-1 ist:

f (1) = 0

f (1/2) = 1

f (1/3) = 2

f (1/4) = 3

Also 1/2 eine Chance, auf 0 abgerundet zu werden, 1/6 eine Chance, auf 1 abgerundet zu werden, und 1 / (n + 1) (n + 2) eine Chance, auf n abgerundet zu werden.

Vielleicht könnte eine andere Sprache davon profitieren.

EDIT: Mein Fehler wurde behoben

Ich dachte an etwas, um es kleiner zu machen.

EDIT EDIT: Ich liege einfach falsch. Random aus der Schleife gezogen, da es nicht funktioniert, wenn es mehrmals ausgewertet wird.

EDIT EDIT EDIT: Ich habe die Variable i losgeworden. Ich werde jetzt aufhören zu versuchen, es zu verkleinern. Nein, gelogen. Wurde ein anderes Byte los.

Geoffrey
quelle
2

Kohle , 17 Bytes

SαA²βW‽β«⁺α¶A⁺β¹β

Probieren Sie es online! Ausführlicher Code enthalten. Respektiert Spezifikationen, da ein zufälliger Bereich von 0bis verwendet wird n.

Nur ASCII
quelle
2

C 41 Bytes

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

Angenommen, randist gesät. Probieren Sie es online!

MD XF
quelle
"Angenommen, es randist gesät." - Ist das eine gültige Annahme? randDer Standard verlangt einen festen Startwert von 1, und alle mir bekannten Implementierungen tun genau das. Wenn diese Funktion nur das tut, was die Abfrage in Kombination mit anderem Code verlangt, muss meines Erachtens ein anderer Code in die Antwort und in die Byteanzahl einbezogen werden.
HDV
2

Braingasmus , 22 Bytes

edit: Gleiche LByteanzahl , aber mir wurde klar, dass ich mich in die neue Tape Imit-Funktion einschleichen konnte .

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

Verwendet 0als Trennzeichen. Funktioniert so:

,[>,]                   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
quelle
2

Python , 54 Bytes

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

Probieren Sie es online!

Erzeugte die Anzahl der Exemplare wie floor(1/p)-1bei peinheitlich gewähltem Einheitsintervall. Die Anzahl der Kopien ist, nwenn 1/p-1zwischen nund liegt n+1, was passiert, wenn 1/(n+2) < p < 1/(n+1). Dies geschieht mit der Wahrscheinlichkeit 1/(n+1)-1/(n+2)oder 1/((n+1)*(n+2). Dies ist die gewünschte Wahrscheinlichkeit für die Ausgabe von nKopien: 1/2prob von 0, 1/6prob von 1, 1/12prob von 2, ...

xnor
quelle
Warum ist form random import*unten?
CalculatorFeline
@CalculatorFeline Die Reihenfolge spielt keine Rolle. Die Funktionsdefinition funktioniert so oder so.
Xnor
@CalculatorFeline Um auf Bytes zu reduzieren, f=indem Sie es nicht schreiben und in den TIO-Header
einfügen
Das macht Sinn.
CalculatorFeline
2

C ++, 97 96 57 Bytes

Hier mein erster Versuch mit Codegolf :)

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

Ich habe ein Byte mit gespeichert for

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

39 Bytes gespart, da niemand die Includes zu zählen scheint

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

ungolfed

#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
quelle
Sie können die Zeichenfolge als Argument von der Befehlszeile nehmen
Maliafo
Includes werden gezählt, es sei denn, Sie finden einen Compiler, der sie standardmäßig enthält
Felipe Nardi Batista
2

F #, 161 Bytes

Auf jeden Fall nicht die beste Sprache zum Golfspielen, aber ich habe mich dazu entschlossen, es zu versuchen (außerdem weiß ich nichts über F #, daher sind alle Tipps zur Verbesserung meiner Antwort willkommen).

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

Ausführen mit:

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

Schreibt eine neue Zeile als Trennzeichen.

Charlie
quelle
2

JS (ES6), 47 Bytes

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

Im Gegensatz zu der anderen ES6-Antwort werden hier for-Schleifen- und Alarmbomben anstelle von Rekursionen verwendet. Das Trennzeichen, das beim Beenden des Programms gedruckt wird, ist nicht definiert.


quelle
2

PowerShell, 31 Byte

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

Get-Random $iAusgänge ein , nwo der 0 <= n < $iSeparator ist implizit Neue - Zeile.

TessellatingHeckler
quelle
1
29 Bytes?
Veskah
1

Python, 75 Bytes

Die andere Python-Antwort ist kürzer, aber ich wollte es anders versuchen:

from random import*
f=lambda d=1,s=input():randint(0,d)and s+'!'+f(d+1)or''
L3viathan
quelle