Golf generator Venn Diagram

26

Golf generator Venn Diagram

masukkan deskripsi gambar di sini

Untuk merayakan ulang tahun John Venn yang ke-180 dengan benar , hari ini tugas Anda akan membuat program yang menghasilkan Diagram Venn !

Memasukkan:

NBilangan bulat positif yang akan menentukan kisaran angka yang muncul dalam diagram (Dari nol hingga N) dan tiga set bilangan bulat positif.

Keluaran:

Diagram Venn 3 set memperlihatkan semua bilangan bulat dari 0 hingga Ndan hubungan himpunan dengan menampilkannya di wilayah diagram yang tepat, mirip dengan yang ini .

Catatan

  1. Gunakan stdin(atau apa pun yang setara dengan bahasa Anda) untuk mendapatkan nilai.
  2. Anda dapat menentukan format input untuk set dan untuk N(Dipisahkan oleh koma, garis miring atau apa pun yang paling cocok untuk Anda).
  3. Angka yang tidak muncul di salah satu set tetapi berada dalam kisaran yang ditentukan harus muncul pada diagram, hanya saja tidak di dalam wilayah mana pun.
  4. Set tidak perlu disebutkan namanya.
  5. Outputnya bisa berupa gambar atau ascii-art.
  6. Diagram dapat memiliki bentuk apa pun selama batas-batasnya dapat dibedakan secara jelas (jika Anda memilih seni ASCII, menggunakan + (atau serupa) untuk melintasi batas sangat penting, misalnya).
  7. Wilayah mungkin tetapi tidak harus diarsir.
  8. Fungsi bawaan atau pustaka pihak ketiga yang menghasilkan Diagram Venn dilarang.
  9. Celah standar berlaku .

Ini adalah , jadi kode terpendek, dalam byte, menang.

William Barbosa
sumber
Sepertinya Anda harus menambahkan catatan bahwa solusi harus skala untuk ukuran input yang sewenang-wenang. Saat ini hanya sedikit dari mereka yang melakukan itu (sejauh yang saya tahu hanya yang ASCII). Saya tidak suka mengubah aturan setelah kontes dimulai, tetapi tanpa persyaratan ini, seseorang mungkin bisa benar-benar menyalahgunakannya dengan tata letak sederhana yang hanya berfungsi untuk satu karakter di setiap set (jika saya melakukannya saya mungkin akan memotong ukuran kode) sampai sepertiga atau lebih).
Martin Ender
@ MartinBüttner Ya, beberapa dari mereka berskala sangat buruk. Namun menambahkan catatan sekarang bahwa ada 7 jawaban sepertinya ide yang buruk. Haruskah menambahkan catatan dan mengomentari pos semua orang untuk memberi tahu mereka bahwa diagram harus ditingkatkan hingga X?
William Barbosa
Menetapkan batas masih akan memungkinkan hanya pengodean keras batas itu. Saya pikir penskalaan yang tepat sebenarnya adalah bagian paling sulit dari tantangan. Jadi biarkan saja apa adanya, atau ubah untuk mengatakan bahwa itu harus berurusan dengan ukuran set arbitrer (yang secara teknis bahkan bukan perubahan, karena Anda tidak membatasi ukuran input, saya pikir ukuran input arbirtrary harus diasumsikan pula) .
Martin Ender
@Ryan Perhatikan bahwa saya menyatakan "dengan menampilkannya di wilayah diagram yang tepat" di bagian keluaran. Beberapa jawaban (termasuk Anda) tidak menampilkan bagian terdalam dengan benar jika bagian tersebut memiliki lebih dari 5 elemen, jadi saya pikir itu tidak valid
William Barbosa
Xkcd yang
sergiol

Jawaban:

8

Mathematica 343 264

Tidak disatukan

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
}]

Dengan asumsi 10input untuk mdan {{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}input untuk d,

diagram venn baru


Bermain golf 264

Saya terkejut bahwa semua perhitungan dapat dilakukan dalam Graphicsfungsi itu sendiri. Dengan pengecualian input, ini adalah one-liner.

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}}}
DavidC
sumber
+1 untuk penampilan lingkaran. Saya terkejut mereka terlihat sangat baik dalam warna abu-abu. Namun hamburan angkanya aneh. Anda menggunakan RandomSampleuntuk memilih lokasi?
Level River St
Gray berfungsi karena opacitynya 10%. RandomSample digunakan untuk memilih lokasi. Setelah lokasi telah dipilih, itu dihapus dari set kandidat untuk picks tambahan. Saya bermain-main dengan metode lain (misalnya menggunakan pusat massa sub-wilayah, tetapi tidak suka hasilnya). BTW, saya suka pendekatan Anda untuk memasang label.
DavidC
Untuk menyimpan karakter, saya beralih ke Circles, sehingga disk abu-abu hilang. Sebagian besar penghematan berasal dari kenyataan bahwa semua anggota suatu wilayah diplot di pusat wilayah itu.
DavidC
45

