トポロジを確認する


25

チャレンジ

T有限集合のサブセットの集合が与えられたS={1,2,3,...,n}場合Tトポロジーかどうかを判断します。

説明

Powersetの P(S)一部のセットのはS、すべての部分集合の集合ですS。いくつかの例:

S = {}, P(S) = {{}}
S = {1}, P(S) = {{}, {1}}
S = {1,2}, P(S) = {{}, {1}, {2}, {1,2}}
S = {1,2,3}, P(S) = {{}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}}

トポロジー Tセット上でSのサブセットでありP(S)、以下の特性を有します:

  • {}あり、TありSますT
  • もしABしているTそのように彼らの交点がありますA ∩ B
  • もしABしているTそのように労働組合がありますA ∪ B*

*この定義は完全に正しいものではありませんが、有限集合の場合に当てはまります。これはこの課題の目的には十分です。実際の公理は無限の結合も可能にしますが、それは有限の場合には無関係です。

詳細

  • S = {1,2,...,n}(またはS = {0,1,...,n})がnの集合に現れる最大の整数であると仮定できTます。
  • 入力形式は柔軟です。文字列、リストのリストまたはリストのセット、または言語が処理できる同様の形式を使用できます。S = {0,1,...,n}より便利な場合のようにセットを使用することもできます。
  • 出力は、真偽または偽である必要があります。
  • 追加の入力としてn(または、n+1またはn-1)を使用することができます。
  • 順序付きリストを使用する場合、セット内の番号がソートされていると想定できます。また、リストに特定の順序があると仮定することもできます(辞書式など)。
  • セットを表すので、それらのリスト表現の2つのエントリが等しくないと仮定できます。

トポロジー

{{}}  over {}
{{},{1}} over {1}
P(S) over S (see in the explanation)
{{},{1},{1,2}} over {1,2}
{{},{1},{2,3},{1,2,3}} over {1,2,3}
{{1}, {1,2,3}, {1,4,5,6}, {1,2,3,4,5,6}, {}, {2,3}, {4,5,6}, {2,3,4,5,6}}
{{}, {1}, {2,3}, {2}, {4,5,6}, {5,6}, {5}, {2,5,6}, {2,5}, {1,5}, {1,2,3,4,5,6}, {1,2,3}, {1,2}, {1,4,5,6}, {1,5,6}, {1,2,5,6}, {2,3,4,5,6}, {2,3,5,6}, {2,3,5}, {1,2,3,5}, {2,4,5,6}, {1,2,5}, {1,2,3,5,6}, {1,2,4,5,6}}
{{}, {1}, {1,2}, {1,2,3}, {1,2,3,4}, {1,2,3,4,5}, {1,2,3,4,5,6}, {1,2,3,4,5,6,7}, {1,2,3,4,5,6,7,8}, {1,2,3,4,5,6,7,8,9}}
{{}, {1}, {1,2,3}, {1,2,3,4,5}, {1,2,3,4,5,6,7}, {1,2,3,4,5,6,7,8,9}}

非トポロジ

{{1}} because {} is not contained
{{},{2}} because {1,2} is not contained
{{},{1,2},{2,3}} because the union {1,2,3} is not contained
{{},{1},{1,2},{2,3},{1,2,3}} because the intersection of {1,2} and {2,3} is not contained
{{},{1},{2},{3},{1,2},{2,3},{1,2,3}} because the union of {1} and {3} is not contained
{{}, {1}, {2,3}, {2}, {4,5,6}, {5,6}, {5}, {2,5,6}, {2,5}, {1,5}, {1,2,3,4,5,6}, {1,2,3}, {1,2}, {1,4,5,6}, {1,5,6}, {1,2,5,6}, {2,3,4,5,6}, {2,3,5,6}, {2,3,5}, {2,4,5,6}, {1,2,5}, {1,2,3,5,6}, {1,2,4,5,6}} because {1,2,3,5} is missing
{{}, {1}, {2}, {1,2,3}, {1,2,3,4,5}, {1,2,3,4,5,6,7}, {1,2,3,4,5,6,7,8,9}} because {1,2} is missing 

2
この質問に対する多くの回答は、入力{{}、{2}}に対して行われるようです。なぜなら、入力がSであるかどうかを明示的にチェックしない一方で、Sは暗黙的に{1 2}。これは仕様の有効な読み物ですか、それとも何か不足していますか?
カーマイスター

@Carmeister混乱してごめんなさい、はい、あなたの解釈は正しいです!
-flawr

入力は、各行がセットであり、各列が要素であり、値が要素がセット内にあるかどうかを示すバイナリ行列にすることができますか?
ルイスメンドー

はい、私はそれが受け入れられると思います。
-flawr

Tセットであるため、入力のサブセットが繰り返されて{{}, {1,2}, {1,2}}いない(つまり、有効な入力ではない)と仮定するのが妥当だと思います。チャレンジで肯定的または否定的にそれを明確にできますか?
ルイスメンドー

回答:



5

