벤 다이어그램 셀


12

예 주어 다수의 세트 s1={2,3,7}, s2={1,2,4,7,8}s3={4,7}하는 벤 다이어그램 가시화가 설정된 여부의 요소인지에 따라, 내부 또는 곡선의 경계 외부에있는 폐곡선 및 집합 요소들에 의해 각각의 세트. 모든 집합 요소가 벤 다이어그램에 한 번만 나타나므로 요소가 둘 이상의 집합에있는 경우 각 집합을 나타내는 곡선이 겹치게됩니다. 우리 는 벤 다이어그램 의 을 겹치는 것을 호출합니다 .

이 설명은 약간 혼란 스러울 수 있으므로 예제를 살펴 보겠습니다.

세트의 벤 다이어그램 s1, s2s3같이 수 :

이 벤 다이어그램의 셀 (왼쪽에서 오른쪽으로, 위에서 아래로)되어 {1,8}, {2}, {7}, {4}, {3}, {}{}.

실제로, 4 개 이상의 세트의 벤 다이어그램의 표현이 명확하지 않기 때문에, 하나는 일반적으로 2 개 또는 3 개의 세트의 벤 다이어그램만을 만난다. 그러나 예를 들어 CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309의 6 가지 세트가 있습니다.

작업

합리적인 표현으로 비어 있지 않은 양의 정수 집합이 주어지면 입력 집합의 벤 다이어그램의 셀 집합을 반환하십시오. 특히 그래픽 표현이 필요 하지 않습니다.

  • 당신은 전체 프로그램이나 함수를 작성할 수 있습니다.
  • 빈 셀 (즉 있기 때문에 당신은 많은 빈 집합으로 반환 할 수 있습니다 목록 모든 셀의) 대신 하나의 빈 세트 (즉,의 세트 세포).
  • 위의 예를 들어, 입력의 일부 합리적인 방법을 포함 하나 이에 국한되지 않습니다 {{2,3,7},{1,2,4,7,8},{4,7}}, [[2,3,7],[1,2,4,7,8],[4,7]], "2,3,7;1,2,4,7,8;4,7"또는 "2 3 7\n1 2 4 7 8\n4 7". 선택한 입력 형식이 수용 가능한지 확실하지 않은 경우 언제든지 의견을 말하십시오.
  • 가능하면 출력 형식이 입력 형식과 일치해야합니다. 이 규칙을 사용하려면 형식이 빈 세트를 명확하게 표시 할 수 있어야합니다.
  • 이것은 이므로 원하는 언어로 가능한 적은 바이트를 사용하십시오. 언어 간이 아닌 언어 별 경쟁을 장려하기 위해 답변을받지 않습니다.

테스트 사례

다음은 가능한 출력과 함께 일부 입력입니다.

input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}

세트의 정의로 인해 이것이 사실이라고 가정하지만 하위 집합 중 하나에 복제본이 없다고 가정 할 수 있습니까?
HyperNeutrino

@Hyper Neutrino 예, 모든 세트가 중복되지 않는다고 가정 할 수 있습니다.
Laikoni

비어있는 셀이 없는 테스트 사례를 추가 할 수 있습니다 . 예 : {{1,2,3,4}, {1,2,5,6}, {1,3,5,7}}.
Ørjan Johansen

두 번째 방법은 어떻게 제공하지 {{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}않습니까?
Leaky Nun

1
@carusocomputing 면밀히 살펴보면 일부 중복되는 부분이 없기 때문에 이것이 실제 벤 다이어그램이 아님을 알 수 있습니다.
Laikoni

답변:


8

하스켈 , 71 바이트

정수 목록을 가져 와서 유사한 목록을 반환하는 익명 함수.

로 사용하십시오 (foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]].

import Data.List
foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[]

온라인으로 사용해보십시오!

작동 원리

  • 집합 유사 연산 \\(차이) 및 intersectfrom을 사용 Data.List합니다.
  • "집합"목록 (목록으로 표시)을 빈 목록부터 시작하여 셀 목록으로 접습니다 [].
  • x다이어그램에 추가 될 현재 세트 r이며 이미 구성된 셀 목록입니다.
    • x\\(id=<<r)x이미 구성된 셀에없는 요소의 하위 집합입니다 .
    • [intersect x,(\\x)]<*>rr요소가 있는지 여부 에 따라 각 셀을 분할합니다 x.
  • 대부분 빈 셀을 병합하려고 시도 하지 않으므로 출력에 많은 셀이 있습니다.

내 구현과 같은 아이디어이지만 2 바이트 더 짧습니다. 잘 했어!
Laikoni

4

젤리 , 14 17 바이트

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€

온라인으로 사용해보십시오!

