Golf a Venn Diagramジェネレーター


26

Golf a Venn Diagramジェネレーター

ここに画像の説明を入力してください

ジョンベンの180歳の誕生日を適切に祝うために、今日のタスクはベン図を出力するプログラムを作成することです!

入力:

Nダイアグラムに表示される数値の範囲を定義する正の整数(ゼロからN)および3つの正の整数のセット。

出力:

0からすべての整数を示す3セットベン図N図の適切な領域にそれらを表示することにより、そして集合の関係を、これと同じ

ノート

  1. を使用してstdin(または言語に相当するものは何でも)値を取得します。
  2. セットおよびN(コンマ、スラッシュ、または最適なもので区切られた)の入力形式を定義できます。
  3. どのセットにも表示されないが、指定された範囲内にある数字は、領域内ではなく、ダイアグラム上に表示される必要があります。
  4. セットに名前を付ける必要はありません。
  5. 出力は、図面またはascii-artです。
  6. 図は、境界が明確に区別できる限り、どのような形状でもかまいません(たとえば、ASCIIアートを選択した場合、境界を越えるために+(または同様の)を使用することが不可欠です)。
  7. 領域はシェーディングする必要があるかもしれませんが、そうする必要はありません。
  8. ベン図を生成する組み込み関数またはサードパーティライブラリは許可されません。
  9. 標準的な抜け穴が適用されます

これはであるため、バイト単位の最短コードが優先されます。


ソリューションは任意の入力サイズに合わせてスケーリングする必要があるというメモを追加する必要があります。現在、それらのいくつかのみがそれを行います(ASCIIのみを伝えることができる限り)。コンテストの開始後にルールを変更するのは好きではありませんが、この要件がなければ、誰かが各セットの1文字だけで機能する単純なレイアウトで実際に悪用する可能性があります3分の1程度)。
マーティンエンダー14

@MartinBüttnerええ、それらのいくつかはかなり悪いスケールです。しかし、7つの答えがあるのでメモを追加するのは悪い考えのように思えます。注釈を追加し、全員の投稿にコメントして、ダイアグラムをXまで十分に拡大する必要があることを知らせる必要がありますか?
ウィリアムバルボサ14

制限を設定しても、その制限をそのままハードコーディングできます。適切なスケーリングが実際に課題の最も難しい部分だと思います。したがって、そのままにしておくか、任意のセットサイズを処理する必要があることを示すように変更します(入力サイズを制限しなかったため、技術的には変更ではありません。 。
マーティンエンダー14

@Ryan出力セクションに「ダイアグラムの適切な領域に表示することで」と記載していることに注意してください。言っセクションでは、以上の5つの要素を持っている場合、一部の答えは(あなたが含まれている)、それは無効だと思うので、正しく最も内側の部分を表示しない
ウィリアム・バルボサ

関連するxkcd:xkcd.com/1810
sergiol

回答:


8

Mathematica 343 264

UnGolfed

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場所の選択に使用していますか?
レベル川セント14

不透明度が10%なので、グレーが機能します。RandomSampleを使用して場所を選択しました。場所が選択されると、追加のピックの候補のセットから削除されます。他の方法を試しました(たとえば、サブリージョンの重心を使用しましたが、結果が気に入らなかった)。ところで、私はラベルを合わせるあなたのアプローチが好きです。
DavidC 14

文字を保存するためにに切り替えたCirclesため、灰色のディスクはなくなりました。節約の大部分は、地域のすべてのメンバーがその地域の中心にプロットされるという事実から生じます。
DavidC 14

45

Ruby、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クラブに達するだろう
ウィリアム・バルボサ

@WilliamBarbosaたぶん明日、必要な賛成票をくれるでしょう。;)
マーティン・エンダー14

それは見栄えの良いベン図です。私は、図の外観があなたが賛成するすべての主な理由だと推測しています。大きなセットではどうなりますか?私はそれが同じ高さのままで、ただ広くなると推測していますか?
レベル川セント14

@steveverrillはい、正確に。8つのサブセットのそれぞれは、スペースで区切られたリストとして正しい位置に印刷されます。境界線は常に同じ形状であり、各セクションの幅は、すべてが内側に収まる最小の幅になるように決定されます。もちろん、各サブセットをほぼ正方形に保つために改行を計算すると見栄えがよくなるかもしれませんが、やはりこれはやはりcode-golfです;)。また、行間にスペースを追加しなくても見栄えがよくなります
マーティン・エンダー14

