Гольф генератора діаграм Венна


26

Гольф генератора діаграм Венна

введіть тут опис зображення

Щоб правильно відсвяткувати 180-річчя Джона Венна , сьогодні вашим завданням буде створення програми, яка виводить діаграму Венна !

Вхід:

Позитивне ціле число, Nяке визначатиме діапазон чисел, що відображаються на діаграмі (від нуля доN ), і три набори натуральних чисел.

Вихід:

3-множинна діаграма Венна, що показує всі цілі числа від 0 до Nта зв’язки множин, відображаючи їх у відповідних областях діаграми, подібних до цієї .

Примітки

  1. Використовуйте stdin (або будь-який еквівалент вашої мови), щоб отримати значення.
  2. Ви можете визначити формат введення для наборів і для N (Відокремлений комою, косою рисою чи будь-яким найкращим для вас).
  3. Числа, які не відображаються в жодному із наборів, але знаходяться у вказаному діапазоні, повинні відображатися на діаграмі, тільки не в будь-якому регіоні.
  4. Набори не потрібно називати.
  5. Вихідним може бути малюнок або ascii-art.
  6. Діаграма може мати будь-яку форму, якщо межі однозначно відрізняються (якщо ви вибрали мистецтво ASCII, наприклад, для перетину меж важливо використовувати + (або подібні)).
  7. Регіони можуть, але не повинні бути затіненими.
  8. Будь-які вбудовані функції або сторонні бібліотеки, які генерують діаграми Венна, заборонені.
  9. Застосовуються стандартні лазівки .

Це , тому найкоротший код у байтах виграє.


Схоже, вам слід було б додати зауваження, що рішення повинні масштабуватися для довільних розмірів введення. Наразі лише деякі з них роблять це (наскільки я можу сказати лише ASCII). Мені не подобається змінювати правила після початку конкурсу, але без цієї вимоги хтось, ймовірно, дійсно може зловживати ним простим макетом, який працює лише для одного символу в кожному наборі (якби я це зробив, я, мабуть, скоротив розмір коду на третину або близько того).
Мартін Ендер

@ MartinBüttner Так, деякі з них масштабуються досить погано. Але додавання примітки тепер, коли є 7 відповідей, здається поганою ідеєю. Чи слід додати нотатку, і вони коментують публікацію кожного, щоб повідомити, що діаграма має масштабуватись до X?
Вільям Барбоса

Встановлення ліміту все одно дозволить просто жорстко кодувати цей ліміт. Я думаю, що правильне масштабування насправді є найважчою частиною проблеми. Тому або залиште його таким, яким він є, або змініть його, щоб сказати, що він повинен мати справу з довільними розмірами наборів (що технічно навіть не є зміною, оскільки ви не обмежили вхідні розміри. Я думаю, що розмір вхідних даних для арбітражних в будь-яких випадках слід вважати) .
Мартін Ендер

@ Раян Зауважимо, що я заявляю, "відображаючи їх у відповідних областях діаграми" у вихідному розділі. Деякі відповіді (включені ваші) не відображають найпотаємніший розділ правильно, якщо зазначений розділ містить більше 5 елементів, тому я вважаю, що він недійсний
Вільям Барбоса

Відповідне xkcd: xkcd.com/1810
сергіол

Відповіді:


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для вибору місця розташування?
Рівень Рівер Сент

Сірий працює, тому що непрозорість становить 10%. RandomSample був використаний для вибору місця розташування. Після вибору місця розташування він видаляється з набору кандидатів на додаткові вибори. Я розігрувався з іншими методами (наприклад, використовуючи центроїд субрегіону, але результати не сподобалися). До речі, мені подобається ваш підхід до встановлення етикетки.
DavidC

Щоб зберегти символи, я перейшов на Circles, тому сірі диски вже не було. Більшість заощаджень відбувається завдяки тому, що всі члени регіону розміщені в центрі цього регіону.
DavidC

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   │
└┼──────┘    │
 └───────────┘

Я не думаю, що мені можна завадити додати версію, що не має волі. Будь ласка, подивіться на оригінальну версію в історії редагування для дещо більш читабельної версії.