Haskell95 89 74 78バイト

import Data.List
t#n=all(`elem`t)$sort<$>[1..n]:[]:([union,intersect]<*>t<*>t)

オンラインでお試しください!

説明:

                              ([union,intersect]<*>t<*>t) -- create all unions & intersections 
                    [1..n]:[]:                            -- add the empty list and the full list
             sort<$>                                --sort them all
                                -- (as 'union' does not necessarily produce sorted outputs)
all(`elem`t)$                   -- check whether they are all already contained

どう[[],[2]]?これはトポロジですが、暗黙の(「あなたはそれを想定できます...」)セットではありません。
クリスチャンシーバーズ

@ChristianSieversが修正されました!
-flawr

5

Mathematica、87 73 66 63バイト

Outer[{#⋂#2,#⋃#2}&,#,#,1]~Flatten~2⋃{{},Range@#2}==#⋃#&

取り[T, n]、入力として。

説明

{#⋂#2,#⋃#2}&

入力の交差点と和集合を返す関数

Outer[ ... ,#,#,1]

その関数をレベル1の入力リストにマッピングします。

... ~Flatten~2

結果をフラット化しOuterます(パーツはネストされたListsの束を返します)。

... ⋃{{},Range@#2}

平坦化されたリストとを結合し{{}, S}ます。これは、重複を削除し、追加{}し、S結果のリストに。

... ==#⋃#

上記のリストがソートされた入力のバージョンと等しいかどうかを確認します。


4

MATL、38バイト

!t~hXAs1>GXBXH2Z^!"@Z}Z|1MZ&hHm]vAGn~+

入力は、各行がセットであり、各列が要素であり、各エントリがメンバーシップを示すバイナリマトリックスです。たとえば、{{},{1},{1,2}}はとして表され[0 0;1 0;1 1]ます。リンクされたOctaveプログラムを使用して、この形式に変換します。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

!        % Implicit input. Transpose
t~       % Push a negated copy
h        % Horizontally concatenate both matrices
XA       % All: true for columns containing only 1
s        % Sum
1>       % Does it exceed 1? If so, both the empty set and the total
         % set are in the input
G        % Push input again
XB       % Convert each row from binary to decimal. This gives a column
         % vector of numbers that encode each set's contents. Union and
         % intersection will be done as bitwise XOR and AND
XH       % Copy to clipboard H
2Z^!     % Cartesian square transposed: gives all pairs of numbers as
         % columns of a matrix
"        % For each column
  @      %   Push current column
  Z}     %   Split into the two numbers
  Z|     %   Bitwise XOR
  1M     %   Push the two numbers again
  Z&     %   Bitwise AND
  h      %   Concatenate the two results horizontally
  Hm     %   Are they members of the vector of encoded sets? This gives
         %   a row vector with the two results
]        % End
v        % Concatenate all stack contents into a vertical vector
A        % Does it only contain ones? This is the main result: true iff
         % input is a non-empty topology. The empty input gives false,
         % and so it needs to be special cased
G        % Push input again
n~       % Is it empty?
+        % Add thw two results. Implicit display

1
D:プログラムはタイトルよりも多くのスペースを占有します!
-flawr

3

パイソン292の71 122バイト

  • 19バイトを大幅に削減してくれた@ovsに感謝します。&また|、集合演算の略記にも感謝します。
  • 5バイトありがとう@notjagan
  • 2バイトの@ovsに感謝:set()asi-i

入力としてセットのリストを受け取り、True / falseを返すLambda。空のセットがあり、各セットのユニオンとインターセクションがあるかどうかを確認するだけです(2つのセットがi andj)が指定されたセットのリストに存在するます。

lambda x:x.sort()or all(k in x[-1]for k in range(1,max(x[-1])))and all(a in x for i in x for j in x for a in[i-j,i|j,i&j])

オンラインでお試しください!



@ovsどうもありがとう、速記を知らなかった!
officialaimm

@ovs私は実際に明示的にリストから、アイテムを変換していますinput()set()フッターに。
officialaimm


1
あなたは置き換えることができset()i-ii^i
OVS

2

CJam(23バイト)

{[,M2$2m*{_~&\~|$}/]^!}

オンラインテストスイート。これは匿名ブロック(関数)です。私は仮定しS = {0,1,...,n}ます。ブロックは、ソートされた配列との配列取りn+1パラメータや葉など0、または1スタック上に。この場合{{}}、コードとテストフレームワークはそれを仮定しn+1 = 0ます。


2

Pyth、24 23バイト

q@aasm,@Fd{Ssd*QQYJUEyJ

テストスイート

このプログラムは、入力を順序付きリストの順序付きリストとして受け取ります。内部リストは昇順である必要があり、順序リストは長さによって辞書順にソートする必要があります。これが許可されている入力形式であることを確認しました。番号は0から始まり、N + 1も入力として使用されます。

それがどのように機能するかについては、P(S)にないもの[]をすべて除外し、S 、、すべてのペアの交点およびすべてのペアの和集合を追加し、重複排除し、結果が入力と等しいことを確認します。


0

公理、358バイト

t(a,s)==(aa:=sort(removeDuplicates(a));ss:=sort(removeDuplicates(s));a:=sort(a);s:=sort(s);a~=aa or s~=ss=>false;a:=map(sort, a);~member?([],a) or ~member?(s,a)=>false;for x in a repeat(for j in x repeat if ~member?(j,s) then return false;for y in a repeat if ~member?(sort(setIntersection(x,y)),a) or ~member?(sort(setUnion(x,y)),a) then return false);true)

ungolfedと結果:

-- all the List have to be sorted because in list [1,2]~=[2,1]
-- So here "set" means: "List without duplicate, sorted with sort() function"
-- Return true if 
-- 1) a,s are set for above definition
-- 2) a is in P(s) 
-- 3) s,[] are in a
-- 4) for all x and y in a => xUy is in a and x intersect y is in a
t1(a:List List INT, s:List INT):Boolean==
    aa:=sort(removeDuplicates(a));ss:=sort(removeDuplicates(s))
    a :=sort(a);                  s :=sort(s)
    a~=aa          or s~=ss        =>false   -- they are not sets but list with element duplicate
    a:=map(sort, a)                          -- subset of a has to be sorted too
    ~member?([],a) or ~member?(s,a)=>false
    for x in a repeat
       for j in x repeat if ~member?(j,s) then return false 
       for y in a repeat if ~member?(sort(setIntersection(x,y)),a) or ~member?(sort(setUnion(x,y)),a) then return false
    true

