高尔夫维恩图生成器


26

高尔夫维恩图生成器

在此处输入图片说明

为了恰当地庆祝约翰·维恩诞辰180周年,今天的任务是创建一个输出维恩图的程序!

输入:

一个正整数N,它将定义图中显示的数字范围(从零到N)和三组正整数。

输出:

3集维恩图,显示从0到0的所有整数,N并通过在图的适当区域中显示它们(类似于此整数)来显示集合之间的关系。

笔记

  1. 使用stdin(或与您的语言等效的任何语言)获取值。
  2. 您可以定义集合和集合的输入格式N(以逗号,斜杠或最适合您的形式分隔)。
  3. 未出现在任何集合中但在指定范围内的数字必须出现在图表上,而不是在任何区域内。
  4. 这些集无需命名。
  5. 输出可以是图形或ascii-art。
  6. 该图可以具有任何形状,只要边界可以清楚地区分即可(例如,如果您选择ASCII艺术作品,则必须使用+(或类似符号)来跨越边界)。
  7. 区域可能但不必着色。
  8. 禁止生成Venn图的任何内置函数或第三方库。
  9. 适用标准漏洞

这是,因此以字节为单位的最短代码胜出。


似乎您应该添加一条注释,即解决方案必须针对任意输入大小进行缩放。目前,只有少数几个这样做(据我所知只有ASCII)。我不喜欢比赛开始后更改规则,但是如果没有此要求,有人可能会真正滥用它,因为它的简单布局仅适用于每个集合中的一个字符(如果这样做的话,我可能会缩减代码大小)到三分之一左右)。
马丁·恩德

@MartinBüttner是的,其中一些比例非常糟糕。但是,现在有7个答案就添加注释似乎是个坏主意。应该添加注释并在每个人的帖子上发表评论,以使他们知道该图应按比例放大到X?
威廉·巴博萨

设置限制仍将仅允许对该限制进行硬编码。我认为适当的缩放实际上是挑战中最困难的部分。因此,要么按原样保留它,要么更改它以说它必须处理任意集合大小(从技术上讲,这甚至不是更改,因为您没有限制输入大小,我认为反正输入大小也应该假定) 。
Martin Ender 2014年

@Ryan请注意,我在输出部分声明“通过在图表的适当区域中显示它们”。如果所述部分包含5个以上的元素,则某些答案(包括您的问题)无法正确显示最里面的部分,因此我认为这是无效的
William Barbosa 2014年

相关xkcd:xkcd.com/1810
sergiol

Answers:


8

数学343 264

松散

m=Input[]; data=Input[];


(* The circles to represent set boundaries *)
{R1,R2,R3}=Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}};