Це, безумовно, може бути додатково гольф, зробивши встановлені межі менш жорсткими або навіть утримуючи їх фіксованими, як це роблять деякі графічні, але я вважаю за краще, щоб це виглядало добре і робилося "належним чином", незважаючи на те, що гольф.


Якщо ви не досягли сьогоднішньої шапки, ви б сьогодні приїхали до клубу 10К з цією відповіддю, як шкода
Вільям Барбоса

@WilliamBarbosa Можливо, це завтра дасть мені необхідні результати. ;)
Мартін Ендер

Це добре виглядає діаграма Венна. Я здогадуюсь, що поява діаграми є основною причиною всіх прихильників. Що відбувається з більшими наборами? Я здогадуюсь, що він залишається на одній висоті і просто стає ширшим і ширшим?
Рівень річки Св.

@steveverrill так точно. кожна з 8 підмножин просто надрукована як список з обмеженим пробілом у потрібному положенні. межі завжди однакової форми, а ширина кожної секції визначається як мінімум, щоб вмістити все всередині. Звичайно, це може виглядати приємніше, якби я обчислював розрив рядків, щоб кожне підмножина було приблизно квадратним, але знову ж таки це код-гольф, зрештою;). також це виглядає ще краще без додаткового проміжку між лініями
Мартін Ендер,

1
Бачив маленькі кутові символи та зробив подвійний знімок, думаючи, що це APL чи щось таке. :)
hoosierEE

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 Basic не має оператор зсуву, тому оператор харчування використовується замість: 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

Монтаж типового вводу та виводу (неліточна версія)

У версії для гольфу положення чисел поза наборами обмінюються командним рядком >.

введіть тут опис зображення


Чи працює це для довільно великих входів?
Мартін Ендер

@ MartinBüttner в принципі так, алгоритм може це зробити, але дисплей дозволяє це (як це, мабуть, проблема з іншими рішеннями.) Я натякаю в коментарях програми, що кожна область обмежена 7 цифрами, перш ніж вона почне прокручуватися ( цифри знаходяться у вертикальній колонці, тому що я думав, що загортання виглядатиме жахливо.) Емулятор, який я використовую, може працювати з набагато більшими роздільними можливостями екрана, але я пішов на один з "автентичних" режимів мікроекрану BBC, який досить обмежує. Якщо хтось переносить це на Java, єдиним практичним обмеженням буде здатність людини читати схему.
Рівень річки Св.

Ага так, мені було просто цікаво, чи пристосовуватимуться кола до розміру входу ... звичайно, моє рішення також буде нечитабельним для великих входів, якщо ваш термінал обертає лінії, але поки він відображається за допомогою прокрутки, він може обробляти будь-який вхід розмір.
Мартін Ендер

2
навіть якщо це було перенесено на Java, вам доведеться додати код, щоб збільшити кола для отримання більшого тексту
Sparr

14

Javascript 1235

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

Тестували в Google hrome v36.

Введення приймається у змінних верхній, 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. Та сама логіка, хоча. Я впевнений, що його все-таки можна було б видавити.
Ненотлеп

Це найкрасивіший на даний момент, шкода, що він не гарно масштабує. Три елементи всередині найпотаємнішої області змушують його зламатися. Ви плануєте якось його масштабувати?
Вільям Барбоса

Масштабування @WilliamBarbosa реалізовано зараз
rdans

2
Чудова! Приголомшливий! Видовищний! (Довелося використовувати більше одного превосходного, тому що SE ненавидить стислість.)
Скотт Лідлі

4

Пітон - 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) 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

Пітон 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

введіть тут опис зображення


чи буде шрифт / кола масштабувати для довільно великого введення?
Спарр

Ні, все ще думаючи про це.
Джейсон 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|
 +------------------------------------------------+ 

Гм, я не впевнений, що макет дійсно однозначний, якщо ви ще не бачили введення.
Мартін Ендер

Ви маєте рацію, цього не достатньо
Вільям Барбоса

@WilliamBarbosa в порядку, я зробив це схожим на запис Faubiguy
Sparr

2

T-SQL 2095

Припускає @N - це int, що містить 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.