Tarea
Escriba una función / programa que tome
n
como parámetro / entrada e imprima / devuelva el número de topologías (que se muestra a continuación) en el conjunto{1,2,...,n}
.
Definición de topología
Sea X un conjunto finito y suponga que T, que es un subconjunto del conjunto de potencia de X (es decir, un conjunto que contiene subconjuntos de X), cumple estas condiciones :
X y el conjunto vacío están en T.
Si dos conjuntos U y V están en T, entonces la unión de esos dos conjuntos está en T.
Si dos conjuntos U y V están en T, entonces la intersección de esos dos conjuntos está en T.
... entonces T se llama topología en X.
Especificaciones
Tu programa es:
- una función que toma
n
como parámetro - o un programa que ingresa
n
e imprime o devuelve el número de topologías (distintas) en el conjunto
{1,2,...,n}
.- una función que toma
n
es cualquier número entero no negativo que sea menor que 11 (por supuesto, no hay problema si su programa maneja n mayor que 11), y la salida es un número entero positivo.Su programa no debe usar ningún tipo de funciones de biblioteca o funciones nativas que calculen directamente el número de topología.
Entrada de ejemplo (valor de n): 7
Ejemplo de salida / retorno: 9535241
Puede verificar su valor de devolución aquí o aquí .
Por supuesto, el código más corto gana.
El ganador se decide, sin embargo, puedo cambiarlo si aparece un código más corto.
fuente
Respuestas:
Haskell, 144 caracteres
Casi una implementación directa de la especificación, modulo algo de magia mónada.
Extremadamente lento para
n > 4
.fuente
Python, 147 caracteres
Rápido para N <= 6, lento para N = 7, improbable N> = 8 alguna vez se completará.
Los conjuntos individuales están representados por máscaras de bits enteras y las topologías por conjuntos de máscaras de bits.
S(i,K)
calcula el número de topologías distintas que puede formar al comenzarK
y agregar conjuntos con máscaras de bits> =i
.fuente
Zsh, 83 caracteres
Esta solución coincide con la letra de sus requisitos (pero no, por supuesto, el espíritu). Sin duda, hay una manera de comprimir los números aún más.
fuente
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))
Versión ampliada:
Por ejemplo, supongamos que n = 3. Los subconjuntos posibles de [n] son
donde el bit iésimo indica si estoy en el subconjunto. Para codificar conjuntos de subconjuntos, notamos que cada uno de estos subconjuntos pertenece o no al conjunto en cuestión. Así, por ejemplo,
indica que x contiene {}, {2} y {1,2,3}.
fuente