Bei einer vorgegebenen Eingabezeichenfolge wird auf folgende Weise S
gedruckt, S
gefolgt von einem nicht leeren Trennzeichen:
Schritt 1: Es
S
besteht die Möglichkeit, dass das Programm1/2
gedruckt wird und1/2
beendet wird.Schritt 2: Es
S
besteht die Möglichkeit, dass das Programm2/3
gedruckt wird und1/3
beendet wird.Schritt 3: Es
S
besteht die Möglichkeit, dass das Programm3/4
gedruckt wird und1/4
beendet wird.…
Schritt
n
: EsS
besteht die Möglichkeit, dass das Programmn/(n+1)
gedruckt wird und1/(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,
S
bevor das Programm beendet wird.Das Programm kann
1/2
vor dem Drucken beendet werden.Eine abschließende neue Zeile ist akzeptabel.
Ihre Antwort muss einen echten Versuch machen, die beschriebenen Wahrscheinlichkeiten zu respektieren. Offensichtlich
n
wird 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 Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Antworten:
Pyth , 7 Bytes
Probieren Sie es online!
Wie es funktioniert
Pseudocode:
quelle
C #,
94-85BytesMeine erste Antwort!
Vorheriger Versuch (das hat mir gefallen
goto
):Ungolfed:
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.quelle
using System;
in Ihre Byteanzahl aufnehmen. Sie können erklären ,r
keine Notwendigkeit , inline, um es auf eine Variable gesetzt:new Random().Next(i++)
. Das nachgestellte Semikolon brauchen Sie auf der Golffunk nicht.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 ichr=new Random()
dier
Variable deklariere und verwende , stoppt das Programm nach dem Zufallsprinzip, während das OP fragt.R,
474643 Bytes43 Bytes wegen Robin Ryder in den Kommentaren.
Probieren Sie es online!
Erläuterung
quelle
function(s)
ist kürzer alss=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
ist noch kürzer.T
undF
mit 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."05AB1E , 8 Bytes
Probieren Sie es online!
Erläuterung
quelle
Javascript,
605854 BytesGibt einen String aus
s
. Das Trennzeichen, das beim Beenden des Programms ausgegeben wird, istNaN
oder0
.Math.random()
Gibt einen Wert zwischen 0 und 1 zurück. Wenn dieser Wert darunter liegtn/(n+1)
,s
wird gedruckt.4 Bytes gespart dank @Neil
quelle
n/++n
?alert
anstattconsole.log
6 Bytes zu speichern, könnte das Snippetalert = console.log
auf Wunsch eine nicht aufdringliche Ausgabe anzeigen (falls zulässig - speichert keine Bytes, hilft nur, einen gesunden Menschen zu behalten)Java 8,
726261 Bytes-10 Bytes dank @cliffroot .
-1 Byte dank @JollyJoker .
Trennzeichen ist eine neue Zeile.
Erläuterung:
Probieren Sie es hier aus.
quelle
if
Bedingung in denfor
Bedingungsblock einfügen?for
Schleife.for
Schleife enden soll, damit es nicht explizit benötigt wirdreturn
. Der zweite Ausdruck in der Anweisung.int n=2
und1f/n++
arbeiten?Mathematica, 43 Bytes
JungHwan Min sparte 1 Byte (oben) und schlug etwas Besseres vor (unten)
Mathematica, 37 Bytes
quelle
RandomInteger@n!=0
ist das gleiche wieRandomInteger@n<1
in diesem Fall undn++
kann mit zusammengeführt werdenRandomInteger@n
. AuchFor
ist (fast immer) kürzer alsWhile
: -5 BytesFor[n=1,RandomInteger@n++>0,Print@#]&
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[]
Clojure,
6156 BytesOh, warum bin ich überhaupt nicht mit einem
for
gefahren? Aber um pedantischdoseq
zu sein, muss man sofor
vorgehen , wie es faul bewertet wird.Original:
quelle
(>(+(rand-int n)2)0)
immer wahr?n
!> <> ,
124112 BytesProbieren 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 deml
einfü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:
Der Fisch beginnt am Fuße des Turms. Auf jeder Ebene des Turms
x
ist 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 a0
auf den Stapel geschoben. Bis der Fisch die Spitze des Turms erreicht, enthält der Stapel eine Anzahl von0
s, 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.
quelle
Python 3 ,
726966 BytesProbieren Sie es online!
quelle
random()<1/i
.randint
ist inklusive. Sie können diese Zeile dann aufwhile randint(0,i):print(s);i+=1
QBIC ,
1917 BytesGelöschte
=1
, umgeschaltete Bedingungen, 2 Bytes gespartErläuterung
quelle
Braingolf , 23 Bytes
Probieren Sie es online!
Zufallszahl erzeugt ,
x
wo0 <= x < n+1
, beendet , wennx
0 ist , andernfalls inkrementiertn
und Schleifen. Trennzeichen ist|
Erläuterung:
quelle
Alice , 18 Bytes
Probieren Sie es online!
Erläuterung
quelle
PHP , 31 Bytes
Probieren Sie es online!
quelle
Perl, 26 Bytes
24 Byte Code + 2 für
-nl
.Probieren Sie es online!
quelle
Holzkohle , 14 Bytes
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!quelle
MATL , 9 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl 6 ,
50 41 38 3626 BytesVersuch es
Versuch es
Versuch es
Versuch es
(mit
-n
Kommandozeilenargument)Versuch es
quelle
Python 3 , 55 Bytes
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
i
mit Wahrscheinlichkeit Null1/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.
quelle
I'm a little bothered...
Rekursion?C #
Dies ist dieselbe Länge wie die obere C # -Antwort, aber:
Ich wollte nur darauf hinweisen, dass einige Mathematik die richtige Wahrscheinlichkeit produzieren kann.
Ist äquivalent zu
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.
quelle
Kohle , 17 Bytes
Probieren Sie es online! Ausführlicher Code enthalten. Respektiert Spezifikationen, da ein zufälliger Bereich von
0
bis verwendet wirdn
.quelle
C 41 Bytes
Angenommen,
rand
ist gesät. Probieren Sie es online!quelle
rand
ist gesät." - Ist das eine gültige Annahme?rand
Der 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.Braingasmus , 22 Bytes
edit: Gleiche
L
Byteanzahl , aber mir wurde klar, dass ich mich in die neue Tape Imit-Funktion einschleichen konnte .Verwendet
0
als Trennzeichen. Funktioniert so:quelle
Python , 54 Bytes
Probieren Sie es online!
Erzeugte die Anzahl der Exemplare wie
floor(1/p)-1
beip
einheitlich gewähltem Einheitsintervall. Die Anzahl der Kopien ist,n
wenn1/p-1
zwischenn
und liegtn+1
, was passiert, wenn1/(n+2) < p < 1/(n+1)
. Dies geschieht mit der Wahrscheinlichkeit1/(n+1)-1/(n+2)
oder1/((n+1)*(n+2)
. Dies ist die gewünschte Wahrscheinlichkeit für die Ausgabe vonn
Kopien:1/2
prob von 0,1/6
prob von 1,1/12
prob von 2, ...quelle
form random import*
unten?f=
indem Sie es nicht schreiben und in den TIO-HeaderC ++,
979657 BytesHier mein erster Versuch mit Codegolf :)
Ich habe ein Byte mit gespeichert
for
39 Bytes gespart, da niemand die Includes zu zählen scheint
ungolfed
quelle
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).
Ausführen mit:
Schreibt eine neue Zeile als Trennzeichen.
quelle
Ruby , 29 + 1 = 30 Bytes
Verwendet die
-n
Flagge.Probieren Sie es online!
quelle
puts$_
mit ,print
aber es ist nicht klar , die Regeln , die zu unterstützen.JS (ES6), 47 Bytes
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
PowerShell, 31 Byte
Get-Random $i
Ausgänge ein ,n
wo der0 <= n < $i
Separator ist implizit Neue - Zeile.quelle
Python, 75 Bytes
Die andere Python-Antwort ist kürzer, aber ich wollte es anders versuchen:
quelle