Die Partitionsnummer einer positiven Ganzzahl ist definiert als die Anzahl der Möglichkeiten, wie sie als Summe positiver Ganzzahlen ausgedrückt werden kann. Mit anderen Worten, die Anzahl der Integer-Partitionen. Beispielsweise hat die Nummer 4
die folgenden Partitonen:
[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]
Daher hat es 5
Partitionen. Dies ist OEIS A000041 .
Aufgabe
Bei einer positiven Ganzzahl N bestimmen Sie deren Partitionsnummer.
Es gelten alle Standardregeln.
Die Eingabe und Ausgabe kann auf jede vernünftige Weise erfolgen.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Testfälle
Eingabe | Ausgabe 1 | 1 2 | 2 3 | 3 4 | 5 5 | 7 6 | 11 7 | 15 8 | 22 9 | 30 10 | 42
code-golf
math
number-theory
combinatorics
integer-partitions
Martin Ender
quelle
quelle
Antworten:
Pyth , 3 Bytes
Probieren Sie es hier aus! oder Probieren Sie eine Testsuite aus.
Das Formatieren der Antwort dauerte viel länger als das Schreiben des Codes selbst: P.
Wie?
Pyth ist das richtige Werkzeug für den Job.
quelle
Mathematica, 11 Bytes
Erläuterung
quelle
Python 2 ,
8583 Bytes-2 Bytes dank @notjagan
Probieren Sie es online!
Verwendung einer rekursiven Formel aus OEIS A000041 .
quelle
==0
entspricht<1
in diesem Fall. BEARBEITEN : Verwenden Sie Notjagans Ansatz<1
statt==0
, der TIO-Code aber nicht.Emojicode 0.5,
204201 BytesProbieren Sie es online!
-3 Bytes bei Verwendung von "kleiner oder gleich 1" anstelle von "kleiner als 2", da das Emoji "kleiner als" eine recht lange UTF-8-Codierung aufweist. Außerdem wurde
t
eine Warnung eingefroren, um sie zum Schweigen zu bringen, ohne die Byteanzahl zu beeinflussen.Erweitert die Klasse 🚂 (Ganzzahl) mit einer Methode mit dem Namen 🅰️. Sie können ein einfaches Programm schreiben, das eine Zahl aus der Eingabe entnimmt, die Zahl mit 🅰️ aufruft und das Ergebnis wie folgt ausgibt:
Dieser Teil könnte durch das Weglassen der Meldungen und der Fehlerbehandlung erheblich verbessert werden, ist jedoch nicht in der Partitur enthalten. Ich bevorzuge es, stattdessen mehr Funktionen von Emojicode zu zeigen und gleichzeitig die Lesbarkeit zu verbessern.
Ungolfed
Erläuterung
Hinweis: Viele Emojis machen in Emojicode 0.5 wenig Sinn. Immerhin ist es 0.x. 0.6 wird dies beheben.
Emojicode ist eine objektorientierte Programmiersprache mit Generika, Protokollen, Optionen und Abschlüssen. Dieses Programm verwendet jedoch keine Abschlüsse. Alle Generika und Protokolle können als implizit betrachtet werden, während die einzige Option im E / A-Stub angezeigt wird.
Das Programm arbeitet nur mit wenigen Typen: 🚂 ist der Integer-Typ, 🔡 ist der String-Typ und ⏩ ist der Range-Typ. Einige Boolesche Werte (👌) werden ebenfalls angezeigt, sie werden jedoch nur unter Bedingungen verwendet. Boolesche Werte können einen Wert von 👍 oder 👎 annehmen, der true bzw. false entspricht.
Derzeit gibt es in Emojicode keine Operatoren. Daher werden Additionen, Vergleiche und andere Operationen, die normalerweise Operatoren sind, als Funktionen implementiert, sodass die Ausdrücke die Präfixnotation verwenden . Betreiber sind auch in 0.6 geplant.
Lassen Sie uns zuerst das Testprogramm in Angriff nehmen.
Dies ist der 🏁-Block, der mit dem Hauptblock aus anderen Sprachen verglichen werden kann.
Trauben und Wassermelonen deklarieren Codeblöcke in Emojicode.
Dies deklariert einen "eingefrorenen" Namen
str
und setzt diesen Wert auf eine neue Zeichenfolge, die mit dem Initialisierer (Konstruktor) erstellt wurde. Er nimmt eine Eingabeaufforderung als Zeichenfolge und gibt dann eine Zeile vom Benutzer ein. Warum ein Frozen anstelle einer Variablen verwenden? Es ändert sich nicht, sodass eine Variable eine Warnung ausgibt.Lassen Sie es uns aufschlüsseln.
🚂str 10
ruft die 🚂 -Methode für dasstr
eingefrorene Objekt mit dem Argument 10 auf. Konventionell konvertieren Methoden mit dem Namen eines Typs das Objekt in diesen Typ. 10 ist die Basis für die Ganzzahlkonvertierung. Diese Methode gibt eine optionale,🍬🚂
. Optionals können einen Wert vom Basistyp oder Nichts enthalten, ⚡. Wenn die Zeichenfolge keine Zahl enthält, wird ⚡ zurückgegeben. Um den Wert zu verwenden, muss man das optionale mit 🍺 auspacken, was einen Laufzeitfehler auslöst, wenn der Wert ⚡ ist. Aus diesem Grund ist es empfehlenswert, vor dem Auspacken eines optionalen Geräts zu prüfen, ob keine Informationen vorliegen. Tatsächlich ist es so üblich, dass Emojicode eine Abkürzung dafür hat. Normalerweise🍊
ist ein "wenn".🍊🍦 variable expression
bedeutet: bewerte den Ausdruck. Wenn das optionale Element nichts enthält, wird die Bedingung mit false (falsch) bewertet. Andernfalls wird ein eingefrorener Namevariable
mit dem nicht umbrochenen Wert der Option erstellt, und die Bedingung wird mit to (wahr) ausgewertet. Daher wird im normalen Gebrauch der🍇 ... 🍉
Block eingegeben , der der Bedingung folgt.🅰️ ist die Methode, die der Hauptcode zu 🚂 hinzufügt, indem er 🐋 verwendet, um die Anzahl der Partitionen zu berechnen. Dies ruft 🅰️ auf der
num
eingefrorenen Bedingung auf, die wir in der Bedingung deklariert haben, und konvertiert das Ergebnis mit der Methode 🔡 zur Basis 10 in einen String. Dann druckt 😀 das Ergebnis.🍓 bedeutet "else", daher wird dieser Block eingegeben, wenn der Benutzer eine Nummer nicht korrekt eingegeben hat.
Gibt das String-Literal aus.
Nun schauen wir uns das Hauptprogramm an. Ich werde die ungolfed Version erklären; Bei der Golf-Version wurde nur das Leerzeichen entfernt und die Variablen in Einzelbuchstaben umbenannt.
Erweitern Sie die Klasse 🚂. Dies ist eine Funktion, die in Programmiersprachen nicht häufig vorkommt. Anstatt eine neue Klasse mit 🚂 als Oberklasse zu erstellen, wird, direkt geändert.
Erstellt eine neue Methode mit dem Namen 🅰️, die ein 🚂 zurückgibt. Es gibt die Anzahl der Partitionen zurück, die mit der Formel berechnet wurden
a(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🐕 ähnelt
this
oder stammtself
aus anderen Sprachen und bezieht sich auf das Objekt, für das die Methode aufgerufen wurde. Diese Implementierung ist rekursiv, daher ist dies die Abschlussbedingung: Wenn die Zahl, auf die die Methode aufgerufen wurde, kleiner oder gleich 1 ist, wird 1 zurückgegeben.Erstellen Sie eine neue Variable
sum
und setzen Sie sie auf 0. Nimmt implizit den Typ 🚂 an.🔂 iteriert über alles, was das Protokoll implementiert, während ⏩ ein Bereichsliteral ist, das gerade implementiert. Ein Bereich hat einen Startwert, einen Stoppwert und einen Schrittwert, der als 1 wenn
start < stop
oder -1 sonst angenommen wird. Sie können den Schrittwert auch angeben, indem Sie mit ⏭ das Bereichsliteral erstellen. Der Startwert ist inklusive, während der Stoppwert exklusiv ist. Dies ist also äquivalent zufor k in range(n)
oderSum_{k=0..n-1}
in der Formel.Wir müssen Sigma (n - k) oder mit
n - k
anderen Worten die Summe der Teiler von berechnen , und das Argument wird einige Male benötigt, sodass esn - k
in der Variablen gespeichert wirdnmk
, um einige Bytes zu sparen.Dies setzt die
sig
Variable auf das Argument von Sigma und durchläuft alle Zahlen von 1 bisnmk - 1
. Ich könnte die Variable auf 0 initialisieren und über 1..nmk iterieren, aber dies ist kürzer.🚮 berechnet den Rest oder Modul und 😛 prüft auf Gleichheit, so dass die Bedingung 👍 ist, wenn
i
ein Teiler von istnmk
.Dies ist eine telefonische Aufgabe, ähnlich der
+= -= >>=
Bedienerfamilie in einigen der minderwertigen, emojifreien Sprachen. Diese Zeile kann auch als geschrieben werden🍮 sig ➕ sig i
. Enthält daher nach Beendigung der inneren Schleifesig
die Summe der Teiler vonn - k
odersigma(n - k)
Eine weitere Zuweisung per Anruf, dies addiert
sigma(n - k) * A(k)
sich also genau wie in der Formel zur Gesamtsumme.Schließlich wird die Summe durch n dividiert und der Quotient zurückgegeben. Diese Erklärung hat wahrscheinlich dreimal so lange gedauert wie das Schreiben des Codes selbst ...
quelle
Pari / GP , 8 Bytes
Probieren Sie es online!
quelle
Oktave, 18 Bytes
Verwendet die eingebaute Funktion partcnt.
Wenn Sie eine anonyme Funktion mit @ nicht verwenden können, ist eine gewisse Hilfe hilfreich.
quelle
Retina , 34 Bytes
Probieren Sie es online!
Erläuterung
Konvertieren Sie die Eingabe in Unary.
Dies berechnet alle 2 n-1 Partitionen der Liste der unären Ziffern. Wir tun dies durch wiederholtes (
+
) Anpassen der ersten (1
) Nicht-Wort-Grenze (\B
dh einer Position zwischen zwei1
s) in jeder Zeile (%
) und Ersetzen durch;
alles danach ($'
), einen Zeilenvorschub (¶
) und alles davor es ($`
) und,
. Beispiel:Wird
Wo
v
markiert das Ergebnis von$'
und^
markiert das Ergebnis$`
. Dies ist eine gebräuchliche Redewendung, um das Ergebnis von zwei verschiedenen Ersetzungen gleichzeitig zu erhalten (wir fügen im Grunde genommen sowohl die;
als auch die ein,
Ersetzung als auch die fehlenden "Hälften" der Zeichenkette ein, um zwei vollständige Ersetzungen abzuschließen).Wir werden
;
als tatsächliche Partitionen und,
nur als Platzhalter behandeln, die eine spätere\B
Übereinstimmung dort verhindern. Also weiter ...... wir entfernen diese Kommas. Das gibt uns alle Partitionen. Zum Beispiel für die Eingabe erhalten
4
wir:Die Reihenfolge ist uns allerdings egal:
Dies sortiert die Läufe von
1
s in jeder Zeile, so dass wir ungeordnete Partitionen erhalten.Schließlich zählen wir die eindeutigen (
@
) Übereinstimmungen.+
, dh wie viele verschiedene Linien / Partitionen wir erhalten haben. Ich habe diese@
Option vor langer Zeit hinzugefügt , sie dann komplett vergessen und erst kürzlich wiederentdeckt. In diesem Fall wird ein Byte über die erste Deduplizierung der Zeilen mit gespeichertD`
.quelle
Python 2 ,
5453 BytesProbieren Sie es online!
Wie es funktioniert
Jede Partition von n kann als Liste x = [x 1 ,,, x m ] dargestellt werden, so dass x 1 + ⋯ + x m = n . Diese Darstellung wird eindeutig, wenn wir x 1 ≤ ⋯ ≤ x m benötigen .
Wir definieren eine Hilfsfunktion f (n, k) , die die Partitionen mit der Untergrenze k , dh die Listen x, so zählt, dass x 1 + ⋯ + x m = n und k ≤ x 1 ≤ ⋯ ≤ x m . Für die Eingabe n fragt die Abfrage nach der Ausgabe von f (n, 1) .
Für positive ganze Zahlen n und k , so daß k ≤ n , gibt es mindestens eine Trennwand mit Untergrenze k : Die Singleton - Liste [n] . Wenn n = k (insbesondere wenn n = 1 ), ist dies die einzige in Frage kommende Partition. Wenn andererseits k> n ist , gibt es überhaupt keine Lösungen.
Wenn k <n ist , können wir die verbleibenden Partitionen rekursiv zählen, indem wir sie wie folgt von links nach rechts erstellen. Für jeden j , so dass k ≤ j ≤ n / 2 , wir Partitionen bauen [x 1 , ⋯, x m ] = [j, y 1 , ⋯, Y m-1 ] . Wir haben x 1 + ⋯ + x m = n genau dann, wenn y 1 ist + ⋯ + y m-1 = n - j . Außerdem ist x 1 ≤ ⋯ ≤ x m genau dann, wenn j ≤ y 1 ≤ ⋯ ≤ y m-1 ist .
Daher können die Partitionen x von n , die mit j beginnen , als f (n - j, j) berechnet werden , wobei die gültigen Partitionen y gezählt werden . Indem wir j ≤ n / 2 voraussetzen, stellen wir sicher, dass j ≤ n - j ist , also gibt es mindestens ein y . Wir können also alle Partitionen von n zählen, indem wir 1 (für [n] ) und f (n - j, j) für alle gültigen Werte von j addieren .
Der Code ist eine einfache Implementierung der mathematischen Funktion f . Außerdem wird k standardmäßig auf 1 gesetzt , sodass
f(n)
der Wert von f (n, 1) für die Eingabe von n berechnet wird .quelle
J ,
37-35BytesProbieren Sie es online!
Erläuterung
quelle
p(n) = sum(sigma(n-k) * p(k) for k = 0 to n-1) / n
. Ich werde später eine Erklärung des Codes hinzufügen, wenn ich glaube, dass er nicht wesentlich gekürzt werden kann.JavaScript,
125121 BytesProbieren Sie es online!
Warnung: Die zeitliche und räumliche Komplexität ist exponentiell. Funktioniert sehr langsam bei großen Stückzahlen.
quelle
Python 2 , 89 Bytes
-9 bytes von Mr.Xcoder -1 byte von notjagan
Probieren Sie es online!
quelle
¯\_(ツ)_/¯
- Übrigens, wenn Sie eine vollständige FunktionGelee , 13 Bytes
Probieren Sie es online!
Die Lösung von n = 1000 auf TIO dauert 5 Sekunden.
quelle
Java 8 (229 Byte)
Ungolfed:
quelle
Gelee , 3 Bytes
Das
Œṗ
Atom wurde kürzlich hinzugefügt und bedeutet "Ganzzahlige Partitionen".Probieren Sie es online!
quelle
Pyt , 2 Bytes
Erläuterung:
quelle
JavaScript ES7, 69 Bytes
JavaScript ES6, 71 Bytes
Zeitkomplexität O (n ^ n), also seien Sie vorsichtig (eine offensichtliche Verzögerung erscheint auf meinem Computer für
F(6)
)quelle