Un número de Bell ( OEIS A000110 ) es el número de formas de particionar un conjunto de n elementos etiquetados (distintos). El número de 0th Bell se define como 1.
Veamos algunos ejemplos (uso corchetes para denotar los subconjuntos y llaves de las particiones):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Hay muchas formas de calcular los números de Bell, y usted es libre de usar cualquiera de ellos. Aquí se describirá una forma:
La forma más fácil de calcular los números de Bell es usar un triángulo numérico que se asemeje al triángulo de Pascal para los coeficientes binomiales. Los números de la campana aparecen en los bordes del triángulo. Comenzando con 1, cada nueva fila en el triángulo se construye tomando la última entrada de la fila anterior como la primera entrada y luego configurando cada nueva entrada a su vecino izquierdo más su vecino superior izquierdo:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Puede usar 0-indexing o 1-indexing. Si usa la indexación 0, 3
debería producirse una entrada de 5
, pero debería salir 2
si usa la indexación 1.
Su programa debe funcionar hasta el número 15 de la campana, con salida 1382958545
. En teoría, su programa debería poder manejar números más grandes (en otras palabras, no codifique las soluciones).
EDITAR: No es necesario que maneje una entrada de 0 (para indexación 0) o 1 (para indexación 1) porque no se calcula mediante el método del triángulo.
Casos de prueba (suponiendo 0-indexación):
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
Las respuestas que usen un método incorporado (como BellB [n] en Wolfram Language) que produce directamente números de Bell no serán competitivas.
El código más corto (en bytes) gana.
3
salida debe5
Sería ouput15
, ¿verdad? Y con la indexación 1 produciría5
3
debería salir2
. Entonces, ¿qué daría input1
con 1-indexing?Respuestas:
Jalea , 9 bytes
Esto usa la fórmula
que se cierra cada vez que n <2 .
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6), 47 bytes
El primero está indexado a 0, el segundo está indexado a 1.
fuente
Haskell, 36 bytes
Utiliza el método del triángulo, maneja correctamente 0, basado en 0.
fuente
R , 31 bytes
usa la fórmula del número de Stirling del segundo tipo y calcula esos números con el paquete gmp ; lee de stdin y devuelve el valor como un Big Integer; falla por 0; 1 indexado.
fuente
Mathematica, 24 bytes
-13 bytes de @Kelly Lowder!
fuente
Sum[k^#/k!,{k,0,∞}]/E&
solo tiene 24 bytesJalea ,
141211 bytesPruébalo en línea!
No golpeó exactamente los puntos fuertes de Jelly con
una entrada dinámica¡
,Ṫ
siempre modificando la matriz y la falta de un átomo previo (un byte;@
o inversoṭ
).fuente
CJam (19 bytes)
Demostración en línea
Disección
fuente
MATL , 14 bytes
La entrada está basada en 0. Pruébalo en línea!
Explicación
Esto usa la fórmula
donde p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) es la función hipergeométrica generalizada .
fuente
Python , 42 bytes
Pruébalo en línea!
La fórmula recursiva proviene de colocar
n
elementos en particiones. Para cada elemento a su vez, decidimos si colocarlo:k
opcionesk
para elementos futurosDe cualquier manera, disminuye el número restante
n
de elementos para colocar. Entonces, tenemos la fórmula recursivaf(n,k)=k*f(n-1,k)+f(n-1,k+1)
yf(0,k)=1
, conf(n,0)
el enésimo número de Bell.fuente
Python 2 , 91 bytes
Pruébalo en línea!
B (n) calculado como una suma de números de Stirling del segundo tipo.
fuente
s
: ya que las llamadas recursivas siempre se reducenn
y no hay división por lak
que puede perder*k
en el primer término.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
no es recursivo y es su respuesta final, se puede omitir elB=
de salvar a 2 bytesMATLAB,
128103 bytesBastante autoexplicativo. Omitir un punto y coma al final de una línea imprime el resultado.
25 bytes guardados gracias a Luis Mendo.
fuente
R , 46 bytes
Pruébalo en línea!
fuente
T
predeterminado esTRUE
(también conocido como 1) a menos que se haya configurado en otro lugarMATL ,
1918 bytesUtiliza entrada basada en 0. Basado en la relación de recurrencia
Pruébalo en línea!
fuente
Ohm , 15 bytes
Pruébalo en línea!
Utiliza la forumla de Dobinski (incluso funciona para B (0) yay ).
Explicación
fuente
Python (79 bytes)
Demostración en línea en en Python 2, pero también funciona en Python 3.
Esto construye el triángulo de Aitken usando una lambda recursiva para un circuito de golf.
fuente
Haskell , 35 bytes
Pruébalo en línea!
Fórmula explicada en mi respuesta de Python .
fuente
J, 17 bytes
Utiliza el método de cálculo del triángulo.
Pruébalo en línea!
Explicación
fuente
Python 3 , 78 bytes
Decidí probar y tomar una ruta diferente para el cálculo. Esto usa la fórmula de Dobinski, indexada en 0, no funciona para 0.
Pruébalo en línea!
fuente
f
no es recursiva, puede omitirf=
y guardar 2 bytesPython 3 ,
6860 bytesConstrucción recursiva simple del triángulo, pero es muy ineficiente para fines prácticos. Calcular hasta el número 15 de la campana hace que TIO agote el tiempo de espera, pero funciona en mi máquina.
Esto utiliza la indexación 1 y devuelve en
True
lugar de 1.Pruébalo en línea!
¡Gracias a @FelipeNardiBatista por guardar 8 bytes!
fuente
PHP , 72 bytes
función recursiva 1 indexada
Pruébalo en línea!
PHP , 86 bytes
0 indexado
Pruébalo en línea!
PHP , 89 bytes
función recursiva indexada 0
Pruébalo en línea!
fuente
Alice , 22 bytes
Pruébalo en línea!
Esto usa el método del triángulo. Para n = 0, esto calcula B (1) en su lugar, que es convenientemente igual a B (0).
Explicación
Esta es una plantilla estándar para programas que toman la entrada en modo ordinal, la procesan en modo cardinal y generan el resultado en modo ordinal. UN
1
ha agregado A a la plantilla para poner ese valor en la pila debajo de la entrada.El programa usa la pila como una cola circular en expansión para calcular cada fila del triángulo. Durante cada iteración pasada la primera, un cero implícito debajo de la pila se convierte en un cero explícito.
La primera iteración asume efectivamente una profundidad de pila inicial de cero, a pesar del 1 requerido en la parte superior de la pila. Como resultado, el 1 termina siendo agregado a sí mismo, y todo el triángulo se multiplica por 2. Al dividir el resultado final por 2 se obtiene la respuesta correcta.
fuente
Pari / GP , 36 bytes
Pruébalo en línea!
fuente