(4) -> t([[]], [])
   (4)  true
                                                            Type: Boolean
(5) -> t([[],[1]], [1])
   (5)  true
                                                            Type: Boolean
(6) -> t([[],[1],[2,1]], [1,2])
   (6)  true
                                                            Type: Boolean
(7) -> t([[],[1],[2,3],[1,2,3]], [3,1,2])
   (7)  true
                                                            Type: Boolean
(8) -> t([[1], [1,2,3], [1,4,5,6], [1,2,3,4,5,6], [], [2,3], [4,5,6], [2,3,4,5,6]], [1,2,3,4,5,6])
   (8)  true
                                                            Type: Boolean
(9) -> t([[], [1], [2,3], [2], [4,5,6], [5,6], [5], [2,5,6], [2,5], [1,5], [1,2,3,4,5,6], [1,2,3], [1,2], [1,4,5,6], [1,5,6], [1,2,5,6], [2,3,4,5,6], [2,3,5,6], [2,3,5], [1,2,3,5], [2,4,5,6], [1,2,5], [1,2,3,5,6], [1,2,4,5,6]], [1,2,3,4,5,6])
   (9)  true
                                                            Type: Boolean
(10) -> t([[], [1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5], [1,2,3,4,5,6], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8,9]], [1,2,3,4,5,6,7,8,9])
   (10)  true
                                                            Type: Boolean
(11) -> t([[], [1], [1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8,9]], [1,2,3,4,5,6,7,8,9])
   (11)  true
                                                            Type: Boolean
(2) -> t([[1]], [1])
   (2)  false
                                                            Type: Boolean
(4) -> t([[],[2]], [1,2])
   (4)  false
                                                            Type: Boolean
(5) -> t([[],[1,2],[2,3]], [1,2,3])
   (5)  false
                                                            Type: Boolean
(6) -> t([[],[1],[1,2],[2,3],[1,2,3]], [1,2,3])
   (6)  false
                                                            Type: Boolean
(7) -> t([[],[1],[2],[3],[1,2],[2,3],[1,2,3]] , [1,2,3])
   (7)  false
                                                            Type: Boolean
(8) -> t([[], [1], [2,3], [2], [4,5,6], [5,6], [5], [2,5,6], [2,5], [1,5],[1,2,3,4,5,6], [1,2,3], [1,2], [1,4,5,6], [1,5,6], [1,2,5,6], [2,3,4,5,6], [2,3,5,6], [2,3,5], [2,4,5,6], [1,2,5], [1,2,3,5,6], [1,2,4,5,6]], [1,2,3,4,5,6])
   (8)  false
                                                            Type: Boolean
(9) -> t([[], [1], [2], [1,2,3], [1,2,3,4,5], [1,2,3,4,5,6,7], [1,2,3,4,5,6,7,8,9]] , [1,2,3,4,5,6,7,8,9])
   (9)  false
                                                            Type: Boolean
(10) -> t([[], [1], [2,3], [2], [4,5,6], [5,6], [5], [2,5,6], [2,5], [1,5],[1,2,3,4,5,6], [1,2,3], [1,2], [1,4,5,6], [1,5,6], [1,2,5,6], [2,3,4,5,6], [2,3,5,6], [2,3,5], [2,4,5,6], [1,2,5], [1,2,3,5,6], [1,2,4,5,6]], [1,2,3,4,5,6])
   (10)  false
                                                            Type: Boolean
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.