{1,2、…、n}のトポロジの数を計算します


9

仕事

nパラメーター/入力として受け取り、セットのトポロジーの数(以下に示す)を出力/返す関数/プログラムを記述します{1,2,...,n}

トポロジーの定義

xは任意の有限集合を、およびのサブセットであるT、と仮定するパワーセット Xの(すなわちXのサブセットを含むセット)は、満足これらの条件を

  1. Xと空のセットはTにあります。

  2. 2組のU及びVがTである場合、組合それら二組のはT.であります

  3. 2つのセットUとVがTにある場合、これら2つのセットの共通部分はTにあります。

... TはXのトポロジと呼ばれます。

仕様書

  1. プログラムは次のいずれかです。

    • nパラメータとして受け取る関数
    • または入力するプログラム n

    そして、セットの(個別の)トポロジの数を出力または返します{1,2,...,n}

  2. n 11未満の任意の非負整数(もちろん、プログラムが11より大きいnを処理する場合は問題ありません)であり、出力は正の整数です。

  3. プログラムでは、トポロジの数を直接計算するライブラリ関数やネイティブ関数を使用しないでください。

入力例(nの値): 7

出力/戻りの例: 9535241

ここまたはここで戻り値を確認できます。

もちろん、最短のコードが優先されます。


勝者は決まりますが、短いコードが表示された場合は勝者を変更することがあります。


今世紀の結果を出さなければならないのか、それとも正当性の証明は十分に良いのか?
Peter Taylor、

@ピーター実際、どれくらいかかるかわかりません。したがって、プログラムの正当性の証明は十分ですが、nが4〜5のように小さい場合でも、プログラムは妥当な時間内に結果を与えるはずです。
JiminP

@ JiminP、n = 12について計算することは、当時の論文の価値があるようで、既知の公式はありません。4または5については、力ずくで数分で実行できると思います。
Peter Taylor

2 ^ Xの不適切なサブセットもトポロジですか?
FUZxxl 2011年

@FUZxxl:はい。それは離散トポロジーと呼ばれていると思います。
JiminP

回答:


4

Haskell、144文字

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]

仕様のほとんど直接的な実装で、モナド魔法を法として。

非常に遅いn > 4


5

Python、147文字

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の場合は高速、N = 7の場合は低速、N> = 8は完了しない可能性があります。

個々のセットは整数のビットマスクで表され、トポロジはビットマスクのセットで表されます。 S(i,K)で開始しK、ビットマスク> =のセットを追加することで、形成できる個別のトポロジの数を計算しますi


0

Zsh、83文字

このソリューションは、要件のレターと一致します(もちろん、精神とは一致しません)。間違いなく、さらに数値を圧縮する方法があります。

a=(0 3 S 9U 5CT 4HO6 5ODFS AMOZQ1 T27JJPQ 36K023FKI HW0NJPW01R);echo $[1+36#$a[$1]]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.