{1,2,…, n} 'deki topoloji sayısını hesaplayın


9

Görev

nParametre / giriş olarak alan ve sette topoloji sayısını (aşağıda gösterilmiştir) basan / döndüren bir fonksiyon / program yazın {1,2,...,n}.

Topolojinin Tanımı

X'in herhangi bir sonlu küme olmasına izin verin ve X'in güç kümesinin (yani X'in alt kümelerini içeren bir kümenin) alt kümesi olan T'nin şu koşulları karşıladığını varsayalım :

  1. X ve boş küme T içindedir.

  2. İki set U ve V T'de ise, bu iki setin birleşimi T'dir.

  3. İki set U ve V T'de ise, bu iki setin kesişimi T'dir.

... sonra T'ye X üzerinde topoloji denir.

Özellikler

  1. Programınız:

    • nparametre olarak kullanılan bir işlev
    • veya giriş yapan bir program n

    ve setteki (farklı) topoloji sayısını yazdırır veya döndürür {1,2,...,n}.

  2. n 11'den küçük negatif olmayan bir tamsayıdır (elbette programınız 11'den büyük n'yi işlerse sorun yoktur) ve çıktı pozitif bir tamsayıdır.

  3. Programınız, doğrudan topoloji sayısını hesaplayan herhangi bir kütüphane işlevi veya yerel işlev kullanmamalıdır.

Örnek giriş (n değeri): 7

Örnek çıktı / getiri: 9535241

Dönüş değerinizi burada veya burada kontrol edebilirsiniz .

Tabii ki, en kısa kod kazanır.


Kazanan karar verilir, ancak daha kısa kod görünürse kazananı değiştirebilirim.


Bu yüzyılda sonuç vermek zorunda mı yoksa doğruluk kanıtı yeterince iyi mi?
Peter Taylor

@Peter Aslında, ne kadar süreceği konusunda hiçbir fikrim yok. Bu nedenle, programın doğruluğunun kanıtı yeterince iyidir, ancak yine de n, 4 ~ 5 gibi küçükse, programın makul bir sürede sonuç vermesi gerekir.
JiminP

@JiminP, n = 12 için hesaplamanın gün içinde bir kağıt değerinde olduğu ve bilinen bir formül olmadığı görülüyor. 4 veya 5 için birkaç dakika içinde kaba kuvvetle yapılabileceğinden şüpheleniyorum.
Peter Taylor

2 ^ X'in yanlış alt kümesi de bir topoloji mi?
FUZxxl

@FUZxxl: Evet. Bence buna ayrık topoloji denir .
JiminP

Yanıtlar:


4

Haskell, 144 karakter

import List
import Monad
p=filterM$const[True,False]
f n=sum[1|t<-p$p[1..n],let e=(`elem`t).sort,e[],e[1..n],all e$[union,intersect]`ap`t`ap`t]

Şartnamenin neredeyse doğrudan uygulanması, bazı monad büyüsü modulo.

Son derece yavaş n > 4.


5

Python, 147 karakter

N=input()
S=lambda i,K:1+sum(0if len(set(j&k for k in K)-K)-1 else S(j+1,K|set(j|k for k in K))for j in range(i,2**N))
print S(1,set([0,2**N-1]))

N <6 için hızlı, N = 7 için yavaş, muhtemelen N> = 8 tamamlanmayacaktır.

Bireysel kümeler tamsayı bit maskeleriyle ve topolojiler de bitmask kümeleriyle temsil edilir. > = ile bit maskeleriyle S(i,K)başlayan Kve ekleyerek oluşturabileceğiniz farklı topolojilerin sayısını hesaplar i.


0

Zsh, 83 karakter

Bu çözüm, gereksinimlerinizin mektubuyla eşleşir (ancak elbette ruhla eşleşmez). Şüphesiz sayıları daha da sıkıştırmanın bir yolu var.

a=(0 3 S 9U 5CT 4HO6 5ODFS AMOZQ1 T27JJPQ 36K023FKI HW0NJPW01R);echo $[1+36#$a[$1]]

-1

Python, 131 karakter

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))

Genişletilmiş sürüm:

def f(n):
    count = 0
    for x in range(2**2**n): # for every set x of subsets of [n] = {1,...,n}
        try:
            assert x & 1 # {} is in x
            assert (x >> 2 ** n - 1) & 1 # [n] is in x
            for i in range(2**n): # for every subset i of [n]...
                if x >> i & 1: # ...in x
                    for j in range(2**n): # for every subset j of [n]...
                        if x >> j & 1: # ...in x
                            assert (x >> (i | j)) & 1 # their union is in x
                            assert (x >> (i & j)) & 1 # their intersection is in x
            count += 1
        except AssertionError:
            pass
    return count

Örneğin, n = 3 olduğunu varsayalım. [N] 'nin olası alt kümeleri

0b000
0b001
0b010
0b011
0b100
0b101
0b110
0b111

burada bit biti i alt kümede olup olmadığını gösterir. Alt kümelerin kodlanması için , bu alt kümelerin her birinin söz konusu kümeye ait olduğunu veya söz konusu kümeye ait olmadığını fark ettik. Böylece, örneğin,

x = 0b10100001
0b000 # 1
0b001 # 0
0b010 # 1
0b011 # 0
0b100 # 0
0b101 # 0
0b110 # 0
0b111 # 1

x'in {}, {2} ve {1,2,3} içerdiğini belirtir.


Bunun nasıl çalıştığını açıklayabilir misiniz?
Ad Hoc Garf Hunter

@AdHocGarfHunter Genişletilmiş bir sürüm eklendi.
user76284
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.