Tâche
Écrivez une fonction / un programme qui prend
n
comme paramètre / entrée et imprime / renvoie le nombre de topologies (qui est illustré ci-dessous) sur l'ensemble{1,2,...,n}
.
Définition de la topologie
Soit X tout ensemble fini, et supposons que T, qui est un sous-ensemble de l'ensemble de puissance de X (c'est-à-dire un ensemble contenant des sous-ensembles de X), remplit ces conditions :
X et l' ensemble vide sont en T.
Si deux ensembles U et V sont en T, alors l' union de ces deux ensembles est en T.
Si deux ensembles U et V sont en T, alors l' intersection de ces deux ensembles est en T.
... alors T est appelé la topologie sur X.
Caractéristiques
Votre programme est soit:
- une fonction qui prend
n
comme paramètre - ou un programme qui saisit
n
et imprime ou renvoie le nombre de topologies (distinctes) sur l'ensemble
{1,2,...,n}
.- une fonction qui prend
n
est un entier non négatif inférieur à 11 (bien sûr, il n'y a pas de problème si votre programme gère n supérieur à 11), et la sortie est un entier positif.Votre programme ne doit utiliser aucun type de fonctions de bibliothèque ou de fonctions natives qui calcule directement le nombre de topologies.
Exemple d'entrée (valeur de n): 7
Exemple de sortie / retour: 9535241
Vous pouvez vérifier votre valeur de retour ici ou ici .
Bien sûr, le code le plus court gagne.
Le gagnant est décidé, cependant, je peux le changer si un code plus court apparaît.
la source
Réponses:
Haskell, 144 caractères
Presque une implémentation directe de la spécification, modulo un peu de magie monade.
Extrêmement lent pour
n > 4
.la source
Python, 147 caractères
Rapide pour N <= 6, lent pour N = 7, improbable N> = 8 ne sera jamais terminé.
Les ensembles individuels sont représentés par des masques de bits entiers et les topologies par des ensembles de masques de bits.
S(i,K)
calcule le nombre de topologies distinctes que vous pouvez former en commençant parK
et en ajoutant des ensembles avec des masques de bits> =i
.la source
Zsh, 83 caractères
Cette solution correspond à la lettre de vos besoins (mais pas, bien sûr, à l'esprit). Il existe sans aucun doute un moyen de compresser encore plus les chiffres.
la source
Python, 131 caractères
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))
Version étendue:
Par exemple, supposons que n = 3. Les sous-ensembles possibles de [n] sont
où le ième bit indique si i est dans le sous-ensemble. Pour coder des ensembles de sous-ensembles, nous remarquons que chacun de ces sous-ensembles appartient ou n'appartient pas à l'ensemble en question. Ainsi, par exemple,
indique que x contient {}, {2} et {1,2,3}.
la source