Mal sehen, wie gut Ihre bevorzugte Sprache bei selektiver Zufälligkeit ist.
Gegeben 4 Zeichen, A
, B
, C
, und D
, oder eine Kette von 4 Zeichen ABCD
als Eingabe , Ausgabe eines des Zeichens mit den folgenden Wahrscheinlichkeiten:
A
sollte eine Chance von 1/8 (12,5%) haben, gewählt zu werdenB
sollte eine 3/8 (37,5%) Chance haben, gewählt zu werdenC
sollte eine 2/8 (25%) Chance haben gewählt zu werdenD
sollte eine 2/8 (25%) Chance haben gewählt zu werden
Dies entspricht dem folgenden Plinko- Maschinenlayout:
^
^ ^
^ ^ ^
A B \ /
^
C D
Ihre Antwort muss einen echten Versuch machen, die beschriebenen Wahrscheinlichkeiten zu respektieren. 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
Dies ist Codegolf, so dass die wenigsten Bytes in jeder Sprache gewinnen!
ceil(abs(i - 6)/ 2.0)
einen Index von0-7
auf einen Index von0-3
mit der entsprechenden Distribution (0 111 22 33
) für diese Herausforderung abbildet ...Antworten:
Lean Mean Bean Machine ,
554342 Bytes-13 Bytes dank Alex Varga
Ich hoffe, dass es euch nichts ausmacht, wenn ich meine Frage nach nur 2 Stunden beantworte, aber ich bezweifle, dass jemand anderes vorhatte, eine Antwort in LMBM zu veröffentlichen.
Dies spiegelt im wahrsten Sinne des Wortes nur das im OP gezeigte Plinko-Layout wider, das horizontal gespiegelt wird, um unnötige Leerzeichen zu reduzieren.
quelle
Gelee , 6 Bytes
Ein monadischer Link, der eine Liste mit vier Zeichen erstellt und eines mit der beschriebenen Wahrscheinlichkeitsverteilung zurückgibt.
Probieren Sie es online!
Wie?
quelle
ṁ
!Cubix ,
3924222119 BytesIm Online-Dolmetscher ansehen!
Dies wird dem folgenden Würfelnetz zugeordnet:
Random Distribution Implementation Erklärung
Cubix ist eine Sprache, in der ein Anweisungszeiger die Flächen eines Cubes umkreist und die Befehle ausführt, auf die er stößt. Die einzige Form der Zufälligkeit ist der Befehl
D
, der die IP in eine zufällige Richtung sendet: eine gleiche Chance für1/4
jeden Weg.Wir können dies jedoch verwenden, um die richtig gewichteten Wahrscheinlichkeiten zu generieren: durch
D
zweimalige Verwendung . Die ersteD
hat eine1/4
Überschrift zu einer zweitenD
. In dieser SekundeD
sind jedoch zwei Richtungen mit Pfeilen (> D <
) blockiert, die den Befehlszeiger zurück an sendenD
, um eine andere Richtung zu wählen. Dies bedeutet, dass es von dort aus nur zwei mögliche Richtungen gibt, von denen jede eine1/8
allgemeine Chance hat. Dies kann verwendet werden, um das richtige Zeichen zu generieren, wie in der folgenden Abbildung gezeigt:(Beachten Sie, dass im aktuellen Code der Pfeil rechts durch einen Spiegel ersetzt wird.
|
)Code-Erklärung
Der Anweisungszeiger beginnt rechts neben dem Zeichen
i
und zeigt nach rechts. Dies wird ausgeführti
, wobei das erste Zeichen als Eingabe verwendet wird. Anschließend wird derD
oben gezeigte Zufallsprozess gestartet.Char A: In dem Fall, dass der erste
D
uns nach Osten und der zweite nach Süden schickt, müssen wir das Zeichen A drucken. Dies ist bereits auf dem Stapel des ersteni
. Folgendes wird ausgeführt:\
- Reflektiere die IP so, dass sie nach Osten gehti;
- Nimm eine Eingabe und lege sie erneut ab (no-op)U
- Führen Sie eine Kehrtwende durch und drehen Sie die IP zweimal nach linkso
- Geben Sie die TOS aus, Zeichen A@
- Beenden Sie das ProgrammD
Zeichen B: Wenn entweder das erste oder das zweite Zeichen nach Norden zeigt, müssen wir das Zeichen B erzeugen, das die nächste Eingabe sein wird. Beide Pfade führen die folgenden Befehle aus:^
- Richtung Norden<
- Gehen Sie nach Westen und wickeln Sie sich um ...i
- Nehmen Sie eine andere Eingabe, Zeichen Bo
- Geben Sie die TOS aus, Zeichen B;
- Pop die AGB@
- Beenden Sie das ProgrammChar C: Wenn der erste
D
uns nach Westen schickt, wird folgendes ausgeführt:i
- Nehmen Sie eine andere Eingabe, Zeichen Bi
- Nehmen Sie eine andere Eingabe, Zeichen Co
- Ausgabe TOS, Zeichen C@
- Beenden Sie das ProgrammChar D: Wenn der erste
D
uns nach Süden schickt, wird folgendes ausgeführt:i
- Nehmen Sie eine andere Eingabe, Zeichen B..
- Zwei No-Opsi
- Nehmen Sie eine andere Eingabe, Zeichen C|
- Dieser Spiegel reflektiert Ost-West, aber die IP geht nach Norden, also passieren wir ihn.^
- Dies hängt mit dem Pfad für Zeichen B zusammen. Da wir jedoch bereits zwei Eingaben vorgenommen haben, wird das vierte Zeichen (Zeichen D) gedruckt.quelle
Python , 50 Bytes
Eine unbenannte Funktion, die Zeichenfolgen (oder Listen von Zeichen) aufnimmt und zurückgibt.
Probieren Sie es online!
Wie?
random.choice
Wählt ein zufälliges Element aus einer Liste aus, so bildet die Funktion einen String mit der richtigen Verteilung, dh gegeben"ABCD"
,"ABCD"[:2] = "AB"
plus"ABCD"[1:]*2 = "BCD"*2 = "BCDBCD"
was ist"ABBCDBCD"
.quelle
R , 31 Bytes
Liest die Zeichen von
stdin
durch Leerzeichen getrennten.sample
Zeichnet Zufallsstichproben aus der ersten Eingabe in der Menge der zweiten Eingabe (so1
) (optionales Ersetzungsargument), wobei die Gewichtung durch das letzte Argument angegeben wird.Probieren Sie es online!
Probiere es
n
mal aus!Für den letzteren Code probiere ich die
n
Zeiten aus (n
in der Kopfzeile festgelegt), wobei die Ersetzung aufT
rue festgelegt ist (standardmäßig ist sie falsch), tabelliere die Ergebnisse und dividiere durchn
, um die relativen Wahrscheinlichkeiten der Eingaben zu sehen.quelle
PHP, 28 Bytes
Als Rohr mit laufen lassen
-nR
.01112233
in der Basis 4 ist5551
in Dezimalzahl ...quelle
7030
gehören zu meinen persönlichen Favoriten.Java 8,
5344 BytesDas ist ein
Function<char[], Character>
.Probieren Sie es online! (Dieses Testprogramm läuft die obige Funktion 1.000.000mal und gibt die experimentellen Wahrscheinlichkeiten des Wählens
A
,B
,C
, undD
).Die allgemeine Idee ist , einen Weg zu finden , um Karte
0-7
zu0-3
, so dass0
erscheinen1/8
Zeiten,1
erscheinen3/8
mal,2
erscheinen2/8
Zeiten und3
erscheint2/8
mal.round(abs(k - 6) / 2.0))
funktioniert dafür, wobeik
eine zufällige ganze Zahl im Bereich ist[0,8)
. Daraus ergibt sich folgende Zuordnung:Die, wie Sie sehen können, Ergebnisse in den Indizes
0 111 22 33
, die die gewünschten Wahrscheinlichkeiten erzeugt1/8
,3/8
,2/8
und2/8
.Aber warte! Wie
-~Math.abs(k-6)/2
um alles in der Welt wird das gleiche Ergebnis erzielt (wieder, wok
ist eine zufällige ganze Zahl im Bereich[0,8]
)? Es ist eigentlich ziemlich einfach ...(x+1)/2
(Ganzzahlige Division) ist dasselbe wieround(x/2)
undx + 1
ist dasselbe wie-~x
. Obwohlx+1
und-~x
gleich lang sind, ist es in der obigen Funktion besser, sie zu verwenden,-~x
da sie-~
Vorrang hat und daher keine Klammern erfordert.quelle
Math.abs
auch Doubles als Parameter akzeptiert werden):s->s[-~(int)Math.abs(Math.random()*8-6)/2]
( 42 Bytes ).APL, 14 Bytes
Eingabe als String.
Wie?
1 3 2 2\⊢
- Wiederhole jeden Buchstaben x mal ('ABCD'
→'ABBBCCDD'
)⊃
- nimm das Element am Index ..(?8)
- zufällig 1-8quelle
⎕U2378
.Holzkohle , 11 Bytes
Probieren Sie es online! Der Link ist eine ausführliche Version des Codes, obwohl Sie ihn kaum brauchen.
‽
wählt ein zufälliges Element aus,⟦⟧
erstellt eine Liste und die Variablen sind diejenigen, die die entsprechenden Eingabebuchstaben erhalten (in umgekehrter Reihenfolge, weil ich Lust dazu hatte).quelle
Pyth ,
87 BytesVerwendet den exakt gleichen Algorithmus wie in meiner Python-Antwort.
Probieren Sie es hier aus!
Pyth ,
108 BytesVerwendet den exakt gleichen Algorithmus wie Jonathan Allans Python-Antwort.
Probieren Sie es hier aus!
Erläuterung
O
- Nimmt ein zufälliges Element des Strings, das durch Anhängen (mit+
) erstellt wurde:<Q2
- Die ersten beiden Zeichen der Zeichenfolge.*2t
Verdoppeln Sie den gesamten String (*2
) mit Ausnahme des ersten Zeichens (t
).Anwendung dieses Algorithmus für
ABCD
:<Q2
nimmtAB
.*2t
nimmtBCD
und verdoppelt sie:BCDBCD
.+
verbindet die beiden Strings:ABBCDBCD
.O
nimmt ein zufälliges Zeichen.-2 dank Leaky Nun (zweite Lösung)
-1 dank Mnemonik (erste Lösung)
quelle
>Q1
wirdtQ
, was wirdt
.*2
mit+
und die implizite Eingabe zweimal verwendet wird .y
stattdessen darüber nachgedacht habe , was für Streicher nicht funktioniert ...Gelee , 8 Bytes
Probieren Sie es online!
Entfernen Sie die, um
X
zu sehen"ABBBCCDD"
. DerX
wählt ein zufälliges Element.quelle
C # (.NET Core) ,
76-55ByteProbieren Sie es online!
Meine erste Antwort wurde direkt auf TIO mit meinem Handy geschrieben. Aufleveln!
Erläuterung: Wenn die ursprüngliche Zeichenfolge "ABCD" ist, erstellt die Funktion die Zeichenfolge "ABCDBBCD" und entnimmt ihr ein zufälliges Element.
quelle
Javascript 35 Bytes
Nimmt einen String
ABCD
als Eingabe gibtA
1/8 - tel der Zeit,B
3 / 8ths die Zeit,C
1/4 der Zeit, und dieD
1/4 der Zeit.Erläuterung
quelle
05AB1E , 5 Bytes
Probieren Sie es online!
Erläuterung
quelle
> <> ,
252219 BytesProbieren Sie es online! , oder schau es dir auf dem Fischspielplatz an !
Ein kurzer Überblick über> <>: Es ist eine 2D-Sprache mit einem Fisch, der durch den Code schwimmt und dabei Anweisungen ausführt. Wenn es den Rand des Codes erreicht, wird es auf die andere Seite umgebrochen. Der Fisch beginnt in der oberen linken Ecke und bewegt sich nach rechts. Zufälligkeit ist schwierig in> <>: Die einzige zufällige Anweisung ist
x
, die die Richtung des Fisches zufällig (mit gleicher Wahrscheinlichkeit) nach oben, unten, links und rechts festlegt.Zu Beginn des Programms liest der Fisch zwei Zeichen der Eingabe mit ein
i_i
(jedesi
liest ein Zeichen von STDIN auf den Stapel und_
ist ein horizontaler Spiegel, den der Fisch jetzt ignoriert). Es erreicht dann einex
.Wenn der
x
Fisch nach rechts schickt, liest er ein weiteres Zeichen (das dritte) ein, druckt es mito
und hält mit an;
. Die linke Richtung ist ähnlich: Der Fisch liest zwei weitere Zeichen (also sind wir bis zum vierten), dreht sich nach rechts, druckt das vierte Zeichen und hält an. Wenn der Fisch hochschwimmt, wird das zweite Zeichen eingewickelt und gedruckt, bevor es direkt reflektiert/
und angehalten wird. Wenn es nach unten schwimmt, wird es von der reflektiert/
und trifft eine anderex
.Diesmal schicken zwei Richtungen den Fisch einfach zurück nach
x
(rechts mit einem Pfeil<
und oben mit einem Spiegel_
). Der Fisch hat also eine halbe Chance,x
in jede der beiden anderen Richtungen zu entkommen . Nach links druckt das oberste Zeichen des Stapels, das zweite, nach unten tauscht jedoch zuerst die beiden Elemente des Stapels aus$
, sodass in dieser Richtung das erste Zeichen gedruckt wird.Zusammenfassend werden das dritte und vierte Zeichen jeweils mit einer Wahrscheinlichkeit von 1/4 gedruckt; das erste Zeichen hat eine Wahrscheinlichkeit von 1/2 x 1/4 = 1/8; und das zweite Zeichen hat eine Wahrscheinlichkeit von 1/4 + 1/2 x 1/4 = 3/8.
quelle
05AB1E , 8 Bytes
Probieren Sie es online!
quelle
MATL ,
1210 BytesProbieren Sie es online! Oder führen Sie es 1000 Mal aus (geringfügig geänderter Code) und überprüfen Sie, wie oft jedes Zeichen angezeigt wird.
Erläuterung
Änderungen im geänderten Code:
1000:"Gl3HH4$vY"1Zr]vSY'
1000:"...]
ist eine Schleife, um die1000
Zeiten zu wiederholen .G
Stellt sicher, dass die Eingabe zu Beginn jeder Iteration verschoben wird.v
muss ersetzt werden durch4$v
, nur die Spitze zu verketten4
Zahlen.v
Verkettet die1000
Ergebnisse am Ende der Schleife zu einem Vektor,S
sortiert sie undY'
codiert sie mit Lauflänge. Dies gibt die vier Buchstaben und die Häufigkeit an, mit der sie aufgetreten sind.quelle
05AB1E , 6 Bytes
Probieren Sie es online!
Erläuterung
Funktioniert sowohl für Listen als auch für Strings.
quelle
C (gcc) ,
50 bis49 BytesProbieren Sie es online!
quelle
ABCD
Ruby,
34332927 Bytes2 Bytes gespart dank @Value Inc
Eingabe als vier Zeichen
konstruiere ein Array
[B,B,C,D,A,B,C,D]
und probiere es aus.versuche es online!
versuch es
n
mal! (Ich habe es in eine Funktion konvertiert, um es einfacher zu wiederholen, aber der Algorithmus ist der gleiche)quelle
$*
ist ein Alias fürARGV
.Pyth, 7 Bytes
Testsuite
O8
generiert eine Zufallszahl von 0 bis 7.| ... 1
Wendet ein logisches oder mit 1 an, wandelt die 0 in eine 1 um und lässt alles andere gleich. Die Zahl in diesem Stadium ist 1 2/8 der Zeit und 2, 3, 4, 5, 6, 7 oder 8 1/8 der Zeit.@z
Indexiert an dieser Position in die Eingabezeichenfolge. Die Indizierung erfolgt modulo über die Länge des Strings, also 4 Indizes an Position 0, 5 an Position 1 und so weiter.Die Wahrscheinlichkeiten sind:
Position 0: Zufallszahl 4. 1/8 der Zeit.
Position 1: Zufallszahl 0, 1 oder 5. 3/8 der Zeit.
Position 2: Zufallszahl 2 oder 6. 2/8 der Zeit.
Position 3: Zufallszahl 3 oder 7. 2/8 der Zeit.
quelle
Javascript,
3130 Bytes / 23 BytesAls ich die frühere Javascript-Antwort von Asgallant sah, musste ich über JS nachdenken. Wie er sagte:
Meins ist:
Erläuterung:
Daraus
Math.random()*8&7
gliedert sich wie folgt:Version 2, 23 Bytes
Aber dann danke an Arnauld, der nach mir gepostet hat, als er sagte:
was mich, wenn es tatsächlich erlaubt ist, zu folgendem geführt hat:
in welchem
new Date%8
dem dieselbe Aufschlüsselungstabelle wie oben verwendet wird.Und
%8
könnte auch sein&7
; Treffen Sie Ihre Wahl. Nochmals vielen Dank, Arnauld.quelle
ngn / apl, 10 Bytes
?2 4
wählt zufällig ein Zahlenpaar - das erste unter 0 1 und das zweite unter 0 1 2 3⌈/
ist "max redu" - finde die größere Zahl⎕a
ist das Großbuchstaben[ ]
IndizierungBeachten Sie die Tabelle für max (a, b), wenn a∊ {0,1} und b∊ {0,1,2,3}:
Wenn a und b zufällig und unabhängig voneinander ausgewählt werden, können wir 0123 = ABCD einsetzen, um die gewünschte Wahrscheinlichkeitsverteilung zu erhalten
quelle
Python 3 ,
64 5551 Bytes-9 Bytes dank @ovs
Probieren Sie es online!
Erläuterung
random.choice()
bekommt ein zufälliges Zeichen des Strings, während(s*2)[1:]+s[1]
schafftBCDABCDB
für einen EingangABCD
, die 1/8 hatA
s, 2/8C
s, 2/8D
s und 3/8B
s.quelle
random.choice
für 55 Bytes:lambda s:choice((s[0]+s[1:]*3)[:8])
choice()
obwohl.QBIC , 27 Bytes
Erläuterung
quelle
> <> 56 Bytes
Probieren Sie es online!
quelle
Chip , 60 Bytes
Probieren Sie es online!
Die drei
?
erzeugen jeweils ein zufälliges Bit. Im ersten Zyklus durchlaufen diese Bits die Schalter oben (/
's und\
' s), um zu bestimmen, welchen Wert wir aus dieser Tabelle ausgeben wollen:(wo
_
kann entweder0
oder sein1
). Wir gehen dann nach Bedarf die Eingabe entlang und drucken und beenden, wenn der richtige Wert erreicht ist.Der große alphabetische Blob am Ende wird aus dem cat-Programm kopiert. Diese Lösung unterdrückt einfach die Ausgabe und wird beendet, um den beabsichtigten Effekt zu erzielen.
quelle
Ruby, 32 Bytes
Ziemlich einfach..?
Probieren Sie es online!
quelle
AppleSoft,
29Oops, 32 BytesEin kleines "Retrocomputing" -Beispiel. Tragen Sie mit mir, ich bin diesbezüglich brandneu. Ich verstehe, dass das, was als "Eingang" bezeichnet wird, nicht selbst gezählt werden muss. Wie im OP angegeben, würde der Eingang als "ABCD" angegeben. (Anfangs war mir nicht klar, dass ich angeben musste, welche Eingabe erhalten werden soll, was 4 Bytes hinzufügte, während ich den Rest ein Byte lang spielte.)
Die Begriffe INPUT, RND, PRINT und MID $ werden jeweils intern als Einzelbyte-Token codiert.
Zunächst wird X ein Zufallswert im Bereich 0 <X <4 zugewiesen. Mit diesem Wert wird eines der Zeichen aus I $ gemäß (X <.5) + X + 1 ausgewählt. Der Wert für die Zeichenposition wird als verwendet abgeschnittene Auswertung des Ausdrucks. X <.5 addiert 1, wenn X kleiner als .5 war, andernfalls addiere 0. Die Ergebnisse von X teilen sich wie folgt auf:
quelle
Common Lisp , 198 Bytes
Probieren Sie es online!
Lesbar:
quelle