Golf ein Venn-Diagramm-Generator


26

Golf ein Venn-Diagramm-Generator

Bildbeschreibung hier eingeben

Um den 180. Geburtstag von John Venn gebührend zu feiern , müssen Sie heute ein Programm erstellen, das ein Venn-Diagramm ausgibt !

Eingang:

Eine positive Ganzzahl N, die den im Diagramm angezeigten Zahlenbereich (von Null bis N) und drei Sätze positiver Ganzzahlen definiert.

Ausgabe:

Ein 3-Mengen-Venn-Diagramm, in dem alle Ganzzahlen von 0 bis Nund die Beziehungen der Mengen angezeigt werden, indem sie in den entsprechenden Bereichen des Diagramms angezeigt werden, ähnlich wie in diesem .

Anmerkungen

  1. Verwenden Sie stdin(oder was auch immer die Entsprechung Ihrer Sprache ist), um die Werte abzurufen.
  2. Sie können das Eingabeformat für die Sätze und für definieren N(getrennt durch Komma, Schrägstrich oder was für Sie am besten geeignet ist).
  3. Zahlen, die in keinem der Sätze enthalten sind, sich aber innerhalb des angegebenen Bereichs befinden, müssen im Diagramm angezeigt werden, nur nicht innerhalb einer Region.
  4. Die Sets müssen nicht benannt werden.
  5. Die Ausgabe kann eine Zeichnung oder eine ASCII-Grafik sein.
  6. Das Diagramm kann eine beliebige Form haben, solange die Grenzen eindeutig unterscheidbar sind (wenn Sie sich für ASCII-Grafik entschieden haben, ist beispielsweise die Verwendung von + (oder einer ähnlichen Option) zum Überschreiten von Grenzen unerlässlich).
  7. Die Regionen können, müssen aber nicht schattiert sein.
  8. Alle integrierten Funktionen oder Bibliotheken von Drittanbietern, die Venn-Diagramme generieren, sind nicht zulässig.
  9. Es gelten Standardlücken .

Das ist , also gewinnt der kürzeste Code in Bytes.


Es sieht so aus, als hätten Sie einen Hinweis hinzufügen sollen, dass Lösungen für beliebige Eingabegrößen skaliert werden müssen. Momentan machen das nur wenige (soweit ich nur die ASCII-Werte verstehe). Ich mag es nicht, Regeln zu ändern, nachdem der Wettbewerb begonnen hat, aber ohne diese Anforderung könnte es wahrscheinlich jemand mit einem einfachen Layout, das nur für ein Zeichen in jedem Satz funktioniert, wirklich missbrauchen (wenn ich das täte, würde ich wahrscheinlich die Codegröße reduzieren zu einem Drittel oder so).
Martin Ender

@ MartinBüttner Ja, einige von ihnen skalieren ziemlich schlecht. Es scheint jedoch eine schlechte Idee zu sein, jetzt, da es 7 Antworten gibt, eine Notiz hinzuzufügen. Sollte die Notiz hinzugefügt werden und sie sollten jeden Beitrag kommentieren, um sie wissen zu lassen, dass das Diagramm gut auf X skaliert werden sollte?
William Barbosa

Wenn Sie ein Limit festlegen, können Sie dieses Limit nur hart codieren. Ich denke, dass die richtige Skalierung der schwierigste Teil der Herausforderung ist. Lassen Sie es also entweder so, wie es ist, oder ändern Sie es, um zu sagen, dass es sich um beliebige Satzgrößen handeln muss (was technisch gesehen nicht einmal eine Änderung ist, da Sie die Eingabegrößen nicht begrenzt haben. Ich denke, willkürliche Eingabegrößen sollten sowieso angenommen werden.) .
Martin Ender

@ Ryan Beachten Sie, dass ich im Ausgabeabschnitt "Indem ich sie in den richtigen Bereichen des Diagramms anzeige" sage. Einige Antworten (Ihre eingeschlossen) zeigen den innersten Abschnitt nicht korrekt an, wenn der Abschnitt mehr als 5 Elemente enthält, daher denke ich, dass er ungültig ist
William Barbosa

Relevante xkcd: xkcd.com/1810
sergiol

Antworten:


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

