Über die Serie
Zunächst einmal können Sie dies wie jede andere Code-Golf-Herausforderung behandeln und beantworten, ohne sich Gedanken über die Serie zu machen. Es gibt jedoch eine Rangliste für alle Herausforderungen. Sie finden die Rangliste zusammen mit einigen weiteren Informationen über die Serie im ersten Beitrag .
Obwohl ich eine Menge Ideen für die Serie habe, sind die zukünftigen Herausforderungen noch nicht in Stein gemeißelt. Wenn Sie Vorschläge haben, teilen Sie mir dies bitte auf dem entsprechenden Sandbox-Post mit .
Loch 3: Ganzzahlige Partitionen
Zeit, den Schwierigkeitsgrad etwas zu erhöhen.
Eine Partition einer positiven Ganzzahl n
ist definiert als ein Multiset von positiven Ganzzahlen, die sich summieren n
. Als Beispiel n = 5
existieren die folgenden Partitionen:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Beachten Sie, dass diese Multimengen sind, so gibt es keine Ordnung zu ihnen {3,1,1}
, {1,3,1}
und {1,1,3}
sind alle identisch betrachtet.
Ihre Aufgabe ist es n
, eine zufällige Partition von zu generieren n
. Hier sind die detaillierten Regeln:
Die Verteilung der produzierten Partitionen muss gleichmäßig sein . Das heißt, im obigen Beispiel sollte jede Partition mit einer Wahrscheinlichkeit von 1/7 zurückgegeben werden.
Aufgrund der technischen Einschränkungen von PRNGs ist eine perfekte Gleichmäßigkeit natürlich nicht möglich. Um die Gleichmäßigkeit Ihrer Einreichung zu beurteilen, werden die folgenden Vorgänge als perfekt gleichmäßige Verteilungen ergebend angesehen:
- Beziehen einer Nummer von einem PRNG (über einen beliebigen Bereich), von dem dokumentiert wird, dass sie (ungefähr) einheitlich ist.
- Abbildung einer gleichmäßigen Verteilung über eine größere Menge von Zahlen auf eine kleinere Menge durch Modulo oder Multiplikation (oder eine andere Operation, die Werte gleichmäßig verteilt). Die größere Menge muss mindestens das 1024-fache der möglichen Werte der kleineren Menge enthalten.
Da es sich bei den Partitionen um Multisets handelt, können Sie sie in beliebiger Reihenfolge zurückgeben, und diese Reihenfolge muss nicht konsistent sein. Für die zufällige Verteilung wird die Reihenfolge jedoch ignoriert. Das heißt, in dem obigen Beispiel
{3,1,1}
,{1,3,1}
und{1,1,3}
zusammen müssen eine Wahrscheinlichkeit von 1/7 haben zurückgegeben werden.- Ihr Algorithmus muss eine deterministische Laufzeit haben. Insbesondere können Sie keine zufälligen Multisets generieren und ablehnen, wenn sie nicht zusammengerechnet werden
n
. - Die Zeitkomplexität Ihres Algorithmus muss polynomiell sein
n
. Insbesondere können Sie nicht einfach alle Partitionen generieren und eine zufällige auswählen (da die Anzahl der Partitionen mit exponentiell wächstn
). Sie können davon ausgehen, dass der von Ihnen verwendete PRNG gleichmäßig verteilte Werte in O (1) pro Wert zurückgeben kann. - Sie dürfen keine eingebaute Funktion verwenden, die diese Aufgabe löst.
Sie können ein vollständiges Programm oder eine Funktion schreiben und Eingaben über STDIN oder die nächstgelegene Alternative, ein Befehlszeilenargument oder ein Funktionsargument vornehmen und Ausgaben über den Rückgabewert oder durch Drucken an STDOUT (oder die nächstgelegene Alternative) erzeugen.
Sie können davon ausgehen, dass n ≤ 65
(so dass die Anzahl der Partitionen weniger als 2 21 ist ). Die Ausgabe kann in einem beliebigen praktischen, eindeutigen Listen- oder Zeichenfolgenformat erfolgen.
Wenn Sie eine Funktion einreichen, sollten Sie auch ein kleines Testprogramm bereitstellen, das die Funktion mehrmals aufruft und die Ergebnisse druckt. Es ist in Ordnung, wenn die Parameter im Code angepasst werden müssen. Dies ist nur so, dass die Leute überprüfen können, ob die Lösung zumindest annähernd einheitlich ist.
Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Bytes). Und natürlich wird die kürzeste Einreichung pro Benutzer auch in die Gesamt-Bestenliste der Serie aufgenommen.
Bestenliste
Der erste Beitrag der Serie generiert eine Rangliste.
Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Die Sprache wird derzeit nicht angezeigt, das Snippet erfordert sie jedoch und analysiert sie. Ich füge möglicherweise in Zukunft eine Bestenliste nach Sprachen hinzu.)