토폴로지 확인


25

도전

세트 감안할 때 T유한 집합의 부분 집합을 S={1,2,3,...,n}여부를 결정, TA는 토폴로지 여부.

설명

파워 셋 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}}

세트 의 토폴로지 는 다음 특성 을 가진 서브 세트입니다 .TSP(S)

  • {}안에 T있고 S안에있다T
  • A그리고 B안에 있다면 T그들의 교차점도 마찬가지입니다.A ∩ B
  • A그리고 B안에 있다면 T그들의 노조도 마찬가지입니다 A ∪ B*

*이 정의는 정확하지는 않지만 유한 세트에 대해서는 사실이며, 이는이 과제의 목적에 충분합니다. 실제 공리도 무한한 노동 조합을 허용하지만, 유한 한 경우에는 무관하다.

세부

  • 당신은 S = {1,2,...,n}(또는 대안으로 S = {0,1,...,n}) 어디에 n집합에 나타나는 가장 큰 정수 라고 가정 할 수 있습니다 T.
  • 입력 형식은 유연합니다. 문자열, 목록 목록 또는 목록 세트 또는 언어가 처리 할 수있는 유사한 형식을 사용할 수 있습니다. S = {0,1,...,n}더 편리한 것처럼 세트를 사용할 수도 있습니다 .
  • 결과는 진실이거나 거짓이어야합니다.
  • 추가 입력으로 n(또는 대안으로 n+1또는 n-1) 를 취할 수 있습니다 .
  • 정렬 된 목록으로 작업하는 경우 집합 내의 숫자가 정렬되어 있다고 가정 할 수 있습니다. 또한 목록에 특정 순서가 있다고 가정 할 수도 있습니다 (예 : 사전 형).
  • 우리는 집합을 나타내므로 목록 표현의 두 항목이 같지 않다고 가정 할 수 있습니다.

토폴로지

{{}}  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

@Carmeister 혼란을 드려 죄송합니다. 네 해석이 정확합니다!
flawr

입력은 각 행이 세트이고, 각 열이 요소이며, 값이 요소가 세트에 있는지 여부를 나타내는 이진 행렬 일 수 있습니까?
Luis Mendo

그렇습니다.
flawr

T세트 이기 때문에 입력의 하위 집합이 반복되지 않는다고 가정하는 것이 합리적이라고 생각합니다 (즉 {{}, {1,2}, {1,2}}유효한 입력이 아닙니다). 챌린지에서 긍정적으로 또는 부정적으로 그것을 파급시킬 수 있습니까?
Luis Mendo

답변:



5

하스켈 , 95 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]]? 토폴로지이지만 묵시적 ( "당신은 가정 할 수 있습니다 ...") 세트를 넘어서는 안됩니다.
Christian Sievers

@ChristianSievers가 수정되었습니다!
flawr

5

매스 매 티카, 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

파이썬 2 , 92 71122 바이트

  • 19 바이트를 대폭 줄인 @ovs에게 많은 감사 &|세트 작업을위한 약식.
  • 5 바이트에 대한 @notjagan 감사합니다
  • 2 바이트에 대한 @ovs 덕분에 : set()asi-i

집합 목록을 입력으로 받아서 True / false를 반환하는 Lambda. 간단하게 검사 빈 세트와 노동 조합 및 각 세트의 교차점이있는 경우는 (두 세트로 반복 ij) 세트가 지정된 목록에 있습니다.

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.