Hintergrund
Ich habe eine Sammlung von "Wochentagssocken", bei denen es sich um sieben Paar Socken handelt, die nach Wochentagen gekennzeichnet sind. Wenn ich meine Socken wasche, landen sie auf einem Stapel, und ich muss sie in die richtigen Paare sortieren, bevor ich sie in den Schrank lege. Meine Strategie ist es, eine zufällige Socke nach der anderen vom Stapel zu ziehen und in eine Schublade zu legen. Immer wenn es ein passendes Paar Socken in der Schublade gibt, binde ich sie zusammen und lege sie in den Schrank. Ihre Aufgabe ist es, diesen zufälligen Prozess zu simulieren und die Anzahl der Ziehungen zurückzugeben, die erforderlich sind, um das erste passende Paar zu finden.
Eingang
Ihre Eingabe ist eine ganze Zahl N ≥ 1 . Es stellt die "Anzahl der Tage in einer Woche" dar: Es befinden sich N Paar Socken auf dem Stapel, und jedes Paar hat ein eigenes Etikett. Bei Bedarf können Sie auch einen PRNG-Startwert als Eingabe verwenden.
Ausgabe
Ihre Ausgabe ist die Anzahl der Socken, die ich ziehen muss, bevor das erste passende Paar gefunden wird. Wenn beispielsweise die ersten beiden Socken bereits ein übereinstimmendes Paar bilden, lautet die Ausgabe 2
.
Natürlich ist die Ausgabe zufällig und hängt von der Zeichenreihenfolge ab. Wir gehen davon aus, dass alle Zeichenreihenfolgen gleich wahrscheinlich sind , sodass die Auswahl bei jedem Ziehen einer Socke einheitlich und unabhängig von allen anderen Optionen ist.
Beispiel
Es sei N = 3 , so dass wir insgesamt 6 Socken mit der Bezeichnung AABBCC haben . Ein möglicher Durchlauf des "Strumpfziehprotokolls" ist wie folgt:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
Das erste übereinstimmende Paar wurde nach dem Zeichnen des zweiten B gefunden , das die dritte zu zeichnende Socke war, sodass die richtige Ausgabe vorliegt 3
.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Eingabe und Ausgabe können in jedem vernünftigen Format erfolgen, einschließlich unär (Zeichenfolge von 1
s).
Sie können davon ausgehen, dass das in Ihrer Sprache integrierte RNG perfekt ist. Sie müssen das Strumpfziehprotokoll nicht wirklich simulieren, solange Ihre Ausgaben die richtige Wahrscheinlichkeitsverteilung haben.
"Testfälle"
Hier sind die ungefähren Wahrscheinlichkeiten aller Ausgänge für den Eingang N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Um Ihre Lösung zu testen, können Sie sie beispielsweise 40.000 Mal ausführen und feststellen, ob die Ausgabeverteilung annähernd in der Nähe liegt.
Draw all socks. End up with an odd number.
Antworten:
Gelee , 8 Bytes
Probieren Sie es online! oder überprüfen Sie die Verteilung für N = 7 .
Hintergrund
Sei n die Anzahl der Paare; Es gibt 2n Einzelsocken.
Bei der ersten Ziehung gibt es 2n Socken und 0 davon würden ein passendes Paar ergeben. Daher ist die Erfolgswahrscheinlichkeit 0 / 2n = 0 .
Da die erste Ziehung nicht erfolgreich war, befinden sich 2n - 1 Socken auf dem Stapel und 1 davon würde ein passendes Paar ergeben. Daher beträgt die Erfolgswahrscheinlichkeit 1 / (2n - 1) .
Wenn die zweite Ziehung nicht erfolgreich war, befinden sich 2n - 2 Socken auf dem Stapel und 2 von ihnen würden ein passendes Paar ergeben. Daher beträgt die Erfolgswahrscheinlichkeit 2 / (2n - 2) .
Wenn die ersten k Draws nicht erfolgreich waren, befinden sich 2n - k Strümpfe auf dem Stapel und 2 von ihnen würden ein passendes Paar ergeben. Daher ist die Erfolgswahrscheinlichkeit k / (2n - k) .
Wenn keine der ersten n Ziehungen erfolgreich war, befinden sich 2n - k Socken auf dem Stapel und alle würden zu einem passenden Paar führen. Daher ist die Erfolgswahrscheinlichkeit n / (2n - n) = 1 .
Wie es funktioniert
quelle
Gelee, 8 Bytes
Probieren Sie es online!
Zur Verifizierung finden Sie hier eine Version , die sowohl die gewünschte Ausgabe als auch das Ergebnis der "Zufallslisten" -Operation anzeigt (um zu sehen, in welcher Reihenfolge Socken gezeichnet wurden).
quelle
Python, 66 Bytes
Dennis hat sich eine clevere Möglichkeit ausgedacht, die Dinge neu zu ordnen und dabei 5 Bytes zu sparen.
quelle
MATL ,
1615 BytesProbieren Sie es online! Oder beobachten Sie die empirische Verteilung für 1000 Proben im Fall N = 7 (es dauert eine Weile).
Dies erzeugt direkt die Zufallsvariable, die das Ergebnis darstellt, basierend auf seiner Wahrscheinlichkeitsverteilung. Lassen N die Anzahl der Sockenpaare, und sei p ( k die Wahrscheinlichkeit) bezeichnen , dass die k -te Unentschieden erfolgreich ist, konditioniert auf die Tatsache , dass die k -1-ten Unentschieden nicht erfolgreich war. Dann (siehe auch hier ):
Der Code iteriert also für maximal N + 1 Zeichen. Bei der k- ten Ziehung wird eine Zufallsvariable erzeugt, die gleich 1 mit der Wahrscheinlichkeit ( k - 1) / (2 · N - k ) ist, oder anders 0. Immer wenn die Zufallsvariable gleich 1 ist (die Ziehung war erfolgreich), stoppt der Prozess und der Strom k wird ausgegeben.
quelle
MATL ,
1413 BytesProbieren Sie es online! Oder beobachten Sie die empirische Verteilung für 4000 Proben im Fall N = 7 (es dauert eine Weile).
quelle
JavaScript,
7773 BytesErläuterung
quelle
f=(n)=>
mitn=>
(oder zwei, wenn Sie die Zuordnung halten möchten, einige halten es , einige entfernen es ).CJam, 17 Bytes
Teste es hier.
quelle
Python 3,
142105104 BytesVielen Dank an Eʀɪᴋ ʀɪᴋ Gᴏʟғᴇʀ für das Speichern eines Bytes!
Meine erste Antwort:
Meine neue Antwort:
Beide beenden mit einem
NameError
ons
.quelle
R 49
Ich bin mir sicher, dass es einen besseren Weg dafür in R geben muss! Ich habe versucht, etwas schlaueres zu machen, aber es hat nicht funktioniert.
Edit: Verbessert von @bouncyball, da es keine Funktion sein muss.
quelle
function(N)
? mitN=scan();
würde 2 Bytes sparenPython 2, 101 Bytes
quelle
VBA, 61 Bytes
- modelliert die Verschiebungswahrscheinlichkeit der Sockenübereinstimmung bei vorheriger Nichtübereinstimmung. Bei der Bewertung ist K "Socken in der Hand", also ist die Ziehungszahl eins mehr.
quelle
Pyth, 14 Bytes
Erläuterung:
quelle