Geben Sie die n-te Glockennummer aus


13

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 3ausgegeben werden 5, sollte aber ausgegeben werden, 2wenn 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.


Wenn Sie die 0-Indizierung verwenden, sollte eine Eingabe von " 3ausgeben"5 ausgegeben 15werden. Und mit 1-Indexierung würde es ausgegeben5
Luis Mendo

Der Grund dafür war, die 0. Glockennummer als Index 0 bei der 0-Indizierung und als Index 1 bei der 1-Indizierung zu zählen. Ihr Weg mag klarer sein, aber die vorhandenen Antworten funktionieren so, also kann ich es jetzt nicht ändern. Ich bin vor ein paar Stunden dieser Site beigetreten
manipuliert

Aber Sie sagen, dass bei der 1-Indizierung die Eingabe 3ausgegeben werden sollte 2. Was würde dann eine Eingabe 1bei 1-Indizierung geben?
Luis Mendo

1 -> 1, 2 -> 1, 3 -> 2 (entsprechend der 0., 1. und 2. Glockenzahl) im Gegensatz zu 0 -> 1, 1 -> 1, 2 -> 2 Vielleicht verwende ich das Falsche Terminologie
manipuliert

Ich glaube ich verstehe. Die erste 1 fehlt in Ihrer Beispieltabelle und Ausgabe, was mich verwirrte
Luis Mendo

Antworten:


2

Gelee , 9 Bytes

ṖµṀcæ.߀‘

Dies verwendet die Formel

Formel

welches geschlossen ist, wenn n <2 ist .

Probieren Sie es online!

Wie es funktioniert

ṖµṀcæ.߀‘  Main link. Argument: n

Ṗ          Pop; yield A := [1, ..., n-1].
 µ         Begin a new, monadic chain with argument A.
  Ṁ        Maximum; yield n-1.
   c       Combinatons; compute (n-1)C(k) for each k in A.
      ߀   Recursively map the main link over A.
    æ.     Take the dot product of the results to both sides.
        ‘  Increment; add 1 to the result.

8

JavaScript (ES6), 47 Byte

f=(n,a=[b=1])=>n--?f(n,[b,...a.map(e=>b+=e)]):b
f=(n,a=[b=1])=>--n?f(n,[b,...a.map(e=>b+=e)]):b

Ersteres ist 0-indiziert, zweiteres ist 1-indiziert.


8

Haskell, 36 Bytes

head.(iterate(last>>=scanl(+))[1]!!)

Verwendet die Dreieck-Methode und verarbeitet 0, 0-basiert korrekt.



4

Mathematica, 24 Bytes

Sum[k^#/k!,{k,0,∞}]/E&

-13 Bytes von @Kelly Lowder!


Sum[k^#/k!,{k,0,∞}]/E&ist nur 24 Bytes
Kelly Lowder

3

Jelly , 14 12 11 Bytes

ṫ0;⁸+\
1Ç¡Ḣ

Probieren 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- ).


3

CJam (19 Bytes)

Xa{X\{X+:X}%+}qi*0=

Online-Demo

Präparation

Xa         e# Start with an array [1]
{          e# Repeat...
  X\       e#   Put a copy of X under the current row
  {X+:X}%  e#   Map over x in row: push (X+=x)
  +        e#   Prepend that copy of last element of the previous row to get the next row
}
qi*        e# ... input() times
0=         e# Select the first element

3

MATL , 14 Bytes

:dtEw1Zh1Ze/Yo

Die Eingabe ist 0-basiert. Probieren Sie es online!

Erläuterung

Dies verwendet die Formel

Bildbeschreibung hier eingeben

wobei p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) die verallgemeinerte hypergeometrische Funktion ist .

:      % Implictly input n. Push array [1 2 ... n]
d      % Consecutive differences: array [1 ... 1] (n-1 entries)
tE     % Duplicate, multiply by 2: array [2 ... 2] (n-1 entries)
w      % Swap
1      % Push 1
Zh     % Hypergeometric function
1Ze    % Push number e
/      % Divide
Yo     % Round (to prevent numerical precision issues). Implicitly display

3

Python , 42 Bytes

f=lambda n,k=0:n<1or k*f(n-1,k)+f(n-1,k+1)

Probieren Sie es online!

Die rekursive Formel stammt aus dem Platzieren von nElementen in Partitionen. Für jedes Element entscheiden wir, ob es platziert werden soll:

  • In eine vorhandene Partition, von der es kAuswahlmöglichkeiten gibt
  • So starten Sie eine neue Partition, die die Anzahl der Auswahlmöglichkeiten kfür zukünftige Elemente erhöht