Ruby, 654 590 566 542 505 byte

Ini sangat menyenangkan. Saya menggunakan ASCII. Saya belum dapat menguji setiap kombinasi yang mungkin, jadi jika Anda menemukan test case yang glitchy, beri tahu saya.

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)+?┘

Itu mengharapkan input pada STDIN dalam format berikut

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

Dan kemudian akan membalas Anda dengan keindahan ini

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

Saya rasa saya tidak bisa repot-repot menambahkan versi yang tidak ungolfed. Silakan lihat versi asli di histori edit untuk versi yang agak lebih mudah dibaca.

Ini tentu saja bisa di-golf lebih jauh dengan membuat batas-batas yang ditetapkan kurang ketat atau bahkan menjaganya tetap seperti yang dilakukan oleh beberapa grafis, tetapi saya lebih suka bahwa itu terlihat bagus dan dilakukan "dengan benar" meskipun sedang bermain golf.

Martin Ender
sumber
Jika Anda belum mencapai batas hari ini, Anda akan mencapai klub 10K hari ini dengan jawaban ini, sayang sekali
William Barbosa
@ WilliamBarbosa Mungkin itu akan memberi saya upvotes yang diperlukan besok. ;)
Martin Ender
Itu diagram Venn yang terlihat bagus. Saya menduga penampilan diagram adalah alasan utama untuk semua yang Anda upvotes. Apa yang terjadi untuk set yang lebih besar? Saya kira itu tetap sama tinggi dan semakin lebar?
Level River St
@steveverrill ya persisnya. masing-masing dari 8 himpunan bagian hanya dicetak sebagai daftar terbatas ruang di posisi yang tepat. batas-batasnya selalu berbentuk sama, dan lebar setiap bagian ditentukan sebagai minimum yang memungkinkan untuk memenuhi semua yang ada di dalamnya. tentu saja, ini mungkin terlihat lebih bagus jika saya menghitung jeda baris untuk menjaga setiap bagian kurang lebih sama, tetapi sekali lagi ini adalah kode-golf;). juga terlihat lebih baik tanpa tambahan jarak antar baris
Martin Ender
1
Melihat karakter sudut kecil dan melakukan pengambilan ganda, berpikir itu APL atau sesuatu. :)
hoosierEE
15

BBC BASIC, 243 karakter ASCII (ukuran file tolak 211 byte)

Unduh emulator di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Golf

  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 sangat sewenang-wenang tentang baris baru / spasi mana yang dapat Anda hilangkan. Selain menghilangkan baris baru yang tidak perlu, ada trik lain di sini yang tidak ada dalam versi yang tidak diklik: Saya menetapkan viewport (lihat penjelasan di bawah dalam komentar yang tidak diklik) pada akhir dari loop perencanaan, bukan di awal. Ini berarti bahwa elemen di luar himpunan diplot kiri atas, dan kursor terjebak dalam viewport di kanan atas pada akhir program. Alasan untuk ini adalah untuk menghilangkan VDU26.

Tidak disatukan

Setiap set angka diakhiri oleh pengguna memasukkan angka N +1 (pilihan yang sedikit tidak biasa, ini adalah untuk menghindari kesalahan yang disebabkan oleh mencoba menulis di luar rentang array.) Kemudian ia berubah dari mode teks ke mode grafis dan plot diagram Venn.

Data input disimpan dalam array, satu sel untuk setiap nilai yang akan ditampilkan. Data disimpan sebagai nilai 3-bit: 1 untuk Set0 + 2 untuk Set1 + 4 untuk Set2 memberikan angka dalam kisaran 0 hingga 7. BBC basic tidak memiliki operator shift, jadi operator daya yang digunakan sebagai gantinya: 2^ialih-alih 1<<idalam C misalnya.

Setelah memplot lingkaran, loop luar melewati masing-masing dari delapan wilayah, bergerak ke koordinat yang diperlukan (sesuai tabel data.) Lingkaran dalam mencetak semua angka di wilayah itu (yang dengan nilai 3-bit yang sesuai di array.)

  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

Montase input dan output yang khas (versi ungolfed)

Dalam versi golf, posisi angka di luar set ditukar dengan command prompt >.

masukkan deskripsi gambar di sini

