Máy phát điện biểu đồ Venn


26

Máy phát điện biểu đồ Venn

nhập mô tả hình ảnh ở đây

Để kỷ niệm sinh nhật lần thứ 180 của John Venn , hôm nay, nhiệm vụ của bạn là tạo ra một chương trình tạo ra Sơ đồ Venn !

Đầu vào:

Một số nguyên dương Nsẽ xác định phạm vi số xuất hiện trong sơ đồ (Từ 0 đến N) và ba bộ số nguyên dương.

Đầu ra:

Biểu đồ Venn gồm 3 bộ hiển thị tất cả các số nguyên từ 0 đến Nvà các mối quan hệ của các bộ bằng cách hiển thị chúng trong các vùng thích hợp của sơ đồ, tương tự như số này .

Ghi chú

  1. Sử dụng stdin(hoặc bất cứ thứ gì tương đương với ngôn ngữ của bạn) để nhận các giá trị.
  2. Bạn có thể xác định định dạng đầu vào cho các bộ và cho N(Được phân tách bằng dấu phẩy, dấu gạch chéo hoặc bất cứ thứ gì phù hợp nhất với bạn).
  3. Các số không xuất hiện trong bất kỳ tập hợp nào nhưng nằm trong phạm vi được chỉ định phải xuất hiện trên sơ đồ, không nằm trong bất kỳ khu vực nào.
  4. Các bộ không cần phải được đặt tên.
  5. Đầu ra có thể là một bản vẽ hoặc ascii-art.
  6. Biểu đồ có thể có bất kỳ hình dạng nào miễn là các ranh giới có thể phân biệt rõ ràng (ví dụ: nếu bạn chọn nghệ thuật ASCII, sử dụng + (hoặc tương tự) để vượt qua các ranh giới là điều cần thiết, chẳng hạn).
  7. Các khu vực có thể nhưng không phải được tô bóng.
  8. Bất kỳ chức năng tích hợp hoặc thư viện bên thứ ba nào tạo Sơ đồ Venn đều không được phép.
  9. Tiêu chuẩn áp dụng .

Đây là , vì vậy mã ngắn nhất, tính bằng byte, sẽ thắng.


Có vẻ như bạn nên thêm một lưu ý rằng các giải pháp phải mở rộng cho các kích thước đầu vào tùy ý. Hiện tại chỉ có một vài người trong số họ làm điều đó (theo như tôi chỉ có thể nói với những người ASCII). Tôi không thích thay đổi quy tắc sau khi cuộc thi bắt đầu, nhưng không có yêu cầu này, ai đó có thể thực sự lạm dụng nó với bố cục đơn giản chỉ hoạt động cho một ký tự trong mỗi bộ (nếu tôi làm vậy có lẽ tôi sẽ cắt kích thước mã đến một phần ba hoặc hơn).
Martin Ender

@ MartinBüttner Vâng, một số trong số họ có quy mô khá tệ. Nhưng thêm một lưu ý bây giờ có 7 câu trả lời có vẻ là một ý tưởng tồi. Có nên thêm ghi chú và họ nhận xét về bài đăng của mọi người để cho họ biết rằng sơ đồ nên mở rộng theo X?
William Barbosa

