维恩图单元


12

给定的多组,例如s1={2,3,7}s2={1,2,4,7,8}s3={4,7},一个维恩图可视每一组由闭合曲线和一套元件,其内部或曲线的周边之外,这取决于它们是否是该组或不的元件。因为所有集合元素在Venn图中仅出现一次,所以如果一个元素存在于多个集合中,则表示每个集合的曲线需要重叠。我们称这种重叠为维恩图的一个单元

这种解释可能有点混乱,因此让我们看一个示例。

维恩图的集合s1s2并且s3看起来是这样的:

被(从顶部到底部看,从左到右)这个文氏图的细胞{1,8}{2}{7}{4}{3}{}{}

在实践中,一个人通常只遇到两个或三个集合的维恩图,因为四个或更多集合的维恩图的表示不是很清楚。但是它们确实存在,例如六组:CC BY-SA 3.0,https

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

任务

给定一组以任何合理表示形式表示的非空正整数集,请返回输入集的维恩图的像元集。具体而言,不需要图形表示。

  • 您可以编写完整的程序或函数。
  • 您可能会返回与有空单元格(即,所有单元格的列表)一样多的空集,而不是仅返回一个空集(即,单元格的集合)。
  • 输入的用于上述示例的一些合理的方式包括但不限于{{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是的,您可以假设所有集合都是免费的。
拉科尼

也许你可以添加一个测试情况下没有细胞是空的。例如{{1,2,3,4},{1,2,5,6},{1,3,5,7}}。
与Orjan约翰森

第二个怎么不给{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}
Leaky Nun

1
@carusocomputing通过仔细检查,您会发现这不是真正的维恩图,因为缺少一些可能的重叠。
拉科尼

Answers:


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))[]

在线尝试!

怎么运行的

  • 使用与set类似的操作\\(差异)和intersectfrom Data.List
  • 从空列表开始,将“集合”列表(表示为列表)折叠成一个单元格列表[]
  • x是要添加到图中的当前集合,并且r是已经构造的单元格列表。
    • x\\(id=<<r)是元素的子集,x不在任何已构造的单元中。
    • [intersect x,(\\x)]<*>rr根据其元素是否在其中拆分每个单元格x
  • 最绝没有试图合并空单元格,所以有相当多的那些输出。

与我的实现相同的想法,但是短了两个字节。做得好!
Laikoni '17

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

如果不使用所有的维恩图部分,我们至少要输出一个空集的要求在这里占用了一半以上的程序(这是确保我们至少有一组用于不匹配元素的原因,这使我们能够以跟踪最初有多少个集合,以及源代码的最后九个字节(除外Ġ)。我们实现它的基本方法是,通过添加一个将填充“无集合”部分的虚拟条目,并向每个虚拟条目添加(以后)一个虚拟条目,来确保所有2 ^ n个维恩图子集都至少具有一个条目。其他部分,则将Ġ为每个子集输出一个组,我们可以使用删除该组ṖṖ€


嗯,最多不限7套,其中一个测试用例有更多。
与Orjan约翰森

我假设原始集合的长度为3,因为这是维恩图的工作方式,但显然不是这样吗?在那种情况下,也许只有在未填满维恩图的所有部分的情况下,我才需要另一种方法来添加空集。在一个原本比较优雅的问题上,这有点令人讨厌。

好吧,我想可以用2 ^ n-1代替7。
与Orjan约翰森

我找到了一种获取与规范匹配的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**$.对每个组$_出现在,有效地使显示在什么设置每个元素出现的二进制地图。最后,使在维恩图中的每个单元的匿名阵列并且推动出现在相应套到阵列的元件。因此,每个数组的每个元素都存在于Venn图的相同集合中,因此也存在于同一单元格中。


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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.