In beiden Fällen wird die verbleibende Anzahl nder zu platzierenden Elemente verringert . Wir haben also die rekursive Formel f(n,k)=k*f(n-1,k)+f(n-1,k+1)und f(0,k)=1mit f(n,0)der n-ten Bell-Zahl.


2

Python 2 , 91 Bytes

s=lambda n,k:n*k and k*s(n-1,k)+s(n-1,k-1)or n==k
B=lambda n:sum(s(n,k)for k in range(n+1))

Probieren Sie es online!

B (n) berechnet als Summe von Stirlingzahlen der zweiten Art.


Das ist eine schöne Lösung. Beachten Sie, dass die Verwendung von integrierten Stirling-Zahlen der zweiten Art die Berechnung der Bell-Zahlen (bei Verwendung von Mathematica oder ähnlichem) ermöglichen würde
manipuliert

Sie können zwei Bytes direkt in der Definition von s: speichern, da sich die rekursiven Aufrufe immer verringern nund es keine Division durch kSie gibt, können Sie die *kim ersten Term verlieren .
Peter Taylor

Oder Sie können einen Haufen sparen, indem Sie ihn in ein Lambda reduzieren und dabei an ganzen Reihen arbeiten: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)
Peter Taylor,

wie Ihre Funktion Bnicht rekursiv ist und es ist Ihre endgültige Antwort, können Sie die weglassen B=zu 2 Bytes zu speichern
Felipe Nardi Batista

2

MATLAB, 128 103 Bytes

function q(z)
r(1,1)=1;for x=2:z
r(x,1)=r(x-1,x-1);for y=2:x
r(x,y)=r(x,y-1)+r(x-1,y-1);end
end
r(z,z)

Ziemlich selbsterklärend. Das Auslassen eines Semikolons am Ende einer Zeile gibt das Ergebnis aus.

25 Bytes gespart dank Luis Mendo.




2

Ohm , 15 Bytes

2°M^┼ⁿ^!/Σ;αê/≈

Probieren Sie es online!

Benutzt Dobinskis Forum (funktioniert sogar für B (0) yay ).

Erläuterung

2°M^┼ⁿ^!/Σ;αê/≈
2°        ;     # Push 100
  M             # Do 100 times...
   ^             # Push index of current iteration
    ┼ⁿ           # Take that to the power of the user input
      ^!         # Push index factorial
        /        # Divide
         Σ       # Sum stack together
           αê   # Push e (2.718...)
             /  # Divide
              ≈ # Round to nearest integer (Srsly why doesn't 05AB1E have this???)

2

Python (79 Bytes)

B=lambda n,r=[1]:n and B(n-1,[r[-1]+sum(r[:i])for i in range(len(r)+1)])or r[0]

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.



1

J, 17 Bytes

0{]_1&({+/\@,])1:

Verwendet die Dreiecksberechnungsmethode.

Probieren Sie es online!

Erläuterung

0{]_1&({+/\@,])1:  Input: integer n
               1:  The constant 1
  ]                Identity function, get n
   _1&(       )    Call this verb with a fixed left argument of -1 n times
                   on itself starting with a right argument [1]
             ]       Get right argument
       {             Select at index -1 (the last item)
            ,        Join
        +/\@         Find the cumulative sums
0{                 Select at index 0 (the first item)


1

Python 3 , 68 60 Bytes

Einfache 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 Truestatt 1 zurück.

f=lambda r,c=0:r<1or c<1and f(r-1,r-1)or f(r-1,c-1)+f(r,c-1)

Probieren Sie es online!


Vielen Dank an @FelipeNardiBatista für das Speichern von 8 Bytes!


60 Bytes . Die Rückgabe von Booleschen Werten anstelle von Zahlen (0,1) ist in Python akzeptabel
Felipe Nardi Batista


1

Alice , 22 Bytes

/oi
\1@/t&wq]&w.q,+k2:

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. 1Der 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.

1     Append 1 to the implicit empty string on top of the stack
i     Get input n
t&w   Repeat outer loop that many times (push return address n-1 times)
q     Get tape position (initially zero)
]     Move right on tape
&w    On iteration k, push this return address k-1 times
      The following inner loop is run once for each entry in the next row
.     Duplicate top of stack (the last number calculated so far)
q,    Move the entry k spaces down to the top of the stack: this is the appropriate entry
      in the previous row, or (usually) an implicit zero if we're in the first column
+     Add these two numbers
k     Return to pushed address: this statement serves as the end of two loops simultaneously
2:    Divide by two: see below
o     Output as string
@     Terminate

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.