Đặt giới hạn sẽ vẫn chỉ cho phép mã hóa cứng giới hạn đó. Tôi nghĩ rằng việc mở rộng quy mô thực sự là phần khó khăn nhất của thử thách. Vì vậy, hãy để nguyên như vậy hoặc thay đổi nó để nói rằng nó phải xử lý các kích thước tập hợp tùy ý (về mặt kỹ thuật thậm chí không phải là một thay đổi, vì dù sao bạn cũng không giới hạn kích thước đầu vào. .
Martin Ender

@Ryan Lưu ý rằng tôi nêu "bằng cách hiển thị chúng trong các vùng thích hợp của sơ đồ" trong phần đầu ra. Một số câu trả lời (bao gồm của bạn) không hiển thị chính xác phần trong cùng nếu phần nói có nhiều hơn 5 yếu tố, vì vậy tôi nghĩ rằng nó không hợp lệ
William Barbosa

Câu trả lời:


8

Toán học 343 264

Vô duyên

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

Giả sử 10là đầu vào cho m{{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}là đầu vào cho d,

sơ đồ venn mới


Chơi gôn 264

Tôi đã ngạc nhiên rằng tất cả các tính toán có thể được thực hiện trong Graphicschính chức năng. Ngoại trừ các đầu vào, nó là một lớp lót.

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 cho sự xuất hiện của các vòng tròn. Tôi ngạc nhiên khi họ trông rất tốt trong màu xám. Sự phân tán của các con số là kỳ lạ mặc dù. Bạn đang sử dụng RandomSampleđể chọn vị trí?
Cấp sông St

Màu xám hoạt động vì độ mờ là 10%. RandomSample đã được sử dụng để chọn vị trí. Khi một địa điểm đã được chọn, nó sẽ bị xóa khỏi nhóm ứng cử viên cho các lượt chọn bổ sung. Tôi đã chơi xung quanh với các phương pháp khác (ví dụ: sử dụng trọng tâm của một tiểu vùng, nhưng không thích kết quả). BTW, tôi thích cách tiếp cận của bạn để phù hợp với nhãn.
DavidC

Để lưu các ký tự, tôi chuyển sang Circles, vì vậy các đĩa màu xám đã biến mất. Hầu hết các khoản tiết kiệm đến từ thực tế là tất cả các thành viên của một khu vực được vẽ ở trung tâm của khu vực đó.
DavidC

45

Ruby, 654 590 566 542 505 byte

Đây là niềm vui Tôi đã sử dụng ASCII. Tôi chưa thể kiểm tra mọi sự kết hợp có thể, vì vậy nếu bạn tìm thấy một trường hợp thử nghiệm rắc rối, xin vui lòng cho tôi biết.

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

Nó hy vọng đầu vào trên STDIN theo định dạng sau

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

Và sau đó sẽ thưởng cho bạn với vẻ đẹp này

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

Tôi không nghĩ rằng tôi có thể bị làm phiền khi thêm phiên bản không được chỉnh sửa. Hãy có một cái nhìn tại phiên bản gốc trong lịch sử chỉnh sửa cho một phần nào phiên bản dễ đọc hơn.

Điều này chắc chắn có thể được đánh gôn hơn nữa bằng cách làm cho các ranh giới được thiết lập ít chặt chẽ hơn hoặc thậm chí giữ chúng cố định như một số đồ họa đã làm, nhưng tôi thích rằng nó trông đẹp và được thực hiện "đúng cách" mặc dù đã được đánh gôn.


Nếu bạn không đạt được giới hạn ngày hôm nay, bạn sẽ đến câu lạc bộ 10K ngày hôm nay với câu trả lời này, thật đáng tiếc
William Barbosa

@WilliamBarbosa Có lẽ nó sẽ cung cấp cho tôi những ưu đãi cần thiết vào ngày mai. ;)
Martin Ender

Đó là một sơ đồ Venn đẹp mắt. Tôi đoán sự xuất hiện của sơ đồ là lý do chính cho tất cả các bạn upvote. Điều gì xảy ra cho các bộ lớn hơn? Tôi đoán nó vẫn giữ nguyên chiều cao và ngày càng rộng hơn?
Cấp sông St

@steveverrill có chính xác. mỗi trong số 8 tập con chỉ được in dưới dạng một danh sách giới hạn không gian ở đúng vị trí. các ranh giới luôn có cùng hình dạng và chiều rộng của mỗi phần được xác định là tối thiểu có thể để phù hợp với mọi thứ bên trong. tất nhiên, nó có thể trông đẹp hơn nếu tôi tính toán ngắt dòng để giữ cho mỗi tập hợp con gần như vuông, nhưng sau đó, đây lại là mã golf.). Ngoài ra, nó trông thậm chí còn tốt hơn mà không có khoảng cách bổ sung giữa các dòng
Martin Ender