Level River St
sumber
Apakah ini bekerja untuk input besar yang sewenang-wenang?
Martin Ender
@ MartinBüttner pada prinsipnya ya algoritma dapat melakukannya, tetapi tampilan membiarkannya turun (seperti yang mungkin menjadi masalah dengan solusi lain.) Saya memberi petunjuk dalam komentar program bahwa setiap wilayah dibatasi hingga 7 angka sebelum mulai menggulir ( angka-angkanya dalam kolom vertikal karena saya pikir pembungkus akan terlihat mengerikan.) Emulator yang saya gunakan dapat menangani resolusi layar yang jauh lebih tinggi, tetapi saya telah menggunakan salah satu mode layar mikro BBC "asli" yang cukup membatasi. Jika seseorang mengirimkan ini ke Jawa, satu-satunya batasan praktis adalah kemampuan manusia untuk membaca diagram.
Level River St
Ah ya, saya hanya ingin tahu apakah lingkaran akan beradaptasi dengan ukuran input ... tentu saja solusi saya juga tidak akan dapat dibaca untuk input besar jika terminal Anda membungkus garis, tetapi selama itu ditampilkan dengan scrollbar, ia dapat menangani input apa pun ukuran.
Martin Ender
2
bahkan jika ini porting ke java Anda harus menambahkan kode untuk membuat lingkaran lebih besar untuk lebih banyak teks
Sparr
14

Javascript 1235

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

Diuji di google chrome v36.

Input diambil dalam variabel atas, set1, set2 dan set3.

Pembaruan: Sekarang secara otomatis skala tergantung pada ukuran input.

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)}

Output sampel:

Venn

rans
sumber
Cukup bagus! Saya bisa memerasnya sedikit lebih ketat, lihat jsfiddle.net/44a4L/2 - lihat fungsi "t", CSS dan body.innerHTML. Logikanya sama. Saya yakin itu masih bisa diperas.
Nenotlep
Ini adalah yang paling indah sejauh ini, sangat disayangkan tidak skala dengan baik. Tiga elemen di dalam area terdalam membuatnya pecah. Apakah Anda berencana membuatnya skala entah bagaimana?
William Barbosa
@WilliamBarbosa scaling diimplementasikan sekarang
rdans
2
Cantik! Menakjubkan! Spektakuler! (Harus menggunakan lebih dari satu superlatif karena SE membenci singkatnya.)
Scott Leadley
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)

Input adalah N diikuti oleh tiga set, dipisahkan oleh koma (misalnya 8, {1,2,4}, {2,3,4,5}, {4,6,8}). Ini menghasilkan satu set dalam seni ACSII seperti berikut:

+---+-+---+0 7
|1  | |3 5|
| +-+-+-+ |
| |2|4| | |
+-+-+-+-+-+
  |6 8  |
  +-----+
faubi
sumber
Haha, dua solusi yang hampir identik dalam 5 menit. (3 jam setelah tantangan diposting ...)
Martin Ender
1
Silakan merujuk ke nomor catatan 6. Tepi Anda dan batas lintas harus karakter yang berbeda, seperti "+".
William Barbosa
4

HTML + JavaScript (E6) 752 761

Format input: maks set1 set2 set3 (setiap set adalah daftar angka yang dipisahkan koma)

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

Tangkapan layar

Contoh 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,30

Tangkapan Layar Chrome

Semua bagian ukuran otomatis berkat rendering 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>

Versi Javascript E5 Berfungsi di Chrome dan MSIE 10 (mungkin 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>

Tidak (jadi) golf

<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>
edc65
sumber
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()

Apakah ada orang lain yang bermain dengan Logo saat kecil?

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

masukkan deskripsi gambar di sini

Jason S
sumber
Apakah font / lingkaran akan berskala untuk input besar yang sewenang-wenang?
Sparr
Tidak, masih memikirkan yang itu.
Jason S
@JasonS Masih berpikir?
Jonathan Frech
3

perl 388b 346b 488b

Ini memiliki output yang mirip dengan entri lain:

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

Uji coba dan hasilkan:

# 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|
 +------------------------------------------------+ 
Sparr
sumber
Hm, saya tidak yakin tata letak benar-benar jelas jika Anda belum melihat inputnya.
Martin Ender
Anda benar, ini belum cukup
William Barbosa
@ WilliamBarbosa ok, saya membuatnya tampak seperti entri faubiguy
Sparr
2

T-SQL 2095

Asumsi @N adalah int yang berisi N. Asumsi @A, @B, dan @C adalah tabel yang berisi tiga set angka. Tidak mencoba golf terlalu banyak.

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

Versi yang kurang golf:

--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
tanda
sumber