(*converts  {1,0,1} to base 10, ie, the number 5.
bool[x_]:=FromDigits[Boole[x],2]

(* determines the region in which each number from 0 to `m` resides *)
encode[num_]:=bool[Table[MemberQ[data[[k]],num],{k,3}]]

(*Centroid of each region; the first is a location for numbers in none of the three sets *)
points={{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}

(* Plots the venn diagram with numbers in regions *)
Graphics[{
Text@@@({#[[1]],points[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,encode[#]}&/@Range[0,m],Last])),
Opacity[.1],R1,R2,R3
}]

假设 10输入了m{{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}输入了d

新维恩图


高尔夫264

我很惊讶所有的计算都可以在Graphics函数本身中进行。除了输入之外,它是单线的。

m=Input[];d=Input[]
Graphics@{Text@@@({#[[1]],{{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,FromDigits[Boole[Table[d[[k]]~MemberQ~#,{k,3}]],2]}&/@Range[0,m],Last])),Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}}}

+1表示圆圈的外观。我很惊讶他们的灰色看起来很好。数字的分散是奇怪的。您是RandomSample用来选择位置的吗?
水平河圣

灰色有效,因为不透明度为10%。使用RandomSample选择位置。一旦选择了位置,就将其从候选集合中删除以进行其他选择。我尝试了其他方法(例如,使用子区域的质心,但不喜欢结果)。顺便说一句,我喜欢您贴标签的方法。
DavidC

为了保存字符,我切换到Circles,因此灰盘不见了。大部分节省来自以下事实:一个区域的所有成员都绘制在该区域的中心。
DavidC 2014年

45

红宝石,654个 590 566 542 505字节

很好玩 我使用ASCII。我还无法测试所有可能的组合,因此,如果您发现故障测试用例,请告诉我。

require'set'
u=(0..gets.to_i).to_set
a,b,c=eval(gets).map &:to_set
i=' '
m,M,n,N,o,O,p,P,q,Q,r,R,s,S=[a-b-c,b-a-c,c-a-b,a&b-c,b&c-a,a&c-b,a&b&c].map{|u|[t=u.to_a*i,t.size]}.flatten
H,V,X=?─,?│,?┼
puts'┌'+H*(A=[1+M+[P,S].max,1+R].max)+?┐+(u-a-b-c).to_a*i,V+i*M+?┌+(b=H*(T=-M+U=A-1)+X+H*(B=[N,Q].max))+?┐,V+m+V+p+i*(T-P)+V+n+i*(B-N)+V,'│┌'+H*(K=M-1)+X+b+X+H*(C=[O-B-1,0].max)+?┐,(v=V*2+i*K)+V+s+i*(T-S)+V+q+i*(B-Q)+V+i*C+V,v+?└+b+?┘+i*C+V,V*2+r+i*(U-R)+V+o+i*(-O+D=B+C+1)+V,'└┼'+H*U+?┘+i*D+V,' └'+H*(A+D)+?┘

它期望以下列格式输入STDIN

10
[[1,2,3,4,5,9],[1,2,3,6,8],[7,2,9]]

然后用这种美丽奖励你

┌───────┐0 10
│   ┌───┼───┐
│4 5│1 3│6 8│
│┌──┼───┼───┼┐
││  │2  │   ││
││  └───┼───┘│
││9     │7   │
└┼──────┘    │
 └───────────┘

我认为我可以添加一个非高尔夫版本。请看看在编辑历史的原始版本的稍微更可读的版本。

当然,可以通过减小设置边界的紧度甚至使其像某些图形边界一样保持固定来进一步打高尔夫球,但是我更喜欢它看起来不错,尽管打了高尔夫球也“正确”地完成了。


如果您今天还没有达到上限,今天就可以用这个答案达到10K俱乐部了,真可惜
William Barbosa 2014年

@WilliamBarbosa也许明天会给我必要的投票。;)
Martin Ender 2014年

这是一个看起来不错的维恩图。我猜图中的外观是所有人投票的主要原因。大套会怎样?我猜它保持相同的高度,只是越来越宽?
级圣河

@steveverrill是的。8个子集中的每个子集都只是在正确位置以空格分隔的列表形式打印。边界始终是相同的形状,并且每个部分的宽度都确定为适合内部所有内容的最小宽度。当然,如果我计算换行符以使每个子集大致保持正方形,则看起来会更好,但是毕竟这还是代码高尔夫;)。在没有行间距的情况下看起来也更好
Martin Ender 2014年

1
看到小角度的字符并进行了两次操作,认为这是APL之类的东西。:)
hoosierEE 2014年

15

BBC BASIC,243个ASCII字符(标记的文件大小211字节)

http://www.bbcbasic.co.uk/bbcwin/bbcwin.html下载仿真器

打高尔夫球

  INPUT"N",n
  DIMs(n+1)
  FORi=0TO2PRINT"S";i
  REPEATINPUTx:s(x)=s(x)+2^i:UNTILx>n
  NEXTMODE4r=360CIRCLE460,r,r
  CIRCLE640,664,r
  CIRCLE820,r,r
  FORi=0TO7FORx=0TOn:IFs(x)=i PRINT;x
  NEXTREADa
  VDU28,a+1792;a+5;
  NEXT
  DATA19,4873,2572,4893,2586,5907,3091,34

对于可以消除的换行符/空白,BBC Basic非常武断。除了去除不必要的换行符之外,这里还有另一个技巧不在非高尔夫版本中:我在绘图循环的末尾而不是在开始时分配视口(请参见下面的非高尔夫评论中的说明)。这意味着该集合外部的元素被绘制在左上方,并且光标被困在程序结尾右上方的视口中。这样做的原因是消除了VDU26

不打高尔夫球

每组数字都由用户输入数字N + 1终止(这是一个不寻常的选择,这是为了避免由于尝试在数组范围之外进行写入而导致的错误。)然后从文本模式更改为图形模式。并绘制维恩图。

输入数据存储在一个数组中,每个要显示的值都有一个单元格。的数据存储为一个3位值:1 SET0 + 2 + SET1 4 SET2给予数取值范围为0〜7 BBC基本还没有移位运算符,因此,功率运算符用于代替:2^i代替1<<i在以C为例。

绘制完圆圈后,外部循环遍历八个区域中的每个区域,移至所需的坐标(根据数据表)。内部循环打印该区域中的所有数字(那些在数字区域中具有相应的3位值)数组。)

  INPUT"N",n                                 :REM create an array called s() with range 0..n+1
  DIMs(n+1)
  FORi=0TO2
    PRINT"S";i                               :REM prompt the user for data for set 0, set 1 and set 2.
    REPEATINPUTx:s(x)=s(x)+2^i:UNTILx>n      :REM input numbers and store as a bit table. Repeat until user enters n+1.
  NEXT
  MODE4                                      :REM change to graphics mode.
  r=360
  CIRCLE460,r,r                              :REM plot a circle at x,y,r.
  CIRCLE640,664,r                            :REM for the bottom two circles y=r.
  CIRCLE820,r,r
  FORi=0TO7                                  :REM for each region of the venn diagram
    READa                                    :REM read a 2 byte value for the  coordinates of the top left corner of a text viewport from the DATA statement: x+256y
    VDU28,a+1792;a+5;                        :REM create a 5x7 viewport (limits each region to 7 numbers.) 1792=7*256
    FORx=0TOn:IFs(x)=i PRINT;x               :REM print all numbers in the array belonging to that region
    NEXT
  NEXT
  VDU26                                      :REM Restore the viewport to the whole screen, to ensure the command prompt does not mess up the display at the end of the program.
  DATA34,19,4873,2572,4893,2586,5907,3091

典型输入和输出的蒙太奇(无胶版)

在高尔夫球版本中,数字在集合外的位置与命令提示符交换>

在此处输入图片说明


这对任意大的输入有效吗?
Martin Ender 2014年

@MartinBüttner原则上是算法可以做到的,但是显示会使其降低(这可能是其他解决方案的问题。)我在程序注释中暗示每个区域在开始滚动之前限制为7个数字(我使用的仿真器可以处理更高的屏幕分辨率,但是我选择了一种“真实的” BBC微屏模式,这非常有局限性。如果有人将此移植到Java,则唯一的实际限制将是人类读取图表的能力。
级圣河

是的,我只是想知道圆是否会适应输入的大小...当然,如果您的终端将行换行,我的解决方案对于大型输入也将不可读,但是只要使用滚动条显示它就可以处理任何输入尺寸。
Martin Ender 2014年

2
即使将其移植到Java,您也必须添加代码以使圆圈更大以获得更多文本
Sparr 2014年

14

的JavaScript 1235

http://jsfiddle.net/44a4L/7/

已在google chrome v36中测试。

输入是在变量upper,set1,set2和set3中进行的。

更新:现在根据输入的大小自动缩放。

function t(e,t){z.getElementById(e).innerHTML+=" "+t}z=document;s=200+upper*20;z.body.innerHTML+="<style>#m{width:"+s+"px;height:"+s+"px;}div{position:absolute;text-align:center;border-radius:50%;}#s1{left:calc(15% + 15px);top:30px;bottom:30%;right:calc(15% + 15px);background-color:rgba(255,0,0,0.4);padding:10%;}#s2{left:30px;bottom:30px;top:30%;right:30%;background-color:rgba(0,255,0,0.4);padding-right:40%;padding-top:30%;}#s3{right:30px;bottom:30px;top:30%;left:30%;background-color:rgba(0,0,255,0.4);padding-left:40%;padding-top:30%;}#s123{left:40%;top:40%;right:40%;bottom:40%;}#s12{left:20%;top:35%;right:65%;bottom:50%;}#s13{right:20%;top:35%;left:65%;bottom:50%;}#s23{left:40%;right:40%;bottom:15%;top:70%;}</style><div id=m><div id=s1 class=s></div><div id=s2 class=s></div><div id=s3 class=s></div><div id=s123 class=v></div><div id=s12 class=v></div><div id=s13 class=v></div><div id=s23 class=v></div></div>";for(i=0;i<=upper;i++){i1=i2=i3=false;if(set1.indexOf(i)!=-1)i1=true;if(set2.indexOf(i)!=-1)i2=true;if(set3.indexOf(i)!=-1)i3=true;if(i1&&i2&&i3)t("s123",i);else if(i1&&i2)t("s12",i);else if(i1&&i3)t("s13",i);else if(i2&&i3)t("s23",i);else if(i1)t("s1",i);else if(i2)t("s2",i);else if(i3)t("s3",i);else t("m",i)}

样本输出:

文恩


挺好的!我可以将其压缩得更紧一些,请参阅jsfiddle.net/44a4L/2-查看“ t”函数,CSS和body.innerHTML。虽然逻辑相同。我相信它仍然可以被挤压。
Nenotlep 2014年

这是迄今为止最漂亮的一个,可惜无法很好地扩展。最内层区域中的三个元素使其破裂。您打算以某种方式使其扩展吗?
威廉·巴博萨

@WilliamBarbosa缩放现已实施
rdans,2014年

2
华丽!太棒了!壮观!(由于SE讨厌简洁,因此不得不使用多个最高级的语言。)
Scott Leadley 2014年

4

的Python-603

import re
n,a,b,c=eval(input())
h=set(range(n+1))-a-b-c
g=a&b&c
d,e,f=a&b-g,b&c-g,a&c-g
l,m=set(a),set(b)
a-=b|c
b-=l|c
c-=l|m
for t in'abcdefgh':exec("%s=' '.join(map(str,%s))"%(2*(t,)))
l=len
x,y,z=max(l(a),l(f)+2,3),l(max(d,g)),max(l(b),l(e)+2,l(c)-l(f+g)-2,3)
j=[0]*4
for t in'abcdefg':exec("%s=%s.ljust([x,z,x+y+z-2,y,z-2,x-2,y][ord('%s')-97])+'|'"%(3*(t,)))
s='\d| '
w=re.sub
for r in (1,3):q=r//2;j[r]=['','| '][q]+'|'+[a+d+b,f+g+e][q]+['',' |'][q];j[r-1]=w('\|','+',w(s,'-',j[r]))
j[0]+=h
o=j[2]
j[2]='| +'+j[2][3:-3]+'+ |'
p='  |'+c
q='  '+w('\|','+',w(s,'-',p))[2:]
for l in j+[o,p,q]:print(l)

输入为N,后跟三组,以逗号分隔(例如8, {1,2,4}, {2,3,4,5}, {4,6,8})。它输出ACSII艺术作品集,如下所示:

+---+-+---+0 7
|1  | |3 5|
| +-+-+-+ |
| |2|4| | |
+-+-+-+-+-+
  |6 8  |
  +-----+

哈哈,在5分钟内找到了两个几乎完全相同的解决方案。(发布挑战后3小时...)
马丁·恩德

1
请参考编号6。您的边缘和交叉边界必须为其他字符,例如“ +”。
威廉·巴博萨

4

HTML + JavaScript(E6)752761

输入格式:max set1 set2 set3(每个set是逗号分隔的数字列表)

例如:10 1,2,3,4,5,9 1,2,3,6,8 7,2,9

屏幕截图

示例2:30 2,4,6,8,10,12,14,16,18,30 3,6,9,12,15,18,21,30 5,10,15,20,25,30

Chrome屏幕截图

由于html渲染,所有部分的尺寸都会自动调整。

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,x=>'09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x])
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,x=>r[x]))
</script></body></html>

Javascript E5版本可在Chrome和MSIE 10中运行(可能为9)

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,function(x){return '09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x]})
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,function(x){return r[x]}))
</script></body></html>

不打高尔夫球

<html>
<style>
div {   display:table-row; }
p {
    position: relative;
    text-align: center;
    padding: 30px;
    display: table-cell;
}
i {
    position: absolute;
    top:0;bottom:0;right:0;left:0;
}
.a { border-top-left-radius: 60px; }
.b { border-top-right-radius: 60px; }
.c { border-bottom-left-radius: 60px; }
.d { border-bottom-right-radius: 60px; }
.x { background: rgba(255,255,0,.3) }
.y { background: rgba(255,0,255,.3) }
.z { background: rgba(0,255,255,.3) }
</style>
<body>
<div>
<p class='x a'/><p class='x'><b id='b1'></b></p><p><i class='y a'></i><i class='x b'></i><b id='b3'></b></p><p class='y'><b id='b2'></b></p><p class='y b'/>
</div>    
<div>
<p class='x c'/><p class='z a'><i class='x'></i><b id='b5'></b></p><p class='z'><i class='x d'></i><i class='y c'></i><b id='b7'></b></p><p class='z b'><i class='y'></i><b id='b6'></b></p><p class='y d'/>
</div>        
<div>
<p/><p class='z c'/><p class='z'><b id='b4'></b></p><p class='z d'/>
</div>    
<b id='b0'></b>    
<script>
i=prompt().split(' ')
r=',,,,,,,'.split(c=',')
for (j=-1; j++<i[0];)
{
    for(h = k = 0; ++k < 4;)
    {
    if( (c+i[k]+c).search(c+j+c) >= 0)
      h += k + (k>2); // bit mask 1 or 2 or 4
  }
  r[h] += j + ' ';
}        
for (j = 0; j < 8; j++)
    document.getElementById('b'+j).innerHTML=r[j]
</script>
</html>

3

Python 3-353

# 353 bytes, input format like: 6 1,2,3 2,3,4 1,3,4
import sys
from turtle import*
_,n,*q=sys.argv
n=set(range(int(n)))
a,b,c=map(set,map(eval,q))
for x,y in(0,0),(-115,-185),(115,-185):goto(x,y),pd(),circle(200),up()
for x,y,s in(200,331,n-a-b-c),(-101,278,a-b-c),(-254,-49,b-a-c),(95,-49,c-a-b),(-172,164,a&b-c),(58,164,a&c-b),(-49,-39,b&c-a),(-49,52,a&b&c):goto(x,y),write(s or'',font=None)
ht()
done()

小时候有人玩过Logo吗?

样品: python3 turtletest.py 15 1,2,3,4,5,9,10,12 1,3,4,6,7,9 1,2,7,8,9

在此处输入图片说明


字体/圆圈可否缩放为任意大的输入?
Sparr

不,还在考虑那个。
詹森·S

@JasonS还在想吗?
乔纳森·弗雷希

3

perl 388b 346b 488b

其输出类似于另一个条目:

@a=split($",<>);
$n=pop @a;
@a=map[split(',')],@a;
for$i(0..2){$b{$_}+=1<<$i foreach@{$a[$i]}}
push@{$c[$b{$_}]},$_ for(0..$n);
$l|=length($d[$_]=join($",@{$c[$_]}))for(0..$n);
print$h=(("+-"."-"x$l)x3)."+
";
sub j{sprintf"% ".(sprintf"%ds",$l+($_[0]<4)+($_[0]==7)),$d[$_[0]]}
sub r{join('|',map{j($_)}@_)}
$h=~s/\+-/|+/;
$h=~s/-\+$/+|/;
print "|".r(1,3,2)."|
".$h;
$h=~s/[|+]{2}/++/g;
print "||".r(5,7,6)."||
".$h;
$h=~s/\+\+/ +/;
$h=~s/\+\+/+ /;
$h=~s/-\+-/---/g;
$l=$l*3+3;print " |".j(4)."|
",$h,$d[0]

测试运行和输出:

# echo "1,2,3,7,13 2,3,8,11,13,6,9 3,4,5,11,12,13,14 15" | perl venn.pl ;echo
+----------------+----------------+----------------+
|             1 7|               2|           6 8 9|
|+---------------+----------------+---------------+|
||               |            3 13|             11||
++---------------+----------------+---------------++
 |                                       4 5 12 14|
 +------------------------------------------------+ 

嗯,如果您没有看到输入内容,则不确定布局是否真正明确。
马丁·恩德

没错,这还不够呢
William Barbosa 2014年

@WilliamBarbosa好的,我使它看起来像faubiguy的条目
Sparr,

2

T-SQL 2095

假定@N是一个包含N的整数。假定@ A,@ B和@C是包含三组数字的表。没有尝试打太多。

DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)INSERT INTO @(Z)SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P INSERT INTO @(Y)SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL INSERT INTO @(X)SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL INSERT INTO @(W)SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL INSERT INTO @(V)SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL INSERT INTO @(U)SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL INSERT INTO @(T)SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL WHILE @N>=0BEGIN INSERT INTO @(S)SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)SET @N-=1 END DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))INSERT INTO @Z SELECT @F,@H,@F,@H,@G,@H,@G,''WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')SET @E+=1 END INSERT INTO @Z SELECT @F,@H,@J,@H,@G,'',@I,''SET @E=0WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''SET @E+=1 END INSERT INTO @Z SELECT @G,@H,@J,@H,@F,'',@I,''SET @E=0WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''SET @E+=1 END INSERT INTO @Z SELECT @G,@H,@G,@H,@F,@H,@F,''SELECT*FROM @Z

少打高尔夫球的版本:

--finding the sets
DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'
DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)
INSERT INTO @(Z)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P 
INSERT INTO @(Y)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL 
INSERT INTO @(X)
SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL 
INSERT INTO @(W)
SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL 
INSERT INTO @(V)
SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL 
INSERT INTO @(U)
SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL 
INSERT INTO @(T)
SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL 
WHILE @N>=0
BEGIN 
    INSERT INTO @(S)
    SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)
    SET @N-=1 
END

--displaying the venn diagram
DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))
INSERT INTO @Z 
SELECT @F,@H,@F,@H,@G,@H,@G,''
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @F,@H,@J,@H,@G,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@J,@H,@F,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@G,@H,@F,@H,@F,''
SELECT*FROM @Z
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.