1
Nhìn thấy các nhân vật góc nhỏ và thực hiện một cú đúp, nghĩ rằng đó là APL hoặc một cái gì đó. :)
hoosierEE

15

BBC BASIC, 243 ký tự ASCII (kích thước tệp được mã hóa 211 byte)

Tải xuống trình giả lập tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Chơi gôn

  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 rất độc đoán về những dòng mới / khoảng trắng bạn có thể loại bỏ. Ngoài việc loại bỏ các dòng mới không cần thiết, còn có một mẹo khác ở đây không phải là phiên bản không được cung cấp: Tôi chỉ định chế độ xem (xem giải thích bên dưới trong các nhận xét không được chỉnh sửa) tại END của vòng lặp âm mưu, không phải ở đầu. Điều này có nghĩa là các phần tử bên ngoài tập hợp được vẽ ở phía trên bên trái và con trỏ bị kẹt trong chế độ xem ở trên cùng bên phải ở cuối chương trình. Lý do cho điều này là để loại bỏ VDU26.

Bị đánh cắp

Mỗi bộ số bị chấm dứt bởi người dùng nhập số N + 1 (một lựa chọn hơi bất thường, điều này là để tránh các lỗi gây ra bằng cách ghi bên ngoài phạm vi của một mảng.) Sau đó, nó thay đổi từ chế độ văn bản sang chế độ đồ họa và vẽ sơ đồ Venn.

Dữ liệu đầu vào được lưu trữ trong một mảng, một ô cho mỗi giá trị được hiển thị. Dữ liệu được lưu trữ như là một giá trị 3-bit: 1 cho Set0 + 2 cho set1 +4 cho set2 đưa ra một số nằm trong khoảng từ 0 đến 7. BBC cơ bản đã không điều hành thay đổi, vì vậy các nhà điều hành điện được sử dụng thay: 2^ithay vì 1<<itrong C chẳng hạn.

Sau khi vẽ các vòng tròn, một vòng lặp bên ngoài đi qua từng vùng trong tám vùng, di chuyển đến tọa độ cần thiết (theo bảng dữ liệu.) Một vòng lặp bên trong in tất cả các số trong vùng đó (những vòng có giá trị 3 bit tương ứng trong mảng.)

  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

Montage của đầu vào và đầu ra điển hình (phiên bản chưa được chỉnh sửa)

Trong phiên bản đánh gôn, vị trí của các số bên ngoài bộ được trao đổi với dấu nhắc lệnh >.

nhập mô tả hình ảnh ở đây


Liệu điều này làm việc cho đầu vào lớn tùy ý?
Martin Ender

@ MartinBüttner về nguyên tắc có, thuật toán có thể làm điều đó, nhưng màn hình cho phép nó bị hỏng (rất có thể là vấn đề với các giải pháp khác.) Tôi gợi ý trong các nhận xét chương trình rằng mỗi vùng được giới hạn ở 7 số trước khi bắt đầu cuộn ( các con số nằm trong một cột dọc như tôi nghĩ gói sẽ trông rất khủng khiếp.) Trình giả lập tôi đang sử dụng có thể xử lý độ phân giải màn hình cao hơn nhiều, nhưng tôi đã sử dụng một trong các chế độ màn hình vi mô "xác thực" của BBC khá hạn chế. Nếu ai đó chuyển cái này sang Java, giới hạn thực tế duy nhất sẽ là khả năng của con người để đọc sơ đồ.
Cấp sông St

À đúng rồi, tôi chỉ tự hỏi liệu các vòng tròn có thích ứng với kích thước đầu vào hay không ... tất nhiên giải pháp của tôi cũng sẽ không thể đọc được đối với các đầu vào lớn nếu thiết bị đầu cuối của bạn bọc các dòng, nhưng miễn là nó được hiển thị với thanh cuộn, nó có thể xử lý bất kỳ đầu vào nào kích thước.
Martin Ender

