Um número de campainha ( OEIS A000110 ) é o número de maneiras de particionar um conjunto de n elementos rotulados (distintos). O número 0 da campainha é definido como 1.
Vejamos alguns exemplos (eu uso colchetes para denotar os subconjuntos e chaves para as partições):
1: {1}
2: {[1,2]}, {[1],[2]}
3: {[1,2,3]}, {[1,2],[3]}, {[1,3],[2]}, {[2,3],[1]}, {[1],[2],[3]}
Existem muitas maneiras de calcular os números de campainha e você pode usar qualquer um deles. Uma maneira será descrita aqui:
A maneira mais fácil de calcular os números de Bell é usar um triângulo numérico semelhante ao triângulo de Pascal para os coeficientes binomiais. Os números dos sinos aparecem nas bordas do triângulo. Começando com 1, cada nova linha no triângulo é construída tomando a última entrada na linha anterior como a primeira entrada e definindo cada nova entrada para o vizinho esquerdo mais o vizinho superior esquerdo:
1
1 2
2 3 5
5 7 10 15
15 20 27 37 52
Você pode usar indexação 0 ou indexação 1. Se você usar a indexação 0, uma entrada de 3
deve sair 5
, mas deve sair 2
se você usar a indexação 1.
Seu programa deve trabalhar até o número 15 da Bell, emitindo 1382958545
. Em teoria, seu programa deve ser capaz de lidar com números maiores (em outras palavras, não codifique as soluções).
EDIT: você não precisa lidar com uma entrada de 0 (para indexação 0) ou 1 (para indexação 1) porque não é calculada pelo método do triângulo.
Casos de teste (assumindo a indexação 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
As respostas que usam um método interno (como BellB [n] na Wolfram Language) que produz diretamente números de Bell não serão competitivas.
O código mais curto (em bytes) vence.
3
saída deve5
Seria ouput15
, certo? E com 1-indexação seria de saída5
3
deve sair2
. Então, o que a entrada1
daria com a indexação 1?Respostas:
Geléia , 9 bytes
Isso usa a fórmula
que é fechado sempre que n <2 .
Experimente online!
Como funciona
fonte
JavaScript (ES6), 47 bytes
O primeiro é indexado a 0, o segundo é indexado a 1.
fonte
Haskell, 36 bytes
Usa o método triângulo, manipula corretamente 0, 0 com base.
fonte
R , 31 bytes
usa a fórmula Número Stirling do Segundo Tipo e calcula esses números com o pacote gmp ; lê de stdin e retorna o valor como um número inteiro grande; falha para 0; 1 indexado.
fonte
Mathematica, 24 bytes
-13 bytes de @Kelly Lowder!
fonte
Sum[k^#/k!,{k,0,∞}]/E&
é apenas 24 bytes #Geléia ,
141211 bytesExperimente online!
Não atingiu exatamente os pontos fortes do Jelly com
entrada dinâmica¡
,Ṫ
sempre modificando a matriz e a falta de um átomo precedente (um byte;@
ou reversoṭ
).fonte
CJam (19 bytes)
Demonstração online
Dissecação
fonte
MATL , 14 bytes
A entrada é baseada em 0. Experimente online!
Explicação
Isso usa a fórmula
onde p F q ( a 1 , ..., a p ; b 1 , ..., b q ; x ) é a função hipergeométrica generalizada .
fonte
Python , 42 bytes
Experimente online!
A fórmula recursiva vem da colocação de
n
elementos em partições. Para cada elemento, por sua vez, decidimos se deve colocá-lo:k
opçõesk
para elementos futurosDe qualquer maneira, diminui o número restante
n
de elementos a serem colocados. Portanto, temos a fórmula recursivaf(n,k)=k*f(n-1,k)+f(n-1,k+1)
ef(0,k)=1
, comf(n,0)
o n-ésimo número de Bell.fonte
Python 2 , 91 bytes
Experimente online!
B (n) calculado como uma soma dos números de Stirling do segundo tipo.
fonte
s
: como as chamadas recursivas sempre diminuemn
e não há divisão pork
você pode perder o*k
no primeiro período.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
não é recursiva e é sua resposta final, você pode omitir oB=
para salvar 2 bytesMATLAB,
128103 bytesBastante auto-explicativo. Omitir um ponto e vírgula no final de uma linha imprime o resultado.
25 bytes salvos graças a Luis Mendo.
fonte
R , 46 bytes
Experimente online!
fonte
T
o padrão éTRUE
(aka 1) a menos que ele foi definido em outro lugarMATL ,
1918 bytesUsa entrada com base em 0. Com base na relação de recorrência
Experimente online!
fonte
Ohm , 15 bytes
Experimente online!
Usa o forumla de Dobinski (funciona mesmo para B (0) yay ).
Explicação
fonte
Python (79 bytes)
Demonstração online no Python 2, mas também funciona no Python 3.
Isso cria o triângulo de Aitken usando uma lambda recursiva para um loop de golfe.
fonte
Haskell , 35 bytes
Experimente online!
Fórmula explicada na minha resposta em Python .
fonte
J, 17 bytes
Usa o método de cálculo do triângulo.
Experimente online!
Explicação
fonte
Python 3 , 78 bytes
Decidi tentar seguir uma rota diferente para o cálculo. Isso usa a fórmula de Dobinski, indexada a 0, não funciona para 0.
Experimente online!
fonte
f
não é recursiva, você pode omitir of=
e salvar 2 bytesPython 3 ,
6860 bytesConstrução recursiva simples do triângulo, mas é extremamente ineficiente para fins práticos. O cálculo do número da 15ª campainha faz com que o tempo limite do TIO seja excedido, mas funciona na minha máquina.
Isso usa a indexação 1 e retorna em
True
vez de 1.Experimente online!
Obrigado a @FelipeNardiBatista por salvar 8 bytes!
fonte
PHP , 72 bytes
função recursiva indexada 1
Experimente online!
PHP , 86 bytes
Indexado a 0
Experimente online!
PHP , 89 bytes
função recursiva indexada em 0
Experimente online!
fonte
Alice , 22 bytes
Experimente online!
Isso usa o método do triângulo. Para n = 0, calcula B (1), que é convenientemente igual a B (0).
Explicação
Este é um modelo padrão para programas que recebem entradas no modo ordinal, processam no modo cardinal e produzem o resultado no modo ordinal. UMA
1
foi adicionado ao modelo para colocar esse valor na pilha abaixo da entrada.O programa usa a pilha como uma fila circular em expansão para calcular cada linha do triângulo. Durante cada iteração após a primeira, um zero implícito abaixo da pilha se torna um zero explícito.
A primeira iteração assume efetivamente uma profundidade inicial da pilha igual a zero, apesar do 1 necessário no topo da pilha. Como resultado, o 1 acaba sendo adicionado a si mesmo e o triângulo inteiro é multiplicado por 2. Dividir o resultado final por 2 fornece a resposta correta.
fonte
Pari / GP , 36 bytes
Experimente online!
fonte