1
小さな角度のキャラクターを見て、それがAPLか何かだと思ってダブルテイクをしました。:)
hoosierEE 14

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は、どの改行/空白を削除できるかについて非常にarbitrary意的です。不要な改行を削除することとは別に、ここには別のトリックがあります。これは、変更されていないバージョンではありません。これは、セットの外側の要素が左上にプロットされ、カーソルがプログラムの最後の右上のビューポートにトラップされることを意味します。これの理由はを排除することVDU26です。

非ゴルフ

数値の各セットは、ユーザーが数値N + 1を入力することで終了します(これは少し珍しい選択です。これは、配列の範囲外に書き込もうとすることによるエラーを回避するためです)。その後、テキストモードからグラフィックモードに変わりますベン図をプロットします。

入力データは、表示される値ごとに1つのセルの配列に格納されます。:SET2はBBC基本的にはシフト演算子を持たないので、電力事業者が代わりに使用されている7の範囲0の数値を与えるセット1 + 4についてSET0 + 2のために1:データは3ビット値として格納される2^i代わりに1<<iでたとえば、C。

円をプロットした後、外側のループが8つの領域のそれぞれを通過し、必要な座標に移動します(データテーブルに従って)。内側のループは、その領域のすべての数値(対応する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

典型的な入力と出力のモンタージュ(非ゴルフバージョン)

ゴルフバージョンでは、セット外の数字の位置がコマンドプロンプトと交換されます>

ここに画像の説明を入力してください


これは、任意の大きな入力に対して機能しますか?
マーティンエンダー14

@MartinBüttnerは原則的にはアルゴリズムでできますが、ディスプレイはそれを失望させます(他のソリューションの問題である可能性が高いため)。私が使用しているエミュレータははるかに高い画面解像度を処理できますが、非常に制限されている「本物の」BBCマイクロ画面モードの1つに移行しました。誰かがこれをJavaに移植する場合、唯一の実用的な制限はダイアグラムを読む人間の能力です。
レベルリバーセント14

ああ、私はちょうど円が入力サイズに適応するかどうか疑問に思っていました...もちろん、あなたの端末が行をラップしている場合、私の解決策は大きな入力に対しても読めませんサイズ。
マーティンエンダー14

2
これは、Javaに移植された場合でも、あなたはより多くのテキストのための円を大きくするためにコードを追加する必要があるだろう
SPARR

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を見てください。しかし、同じロジック。私はそれがまだ圧迫される可能性があると確信しています。
ネノトレプ14

これはこれまでで最も美しいものであり、うまくスケーリングできないのは残念です。最も内側の領域内の3つの要素が、それを破壊します。なんらかの形で拡張する予定はありますか?
ウィリアムバルボサ14

@WilliamBarbosaスケーリングが実装されました
rdans

2
ゴージャス!素晴らしい!素晴らしい!(SEは簡潔さを嫌うため、複数の最上級を使用する必要がありました。)
スコットリードリー14

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の後にコンマで区切られた3つのセットが続きます(例:)8, {1,2,4}, {2,3,4,5}, {4,6,8}。次のようなACSIIアートのセットを出力します。

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

ハハ、5分以内の2つのほぼ同一のソリューション。(チャレンジが投稿されてから3時間後...)
マーティンエンダー14

1
ノート番号6を参照してください。エッジと交差する境界は、「+」などの異なる文字である必要があります。
ウィリアムバルボサ14

4

HTML + JavaScript(E6)752 761

入力形式:max set1 set2 set3(各セットは数字のコンマ区切りリストです)

例: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()

他の誰かが子供の頃にロゴで遊んだことがありますか?

サンプル: python3 turtletest.py 15 1,2,3,4,5,9,10,12 1,3,4,6,7,9 1,2,7,8,9

ここに画像の説明を入力してください


フォント/円は、任意の大きな入力に対してスケーリングしますか?
スパー14

いいえ、まだそれについて考えています。
ジェイソンS 14

@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|
 +------------------------------------------------+ 

ええと、入力が表示されていない場合、レイアウトが本当に明確であることはわかりません。
マーティンエンダー14

あなたは正しい、これは十分ではありません
ウィリアム

[OK]を@WilliamBarbosa、私はそれがfaubiguyのエントリのように見える作られた
SPARR

2

T-SQL 2095

@NはNを含むintであると仮定します。@ A、@ B、および@Cは3つの数値セットを含むテーブルであると仮定します。あまりゴルフしようとしませんでした。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.