Eine Bellsche Zahl ( OEIS A000110 ) ist die Anzahl von Möglichkeiten, eine Menge von n markierten (unterschiedlichen) Elementen zu partitionieren. Die 0. Bellsche Zahl ist als 1 definiert.
Schauen wir uns einige Beispiele an (ich verwende Klammern, um die Teilmengen und Klammern für die Partitionen zu bezeichnen):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Es gibt viele Möglichkeiten , Bellsche Zahlen zu berechnen, und Sie können jede davon verwenden. Ein Weg wird hier beschrieben:
Der einfachste Weg, Bellsche Zahlen zu berechnen, besteht darin, ein Zahlendreieck zu verwenden, das Pascals Dreieck für die Binomialkoeffizienten ähnelt. Die Glockennummern erscheinen an den Rändern des Dreiecks. Beginnend mit 1 wird jede neue Zeile im Dreieck erstellt, indem der letzte Eintrag in der vorherigen Zeile als erster Eintrag verwendet und dann jeder neue Eintrag auf seinen linken Nachbarn plus seinen oberen linken Nachbarn gesetzt wird:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Sie können 0-Indizierung oder 1-Indizierung verwenden. Wenn Sie die Indizierung 0 verwenden, sollte eine Eingabe von 3
ausgegeben werden 5
, sollte aber ausgegeben werden, 2
wenn Sie die Indizierung 1 verwenden.
Ihr Programm muss bis zur 15. Bell-Nummer funktionieren und ausgeben 1382958545
. Theoretisch sollte Ihr Programm in der Lage sein, größere Zahlen zu verarbeiten (mit anderen Worten, codieren Sie die Lösungen nicht hart).
BEARBEITEN: Sie müssen keine Eingabe von 0 (für die 0-Indizierung) oder 1 (für die 1-Indizierung) verarbeiten, da diese nicht mit der Dreieck-Methode berechnet wird.
Testfälle (unter der Annahme einer 0-Indizierung):
0 -> 1 (OPTIONAL)
1 -> 1
2 -> 2
3 -> 5
4 -> 15
5 -> 52
6 -> 203
7 -> 877
8 -> 4140
9 -> 21147
10 -> 115975
11 -> 678570
12 -> 4213597
13 -> 27644437
14 -> 190899322
15 -> 1382958545
Antworten mit einer integrierten Methode (wie BellB [n] in der Wolfram-Sprache), die direkt Bell-Zahlen erzeugt, sind nicht wettbewerbsfähig.
Kürzester Code (in Bytes) gewinnt.
3
ausgeben"5
ausgegeben15
werden. Und mit 1-Indexierung würde es ausgegeben5
3
ausgegeben werden sollte2
. Was würde dann eine Eingabe1
bei 1-Indizierung geben?Antworten:
Gelee , 9 Bytes
Dies verwendet die Formel
welches geschlossen ist, wenn n <2 ist .
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6), 47 Byte
Ersteres ist 0-indiziert, zweiteres ist 1-indiziert.
quelle
Haskell, 36 Bytes
Verwendet die Dreieck-Methode und verarbeitet 0, 0-basiert korrekt.
quelle
R , 31 Bytes
verwendet die Stirling-Zahl der zweiten Art-Formel und berechnet diese Zahlen mit dem gmp-Paket ; liest aus stdin und gibt den Wert als Big Integer zurück; fehlgeschlagen für 0; 1-indiziert.
quelle
Mathematica, 24 Bytes
-13 Bytes von @Kelly Lowder!
quelle
Sum[k^#/k!,{k,0,∞}]/E&
ist nur 24 BytesJelly ,
141211 BytesProbieren Sie es online!
Hat nicht gerade die Stärken von Jelly mit
dynamischem Input getroffen¡
,Ṫ
immer das Array zu modifizieren und das Fehlen eines vorangestellten Atoms (ein Byte;@
oder Reverse-ṭ
).quelle
CJam (19 Bytes)
Online-Demo
Präparation
quelle
MATL , 14 Bytes
Die Eingabe ist 0-basiert. Probieren Sie es online!
Erläuterung
Dies verwendet die Formel
wobei p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) die verallgemeinerte hypergeometrische Funktion ist .
quelle
Python , 42 Bytes
Probieren Sie es online!
Die rekursive Formel stammt aus dem Platzieren von
n
Elementen in Partitionen. Für jedes Element entscheiden wir, ob es platziert werden soll:k
Auswahlmöglichkeiten gibtk
für zukünftige Elemente erhöhtIn beiden Fällen wird die verbleibende Anzahl
n
der zu platzierenden Elemente verringert . Wir haben also die rekursive Formelf(n,k)=k*f(n-1,k)+f(n-1,k+1)
undf(0,k)=1
mitf(n,0)
der n-ten Bell-Zahl.quelle
Python 2 , 91 Bytes
Probieren Sie es online!
B (n) berechnet als Summe von Stirlingzahlen der zweiten Art.
quelle
s
: speichern, da sich die rekursiven Aufrufe immer verringernn
und es keine Division durchk
Sie gibt, können Sie die*k
im ersten Term verlieren .B=lambda n,r=[1,0]:n and B(n-1,[k*r[k]+r[k-1]for k in range(len(r))]+[0])or sum(r)
B
nicht rekursiv ist und es ist Ihre endgültige Antwort, können Sie die weglassenB=
zu 2 Bytes zu speichernMATLAB,
128103 BytesZiemlich selbsterklärend. Das Auslassen eines Semikolons am Ende einer Zeile gibt das Ergebnis aus.
25 Bytes gespart dank Luis Mendo.
quelle
R , 46 Bytes
Probieren Sie es online!
quelle
T
Standard istTRUE
(aka 1), es sei denn, es wurde woanders eingestelltMATL ,
1918 BytesVerwendet 0-basierte Eingabe. Basierend auf der Wiederholungsrelation
Probieren Sie es online!
quelle
Ohm , 15 Bytes
Probieren Sie es online!
Benutzt Dobinskis Forum (funktioniert sogar für B (0) yay ).
Erläuterung
quelle
Python (79 Bytes)
Online-Demo in Python 2, aber es funktioniert auch in Python 3.
Auf diese Weise wird das Aitken-Dreieck mit einem rekursiven Lambda für eine Golfschleife erstellt.
quelle
Haskell , 35 Bytes
Probieren Sie es online!
Formel erklärt in meiner Python-Antwort .
quelle
J, 17 Bytes
Verwendet die Dreiecksberechnungsmethode.
Probieren Sie es online!
Erläuterung
quelle
Python 3 , 78 Bytes
Ich beschloss, eine andere Route für die Berechnung zu versuchen. Dies verwendet Dobinskis Formel, 0-indiziert, funktioniert nicht für 0.
Probieren Sie es online!
quelle
f
nicht rekursiv ist, können Sie das weglassenf=
und 2 Bytes sparenPython 3 ,
6860 BytesEinfache rekursive Konstruktion des Dreiecks, aber aus praktischen Gründen ineffizient. Wenn Sie bis zur 15. Bell-Zahl rechnen, tritt eine Zeitüberschreitung bei TIO auf, die jedoch auf meinem Computer funktioniert.
Dies verwendet die 1-Indizierung und gibt
True
statt 1 zurück.Probieren Sie es online!
Vielen Dank an @FelipeNardiBatista für das Speichern von 8 Bytes!
quelle
PHP , 72 Bytes
rekursive Funktion 1-indiziert
Probieren Sie es online!
PHP , 86 Bytes
0-indiziert
Probieren Sie es online!
PHP , 89 Bytes
rekursive Funktion 0-indiziert
Probieren Sie es online!
quelle
Alice , 22 Bytes
Probieren Sie es online!
Dies verwendet die Dreiecksmethode. Für n = 0 wird stattdessen B (1) berechnet, was günstigerweise gleich B (0) ist.
Erläuterung
Dies ist eine Standardvorlage für Programme, die Eingaben im Ordinalmodus verarbeiten und das Ergebnis im Ordinalmodus ausgeben.
1
Der Vorlage wurde ein A hinzugefügt, um diesen Wert auf dem Stapel unter der Eingabe abzulegen.Das Programm verwendet den Stapel als expandierende kreisförmige Warteschlange, um jede Zeile des Dreiecks zu berechnen. Während jeder Iteration nach der ersten wird eine implizite Null unter dem Stapel zu einer expliziten Null.
Die erste Iteration geht effektiv von einer anfänglichen Stapeltiefe von Null aus, trotz der erforderlichen 1 oben im Stapel. Infolgedessen wird die 1 zu sich selbst addiert, und das gesamte Dreieck wird mit 2 multipliziert. Wenn Sie das Endergebnis durch 2 dividieren, erhalten Sie die richtige Antwort.
quelle
Pari / GP , 36 Bytes
Probieren Sie es online!
quelle