Liczba Bell ( OEIS A000110 ) jest kilka sposobów do podsystemu zbiór N oznaczonych (odrębne) elementów. Numer 0 dzwonka jest zdefiniowany jako 1.
Spójrzmy na kilka przykładów (używam nawiasów, aby oznaczyć podzbiory i nawiasy klamrowe dla partycji):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Istnieje wiele sposobów obliczania numerów dzwonków i możesz dowolnie z nich korzystać. Tutaj zostanie opisany jeden sposób:
Najłatwiejszym sposobem obliczenia liczb Bell jest użycie trójkąta liczbowego przypominającego trójkąt Pascala dla współczynników dwumianowych. Numery dzwonków pojawiają się na krawędziach trójkąta. Zaczynając od 1, każdy nowy rząd w trójkącie jest konstruowany poprzez pobranie ostatniego wpisu w poprzednim rzędzie jako pierwszego, a następnie ustawienie każdego nowego wpisu do jego lewego sąsiada plus jego górnego lewego sąsiada:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Możesz użyć indeksowania 0 lub indeksowania 1. Jeśli używasz indeksowania 0, wejście 3
powinno wypisywać 5
, ale powinno wypisywać, 2
jeśli używasz indeksowania 1.
Twój program musi działać do 15. numeru dzwonka, wysyłając 1382958545
. Teoretycznie twój program powinien być w stanie obsługiwać większe liczby (innymi słowy, nie koduj rozwiązań na stałe).
EDYCJA: Nie musisz obsługiwać danych wejściowych 0 (dla indeksowania 0) lub 1 (dla indeksowania 1), ponieważ nie są one obliczane metodą trójkąta.
Przypadki testowe (przy założeniu indeksowania 0):
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
Odpowiedzi przy użyciu wbudowanej metody (takiej jak BellB [n] w języku Wolfram), która bezpośrednio wytwarza liczby Bell, będą niekonkurencyjne.
Najkrótszy kod (w bajtach) wygrywa.
3
powinno5
wypisać To wyrzuciłoby15
, prawda? I z 1-indeksowaniem dałoby wynik5
3
wyjściowe powinny być wyprowadzane2
. Co wtedy1
da dane wejściowe przy indeksowaniu 1?Odpowiedzi:
Galaretka , 9 bajtów
To używa formuły
który jest zamknięty, gdy n <2 .
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6), 47 bajtów
Pierwszy ma indeks 0, drugi indeks 1.
źródło
Haskell, 36 bajtów
Używa metody trójkąta, poprawnie obsługuje 0, 0.
źródło
R , 31 bajtów
używa wzoru Stirlinga z drugiego rodzaju i oblicza te liczby za pomocą pakietu gmp ; odczytuje ze standardowego wejścia i zwraca wartość jako Big Integer; kończy się niepowodzeniem dla 0; 1-indeksowany.
źródło
Mathematica, 24 bajty
-13 bajtów od @Kelly Lowder!
źródło
Sum[k^#/k!,{k,0,∞}]/E&
ma tylko 24 bajtyGalaretka ,
141211 bajtówWypróbuj online!
Nie trafiłem dokładnie w mocne strony Jelly z
dynamicznym wejściem¡
,Ṫ
zawsze modyfikując tablicę i brak wyprzedzającego atomu (jednobajtowy;@
lub odwrotnyṭ
).źródło
CJam (19 bajtów)
Demo online
Sekcja
źródło
MATL , 14 bajtów
Dane wejściowe są oparte na 0. Wypróbuj online!
Wyjaśnienie
To używa formuły
gdzie p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) jest uogólnioną funkcją hipergeometryczną .
źródło
Python , 42 bajty
Wypróbuj online!
Recursywna formuła pochodzi z umieszczania
n
elementów w partycjach. Z kolei dla każdego elementu decydujemy, czy go umieścić:k
opcjek
dla przyszłych elementówTak czy inaczej zmniejsza pozostałą liczbę
n
elementów do umieszczenia. Mamy więc formułę rekurencyjnąf(n,k)=k*f(n-1,k)+f(n-1,k+1)
if(0,k)=1
, zf(n,0)
n-tym numerem Bell.źródło
Python 2 , 91 bajtów
Wypróbuj online!
B (n) obliczone jako suma liczb Stirlinga drugiego rodzaju.
źródło
s
: ponieważ wywołania rekurencyjne zawsze zmniejszają sięn
i nie ma podziału przezk
ciebie, możesz stracić*k
w pierwszym okresie.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
nie jest rekurencyjny i to jest twoja ostateczna odpowiedź, można pominąćB=
, aby zaoszczędzić 2 bajtyMATLAB,
128103 bajtówDość oczywiste. Pominięcie średnika na końcu linii powoduje wydrukowanie wyniku.
25 bajtów zaoszczędzonych dzięki Luisowi Mendo.
źródło
R , 46 bajtów
Wypróbuj online!
źródło
T
domyślnieTRUE
(aka 1), chyba że zostało ustawione gdzie indziejMATL ,
1918 bajtówWykorzystuje dane wejściowe oparte na 0. Na podstawie relacji nawrotu
Wypróbuj online!
źródło
Ohm , 15 bajtów
Wypróbuj online!
Korzysta z forum Dobińskiego (działa nawet dla B (0) yay ).
Wyjaśnienie
źródło
Python (79 bajtów)
Demo online w Python 2, ale działa również w Python 3.
To buduje trójkąt Aitkena za pomocą rekurencyjnej lambda dla golfowej pętli.
źródło
Haskell , 35 bajtów
Wypróbuj online!
Formula wyjaśniona w mojej odpowiedzi w języku Python .
źródło
J, 17 bajtów
Używa metody obliczania trójkąta.
Wypróbuj online!
Wyjaśnienie
źródło
Python 3 , 78 bajtów
Postanowiłem spróbować obrać inną drogę do obliczeń. To używa formuły Dobińskiego, 0-indeksowane, nie działa dla 0.
Wypróbuj online!
źródło
f
nie jest rekurencyjna, możesz pominąćf=
i zapisać 2 bajtyPython 3 ,
6860 bajtówProsta rekurencyjna konstrukcja trójkąta, ale jest niezwykle nieefektywna ze względów praktycznych. Obliczenie do 15. numeru dzwonka powoduje przekroczenie limitu czasu TIO, ale działa na moim komputerze.
Używa 1-indeksowania i zwraca
True
zamiast 1.Wypróbuj online!
Dzięki @FelipeNardiBatista za oszczędność 8 bajtów!
źródło
PHP , 72 bajty
funkcja rekurencyjna 1-indeksowana
Wypróbuj online!
PHP , 86 bajtów
0-indeksowane
Wypróbuj online!
PHP , 89 bajtów
funkcja rekurencyjna indeksowana 0
Wypróbuj online!
źródło
Alice , 22 bajty
Wypróbuj online!
Używa to metody trójkąta. Dla n = 0 oblicza to B (1), co jest dogodnie równe B (0).
Wyjaśnienie
Jest to standardowy szablon dla programów, które pobierają dane w trybie porządkowym, przetwarzają je w trybie kardynalnym i wyprowadzają wynik w trybie porządkowym.
1
Do szablonu dodano A, aby umieścić tę wartość na stosie poniżej danych wejściowych.Program używa stosu jako rozwijającej się kolejki kołowej do obliczania każdego rzędu trójkąta. Podczas każdej iteracji po pierwszej, jedno niejawne zero poniżej stosu staje się jawnym zerem.
Pierwsza iteracja skutecznie zakłada początkową głębokość stosu równą zero, pomimo wymaganej 1 na górze stosu. W rezultacie 1 zostaje dodane do siebie, a cały trójkąt jest mnożony przez 2. Dzielenie wyniku końcowego przez 2 daje poprawną odpowiedź.
źródło
Pari / GP , 36 bajtów
Wypróbuj online!
źródło