함수 제출 (Jelly가 기본적으로 목록을 인쇄하는 형식은 왕복하지 않기 때문에 자체 출력 형식을 읽을 수 없지만 함수는 동일한 형식으로 입력 및 출력합니다). TIO 링크에는 함수를 실행하고 입력 구문 분석과 동일한 형식으로 출력을 인쇄하는 바닥 글이 있습니다.

설명

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€
FṀ‘               Find the largest number that appears in any of the input sets, + 1
   ³ þ            For each number from 1 to that number, and each of the input sets
    i ¬             find whether the number is missing from the set
       Ḅ          Convert the list of missing sets into a single number using binary
         ;        Append
        µ ṀḶ$     all numbers from 0 to the maximum value minus 1
             Ġ    Group indexes by values
              ṖṖ€ Delete the last group and last element of other groups

모든 Venn 다이어그램 섹션이 사용되지 않는 경우 하나 이상의 빈 세트를 출력해야한다는 요구 사항이 여기에서 프로그램의 절반 이상을 차지하도록합니다 ( 비 일치 요소에 대해 하나 이상의 그룹이 있는지 확인해야 함). 원래의 세트 수와을 제외한 소스 코드의 마지막 9 바이트를 추적합니다 Ġ. 이를 구현하는 기본 방법은 "2 세트 없음"섹션을 채우는 더미 항목을 추가하고 각각에 더미 항목을 추가하여 모든 2 ^ n 벤 다이어그램 서브 세트에 하나 이상의 항목이 있는지 확인하는 것입니다. 다른 섹션에서 Ġ각 하위 집합에 대한 그룹을 출력합니다 ṖṖ€.


음, 최대 7 세트에 대한 제한은 없으며 테스트 사례 중 하나에 더 많은 제한이 있습니다.
Ørjan Johansen

원래 다이어그램의 길이가 3이라고 가정했습니다. 벤 다이어그램이 작동하는 방식이지만 그렇지 않은 것 같습니다. 이 경우 Venn 다이어그램의 모든 섹션이 채워지지 않은 경우에만 빈 세트를 추가하는 다른 방법이 필요할 수 있습니다. 그것은 그렇지 않으면 상당히 우아한 질문에 대한 불쾌한 결점입니다.

7을 2 ^ n-1로 바꿀 수 있다고 가정합니다.
Ørjan Johansen

사양과 일치하는 2 ^ n-1 값을 얻는 방법을 찾았지만 고통 스럽습니다. 더 짧은 방법이 있기를 바랍니다. 그러나 그럼에도 불구하고이 질문은 실망 스럽습니다.

4

펄 5, 79 바이트

sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h}

([2,3,7], [1,2,4,7,8], [4,7])과 같은 익명 배열 목록으로 입력을받습니다. 키가 레이블이고 값이 출력 세트에 해당하는 익명 배열 인 해시를 출력합니다.

전체 프로그램의 일부로 :

*x=
sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h};
%x=x([2,3,7],[1,2,4,7,8],[4,7]);
print"Set $_:@{$x{$_}}\n"for keys%x;

설명:

각 세트에 정수를 레이블로 제공합니다 $.. 고유 한 각 요소에 대한 정수를 저장하는 해시를 만듭니다 $_. 표시되는 2**$.각 세트를 추가 하여 각 $_요소가 표시되는 세트를 효과적으로 표시하는 2 진 맵을 작성합니다. 마지막으로 벤 다이어그램의 각 셀에 대해 익명 배열을 작성하고 해당 세트에 나타나는 요소를 배열로 푸시합니다. 따라서 각 배열의 각 요소는 동일한 세트에 있으며 따라서 벤 다이어그램의 동일한 셀에 존재합니다.


3

Pyth , 11 바이트

m-@Fds-Qdty

테스트 스위트.

작동 원리

벤 다이어그램의 각 영역은 [다른 세트]가 아닌 [확실한 세트의 조합]에있는 요소를 나타냅니다.

따라서 입력의 전력 세트를 찾아 가능한 모든 조합을 생성하고 빈 조합을 제거합니다.

생성 된 각 조합에 대해 조합에서 집합의 교집합을 찾고 다른 집합에있는 요소를 필터링합니다.

m-@Fds-Qdty  input as Q
          y  power set
         t   remove the first one (empty combination)
m            for each combination d:
  @Fd            find the intersection of all the sets in d
 -               filter out those who are in
     s               the union of
      -Qd            the sets not in the combination
                     (input minus combination)

2

자바 스크립트 (ES6), 123 바이트

a=>a.map((b,i)=>b.map(e=>m[e]|=1<<i),m=[])&&[...Array(1<<a.length)].map((_,i)=>m.map((e,j)=>e==i&&j).filter(j=>j)).slice(1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.