Tarefa
Escreva uma função / programa que tome
n
como parâmetro / entrada e imprima / retorne o número de topologias (demonstradas abaixo) no aparelho{1,2,...,n}
.
Definição de Topologia
Seja X qualquer conjunto finito e assuma que T, que é um subconjunto do conjunto de potências de X (isto é, um conjunto contendo subconjuntos de X), satisfaz as seguintes condições :
X e o conjunto vazio estão em T.
Se dois conjuntos U e V estiverem em T, a união desses dois conjuntos estará em T.
Se dois conjuntos U e V estiverem em T, a interseção desses dois conjuntos estará em T.
... então T é chamado de topologia no X.
Especificações
Seu programa é:
- uma função que assume
n
como parâmetro - ou um programa que insere
n
e imprime ou retorna o número de topologias (distintas) no aparelho
{1,2,...,n}
.- uma função que assume
n
é qualquer número inteiro não negativo menor que 11 (é claro que não há problema se o seu programa lidar com n maior que 11) e a saída for um número inteiro positivo.Seu programa não deve usar nenhum tipo de função de biblioteca ou função nativa que calcule o número de topologia diretamente.
Exemplo de entrada (valor de n): 7
Exemplo de saída / retorno: 9535241
Você pode verificar seu valor de retorno aqui ou aqui .
Obviamente, o código mais curto vence.
O vencedor está decidido, no entanto, eu posso mudar o vencedor se um código menor aparecer.
fonte
Respostas:
Haskell, 144 caracteres
Quase uma implementação direta da especificação, modulo alguma mônada mágica.
Extremamente lento para
n > 4
.fonte
Python, 147 caracteres
Rápido para N <= 6, lento para N = 7, improvável que N> = 8 seja concluído.
Conjuntos individuais são representados por máscaras de bits inteiras e topologias por conjuntos de máscaras de bits.
S(i,K)
calcula o número de topologias distintas que você pode formar iniciandoK
e adicionando conjuntos com máscaras de bits> =i
.fonte
Zsh, 83 caracteres
Esta solução corresponde à letra de seus requisitos (mas não, é claro, ao espírito). Sem dúvida, há uma maneira de comprimir os números ainda mais.
fonte
Python, 131 caracteres
lambda n:sum(x&(x>>2**n-1)&all((~(x>>i&x>>j)|x>>(i|j)&x>>(i&j))&1 for i in range(2**n)for j in range(2**n))for x in range(2**2**n))
Versão expandida:
Por exemplo, suponha que n = 3. Os possíveis subconjuntos de [n] são
onde o i-ésimo bit indica se i está no subconjunto. Para codificar conjuntos de subconjuntos, notamos que cada um desses subconjuntos pertence ou não ao conjunto em questão. Assim, por exemplo,
indica que x contém {}, {2} e {1,2,3}.
fonte