ベン図セル


12

複数のセット、例えば所定のs1={2,3,7}s2={1,2,4,7,8}及びs3={4,7}ベン図を、それらが集合の要素であるか否かに応じて、閉曲線のいずれかの内側または外側の曲線の境界である組の要素により可視化各セット。すべてのセット要素はベン図に1回しか表示されないため、要素が複数のセットに存在する場合、各セットを表す曲線はオーバーラップする必要があります。このようなそれぞれを、ベン図のセルの重複と呼びます。

この説明は少しわかりにくいかもしれませんので、例を見てみましょう。

セットのためのベン図はs1s2s3このようになります。

このベン図の細胞は、(左から右へ、上から下に読み取り)であり{1,8}{2}{7}{4}{3}{}および{}

実際には、4つ以上のセットのベン図の表現があまり明確ではないため、一般に2セットまたは3セットのベン図のみに遭遇します。ただし、これらは存在します。たとえば、6セットの場合:CC BY-SA 3.0、https

//commons.wikimedia.org/w/index.php?curid = 1472309

タスク

妥当な表現で正の整数のセットの空でないセットが与えられると、入力セットのベン図のセルのセットを返します。具体的にはグラフィカルな表現は必要ありません

  • 完全なプログラムまたは関数を作成できます。
  • 空のセル(すなわちがあるとして、あなたは多くの空のセットとして返すことがあり、リストのすべてのセルの)だけではなく1つの空のセット(すなわち集合細胞のは)。
  • 上記の例のための入力のいくつかの合理的な方法は、限定されないが{{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}}

セットの定義のためにこれは真実であると仮定していますが、サブセットの1つに重複がないと仮定できますか?
ハイパーニュートリノ

@Hyper Neutrinoはい、すべてのセットが重複していないと仮定できます。
ライコニ

おそらく、空のセルがないテストケースを追加できます。例:{{1,2,3,4}、{1,2,5,6}、{1,3,5,7}}。
Ørjanヨハンセン

2番目のものはどのように与えないの{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}ですか?
リーキー修道女

1
@carusocomputingよく調べてみると、オーバーラップの可能性がいくつか欠落しているため、これは真のベン図ではないことがわかります。
ライコニ

回答:


8

Haskell、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ます。
  • 空のlistで始まる「セット」のリスト(リストとして表される)をセルのリストに折りたたみます[]
  • xは、ダイアグラムに追加する現在のセットでrあり、すでに構築されているセルのリストです。
    • x\\(id=<<r)は、その要素のサブセットでxあり、すでに構築されているセルのいずれにもありません。
    • [intersect x,(\\x)]<*>rr要素が含まれているかどうかに従って、各セルを分割しますx
  • ほとんど間違いないない空のセルを結合しようとすると、その出力のもののかなりがあります。

私の実装と同じ考えですが、2バイト短くなっています。よくやった!
ライコニ

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

すべてのベン図のセクションが使用されていない場合、少なくとも1つの空のセットを出力するという要件は、ここでプログラムの半分以上を占めることになります(一致しない要素に対して少なくとも1つのグループがあることを確認する責任があります。元々あったセットの数と、を除くソースコードの最後の9バイトを追跡しますĠ。それを実装する基本的な方法は、「in no sets」セクションを埋めるダミーエントリと(それぞれ)ダミーエントリを追加することにより、すべての2 ^ nベン図のサブセットに少なくとも1つのエントリを持たせることです。他のセクションではĠ、各サブセットのグループを出力しṖṖ€ます。これはを使用して削除できます。


せいぜい7セットに制限はなく、テストケースの1つにはそれ以上があります。
Ørjanヨハンセン

元のセットの長さは3であると想定しました。これは、ベン図がどのように機能するかということですが、明らかにそうではないのですか?その場合、ベン図のすべてのセクションが埋められていない場合にのみ、空のセットを追加する別の方法が必要になる可能性があります。それは、それ以外の点ではかなりエレガントな質問であるものに対する厄介な傷のようなものです。

7を2 ^ n-1に置き換えることができます。
Ørjanヨハンセン

仕様に一致する2 ^ n-1の値を取得する方法を見つけましたが、非常に長いです。もっと短い方法があればいいのですが、それでもこの質問はイライラさせられます。

4

Perl 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**$.される各セットに追加$_し、各要素がどのセットに表示されるかを示すバイナリマップを効果的に作成します。最後に、ベン図の各セルに匿名配列を作成し、対応するセットに表示される要素を配列にプッシュします。したがって、各配列の各要素は同じセットに存在するため、ベン図の同じセルに存在します。


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

JavaScript(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.