Angenommen, 10wurde eingegeben für mund {{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}wurde eingegeben für d,

neues venn diagramm


Golf gespielt 264

Ich war überrascht, dass die gesamte Berechnung innerhalb der GraphicsFunktion selbst durchgeführt werden konnte. Mit Ausnahme der Eingänge handelt es sich um einen Einzeiler.

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 für das Erscheinen der Kreise. Ich bin überrascht, dass sie in Grau so gut aussehen. Die Streuung der Zahlen ist allerdings komisch. Sie verwenden RandomSample, um den Standort zu wählen?
Level River St

Grau funktioniert, weil die Opazität 10% beträgt. RandomSample wurde verwendet, um den Ort auszuwählen. Sobald ein Standort ausgewählt wurde, wird er aus der Gruppe der Kandidaten für zusätzliche Auswahl entfernt. Ich habe mit anderen Methoden herumgespielt (zB mit dem Schwerpunkt einer Subregion, aber die Ergebnisse haben mir nicht gefallen). Übrigens, ich mag Ihren Ansatz, Etiketten anzubringen.
DavidC

Um Zeichen zu speichern, wechselte ich zu Circles, damit die grauen Scheiben weg sind. Die meisten Einsparungen ergeben sich aus der Tatsache, dass alle Mitglieder einer Region in der Mitte dieser Region eingezeichnet sind.
DavidC

45

Ruby, 654 590 566 542 505 Bytes

Das hat Spaß gemacht. Ich habe ASCII verwendet. Ich konnte noch nicht alle möglichen Kombinationen testen. Wenn Sie also einen fehlerhaften Testfall finden, lassen Sie es mich bitte wissen.

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

Es erwartet die Eingabe auf STDIN im folgenden Format

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

Und werde dich dann mit dieser Schönheit belohnen

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

Ich glaube nicht, dass ich die Mühe machen kann, eine ungolfed Version hinzuzufügen. Bitte schauen Sie sich die Originalversion im Bearbeitungsverlauf an, um eine etwas besser lesbare Version zu erhalten.

Dies könnte sicherlich weiter verbessert werden, indem die festgelegten Grenzen weniger eng werden oder sogar festgehalten werden, wie dies bei einigen der grafischen Grenzen der Fall ist, aber ich bevorzuge, dass es gut aussieht und trotz des Golfspiels "richtig" ausgeführt wird.


Wenn Sie das heutige Cap nicht erreicht hätten, würden Sie heute mit dieser Antwort den 10-km-Club erreichen. Schade
William Barbosa,

@WilliamBarbosa Vielleicht bekomme ich morgen die nötigen Stimmen dazu. ;)
Martin Ender

Das ist ein gut aussehendes Venn-Diagramm. Ich vermute, das Aussehen des Diagramms ist der Hauptgrund für all Ihre positiven Stimmen. Was passiert bei größeren Sets? Ich vermute, es bleibt gleich hoch und wird immer breiter?
Level River St

@steveverrill ja genau. Jede der 8 Untergruppen wird nur als durch Leerzeichen getrennte Liste an der richtigen Position gedruckt. Die Begrenzungen haben immer die gleiche Form, und die Breite jedes Abschnitts ist so klein wie möglich, damit alles hineinpasst. Natürlich könnte es besser aussehen, wenn ich einen Zeilenumbruch berechne, um jede Teilmenge ungefähr quadratisch zu halten, aber das ist schließlich wieder Code-Golf;). auch ohne den zusätzlichen abstand zwischen den zeilen sieht es noch besser aus
martin

1
Sah die kleinen Winkelfiguren und machte eine Doppelaufnahme, dachte, es sei APL oder so. :)
hoosierEE

15

BBC BASIC, 243 ASCII-Zeichen (tokenisierte Dateigröße 211 Byte)

Laden Sie den Emulator unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter

Golf gespielt

  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 ist sehr willkürlich, welche Zeilenumbrüche / Leerzeichen Sie entfernen können. Abgesehen davon, dass unnötige Zeilenumbrüche entfernt werden, gibt es hier einen anderen Trick, der nicht in der ungolfed-Version enthalten ist: Ich ordne das Ansichtsfenster (siehe Erläuterung unten in ungolfed-Kommentaren) am ENDE der Plotschleife zu, nicht am Anfang. Dies bedeutet, dass die Elemente außerhalb des Satzes oben links dargestellt werden und der Cursor in einem Ansichtsfenster oben rechts am Ende des Programms eingeschlossen wird. Der Grund dafür ist die Beseitigung der VDU26.

Ungolfed

Jeder Satz von Zahlen wird beendet, indem der Benutzer die Zahl N + 1 eingibt (eine etwas ungewöhnliche Wahl, um Fehler zu vermeiden, die beim Versuch auftreten, außerhalb des Bereichs eines Arrays zu schreiben.). Anschließend wird vom Textmodus in den Grafikmodus gewechselt und zeichnet das Venn-Diagramm.

Die Eingabedaten werden in einem Array gespeichert, wobei für jeden anzuzeigenden Wert eine Zelle vorhanden ist. Die Daten werden als 3-Bit-Wert gespeichert: 1 für Set0 + 2 für Set1 + 4 für Set2 mit einer Zahl im Bereich von 0 bis 7. BBC basic hat keinen Shift-Operator, daher wird stattdessen der Power-Operator verwendet: 2^ianstelle von 1<<iin C zum Beispiel.

