Zadanie
Napisz funkcję / program, który przyjmuje
n
jako parametr / dane wejściowe i wypisuje / zwraca liczbę topologii (co pokazano poniżej) na zestawie{1,2,...,n}
.
Definicja topologii
Niech X będzie dowolnym zbiorem skończonym i załóżmy, że T, który jest podzbiorem zbioru mocy X (tj. Zbioru zawierającego podzbiory X), spełnia następujące warunki :
X i pusty zestaw znajdują się w T.
Jeśli dwa zbiory U i V są w T, to połączenie tych dwóch zbiorów jest w T.
Jeśli dwa zbiory U i V znajdują się w T, to przecięcie tych dwóch zbiorów znajduje się w T.
... wtedy T nazywa się topologią X.
Dane techniczne
Twój program to:
- funkcja, która przyjmuje
n
jako parametr - lub program, który wprowadza
n
i drukuje lub zwraca liczbę (odrębnych) topologii w zestawie
{1,2,...,n}
.- funkcja, która przyjmuje
n
jest dowolną nieujemną liczbą całkowitą, która jest mniejsza niż 11 (oczywiście nie ma problemu, jeśli twój program obsługuje n większą niż 11), a wynik jest liczbą całkowitą dodatnią.Twój program nie powinien używać żadnych funkcji bibliotecznych ani funkcji rodzimych, które bezpośrednio obliczają liczbę topologii.
Przykładowe dane wejściowe (wartość n): 7
Przykładowe wyjście / powrót: 9535241
Możesz sprawdzić wartość zwrotu tutaj lub tutaj .
Oczywiście, najkrótszy kod wygrywa.
Zwycięzca zostaje wyłoniony, jednak mogę go zmienić, jeśli pojawi się krótszy kod.
źródło
Odpowiedzi:
Haskell, 144 znaków
Prawie bezpośrednia implementacja specyfikacji, modulo trochę magii monad.
Niezwykle wolno dla
n > 4
.źródło
Python, 147 znaków
Szybkie dla N <= 6, wolne dla N = 7, mało prawdopodobne, aby N> = 8 kiedykolwiek się zakończyło.
Poszczególne zestawy są reprezentowane przez całkowite maski bitowe, a topologie przez zestawy bitmask.
S(i,K)
oblicza liczbę różnych topologii, które można utworzyć, zaczynając odK
i dodając zestawy z maskami bitowymi> =i
.źródło
Zsh, 83 znaki
To rozwiązanie odpowiada literze twoich wymagań (ale nie ducha, oczywiście). Niewątpliwie istnieje sposób na jeszcze większe skompresowanie liczb.
źródło
Python, 131 znaków
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))
Wersja rozszerzona:
Załóżmy na przykład, że n = 3. Możliwe podzbiory [n] to
gdzie i-ty bit wskazuje, czy i znajduje się w podzbiorze. Do kodowania zestawy podzbiorów, zauważamy, że każdy z tych podzbiorów albo należy, albo nie należy do danego zestawu. Tak więc na przykład
wskazuje, że x zawiera {}, {2} i {1,2,3}.
źródło