2
ngay cả khi điều này được chuyển sang java, bạn phải thêm mã để làm cho các vòng tròn lớn hơn để có nhiều văn bản hơn
Sparr

14

Javascript 1235

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

Đã thử nghiệm trong google chrome v36.

Đầu vào được lấy trong các biến trên, set1, set2 và set3.

Cập nhật: Bây giờ tự động chia tỷ lệ tùy thuộc vào kích thước của đầu vào.

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

Đầu ra mẫu:

Venn


Khá đẹp! Tôi đã có thể siết nó chặt hơn một chút, xem jsfiddle.net/44a4L/2 - xem chức năng "t", CSS và body.innerHTML. Mặc dù logic tương tự. Tôi chắc chắn rằng nó vẫn có thể được ép.
Nenotlep

Đây là một trong những đẹp nhất cho đến nay, thật đáng tiếc nó không quy mô tốt. Ba yếu tố bên trong khu vực trong cùng làm cho nó bị phá vỡ. Bạn có kế hoạch làm cho nó quy mô bằng cách nào đó?
William Barbosa

@WilliamBarbosa rộng được thực hiện tại
rdans

2
Tuyệt đẹp! Kinh ngạc! Đẹp mắt! (Phải sử dụng nhiều hơn một so sánh nhất vì SE ghét sự ngắn gọn.)
Scott Leadley

4

Con trăn - 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)

Đầu vào là N theo sau là ba bộ, được phân tách bằng dấu phẩy (ví dụ 8, {1,2,4}, {2,3,4,5}, {4,6,8}). Nó xuất ra một tập hợp trong nghệ thuật ACSII như sau:

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

Haha, hai giải pháp gần như giống hệt nhau trong vòng 5 phút. (3 giờ sau khi thử thách được đăng ...)
Martin Ender

1
Vui lòng tham khảo ghi chú số 6. Các cạnh và đường biên của bạn cần phải là một ký tự khác, chẳng hạn như "+".
William Barbosa

4

HTML + JavaScript (E6) 752 761

Định dạng đầu vào: max set1 set2 set3 (mỗi bộ là một danh sách các số được phân tách bằng dấu phẩy)

Ví dụ: 10 1,2,3,4,5,9 1,2,3,6,8 7,2,9

Ảnh chụp màn hình

Ví dụ 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

Ảnh chụp màn hình Chrome

Tất cả các phần kích thước tự động nhờ kết xuất 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>

Phiên bản Javascript E5 Hoạt động trong Chrome và MSIE 10 (có thể 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>

Không (nên) chơi 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>

3

Trăn 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()

Có ai khác chơi với Logo khi còn bé không?

Mẫu vật: python3 turtletest.py 15 1,2,3,4,5,9,10,12 1,3,4,6,7,9 1,2,7,8,9

nhập mô tả hình ảnh ở đây


phông chữ / vòng tròn quy mô cho đầu vào lớn tùy ý?
Sparr

Không, vẫn nghĩ về điều đó.
Jason S

@JasonS Vẫn đang suy nghĩ?
Jonathan Frech

3

perl 388b 346b 488b

Điều này có đầu ra tương tự như một mục khác:

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

Chạy thử và đầu ra:

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

Hừm, tôi không chắc bố cục thực sự không rõ ràng nếu bạn chưa thấy đầu vào.
Martin Ender

Bạn nói đúng, điều này không đủ venn-y
William Barbosa

@WilliamBarbosa ok, tôi đã làm cho nó giống như mục của faubiguy
Sparr

2

T-SQL 2095

Giả sử @N là một int chứa N. Giả sử @A, @B và @C là các bảng chứa ba bộ số. Đừng cố chơi golf quá nhiều.

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

Phiên bản ít chơi gôn hơn:

--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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.