Nach dem Zeichnen der Kreise durchläuft eine äußere Schleife jede der acht Regionen und bewegt sich zu den erforderlichen Koordinaten (gemäß einer Datentabelle). Eine innere Schleife druckt alle Zahlen in dieser Region (die mit dem entsprechenden 3-Bit-Wert in der 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

Montage typischer Ein- und Ausgänge (ungolfed version)

In der Golfversion wird die Position der Zahlen außerhalb der Sätze mit der Eingabeaufforderung ausgetauscht >.

Bildbeschreibung hier eingeben


Funktioniert dies für beliebig große Eingaben?
Martin Ender

@ MartinBüttner prinzipiell ja der Algorithmus kann das, aber die Anzeige lässt es runter (wie es bei anderen Lösungen wahrscheinlich das Problem ist.) Ich weise in den Programmkommentaren darauf hin, dass jede Region auf 7 Ziffern begrenzt ist, bevor sie zu scrollen beginnt ( Die Zahlen sind in einer vertikalen Spalte, da ich dachte, der Zeilenumbruch würde schrecklich aussehen.) Der Emulator, den ich verwende, kann viel höhere Bildschirmauflösungen verarbeiten, aber ich habe mich für einen der "authentischen" BBC-Mikrobildschirmmodi entschieden, der ziemlich einschränkend ist. Wenn jemand dies nach Java portiert, besteht die einzige praktische Einschränkung in der Fähigkeit des Menschen, das Diagramm zu lesen.
Level River St

Ah ja, ich habe mich nur gefragt, ob sich die Kreise an die Eingabegröße anpassen würden. Natürlich ist meine Lösung auch für große Eingaben nicht lesbar, wenn Ihr Terminal die Zeilen umbricht. Solange sie mit Bildlaufleisten angezeigt wird, kann sie jedoch jede Eingabe verarbeiten Größe.
Martin Ender

2
Selbst wenn dies nach Java portiert wäre, müssten Sie Code hinzufügen, um die Kreise für mehr Text zu vergrößern
Sparr

14

Javascript 1235

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

Getestet in Google Chrome V36.

Die Eingabe erfolgt in den Variablen upper, set1, set2 und set3.

Update: Skaliert nun automatisch abhängig von der Größe der Eingabe.

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

Beispielausgabe:

Venn


Sehr schön! Ich konnte es ein bisschen enger drücken, siehe jsfiddle.net/44a4L/2 - siehe "t" -Funktion, CSS und body.innerHTML. Die gleiche Logik. Ich bin sicher, es könnte noch gedrückt werden.
Nenotlep

Dies ist die bisher schönste, schade, dass sie nicht gut skaliert. Drei Elemente im innersten Bereich lassen es brechen. Planen Sie es irgendwie skalieren zu lassen?
William Barbosa

@ WilliamBarbosa Skalierung ist jetzt implementiert
rdans

2
Herrlich! Atemberaubend! Spektakulär! (Musste mehr als einen Superlativ verwenden, weil SE Kürze hasst.)
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)

Die Eingabe ist N, gefolgt von den drei durch Kommas getrennten Mengen (z 8, {1,2,4}, {2,3,4,5}, {4,6,8}. B. ). Es gibt einen Satz in ACSII-Grafik wie folgt aus:

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

Haha, zwei nahezu identische Lösungen innerhalb von 5 Minuten. (3 Stunden nachdem die Herausforderung veröffentlicht wurde ...)
Martin Ender

1
Bitte beachten Sie Hinweis Nummer 6. Ihre Kanten und Grenzüberschreitungen müssen ein anderes Zeichen sein, z. B. "+".
William Barbosa

4

HTML + JavaScript (E6) 752 761

Eingabeformat: max set1 set2 set3 (jeder Satz ist eine durch Kommas getrennte Liste von Zahlen)

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

Bildschirmfoto

Beispiel 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 Screenshot

Alle Abschnitte automatisch Größe dank HTML-Rendering.

<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 Version Funktioniert in Chrome und MSIE 10 (vielleicht 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>

Nicht (so) golfen

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

Hat noch jemand als Kind mit Logo gespielt?

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

Bildbeschreibung hier eingeben


Skalieren die Schriftarten / Kreise für beliebig große Eingaben?
Sparr

Nein, ich denke immer noch darüber nach.
Jason S

@JasonS Denken Sie immer noch?
Jonathan Frech

3

Perl 388b 346b 488b

Diese Ausgabe ähnelt einem anderen Eintrag:

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

Testlauf und Ausgabe:

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

Hm, ich bin mir nicht sicher, ob das Layout wirklich eindeutig ist, wenn Sie die Eingabe nicht gesehen haben.
Martin Ender

Du hast recht, das ist nicht genug
William Barbosa

@WilliamBarbosa ok, ich habe es so aussehen lassen, als ob faubiguys Eintrag
Sparr

2

T-SQL 2095

Angenommen, @N ist ein Int mit N. Angenommen, @A, @B und @C sind Tabellen mit den drei Zahlenmengen. Ich habe nicht versucht, zu viel Golf zu spielen.

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

Weniger Golf Version:

--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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.