Generator diagramów Venna

26

Generator diagramów Venna

wprowadź opis zdjęcia tutaj

Aby właściwie świętować 180. urodziny Johna Venna , dzisiaj Twoim zadaniem będzie stworzenie programu, który wygeneruje diagram Venna !

Wkład:

Dodatnia liczba całkowita N, która określi zakres liczb występujących na schemacie (od zera do N) oraz trzy zestawy dodatnich liczb całkowitych.

Wydajność:

Diagram Venna Nskładający się z trzech zestawów, pokazujący wszystkie liczby całkowite od 0 do i relacje zbiorów, wyświetlając je w odpowiednich obszarach diagramu, podobnych do tego .

Uwagi

  1. Użyj stdin(lub cokolwiek, co jest odpowiednikiem twojego języka), aby uzyskać wartości.
  2. Możesz zdefiniować format wejściowy dla zestawów i dla N(Oddzielone przecinkiem, ukośnikiem lub tym, co najbardziej Ci odpowiada).
  3. Liczby, które nie pojawiają się w żadnym zestawie, ale mieszczą się w określonym zakresie, muszą pojawiać się na schemacie, ale nie w żadnym regionie.
  4. Zestawy nie muszą mieć nazw.
  5. Wyjściem może być rysunek lub ascii-art.
  6. Schemat może mieć dowolny kształt, o ile granice są jednoznacznie rozróżnialne (jeśli wybierzesz grafikę ASCII, na przykład konieczne jest użycie znaku + (lub podobnego) do przekraczania granic).
  7. Regiony mogą, ale nie muszą być zacienione.
  8. Wszelkie wbudowane funkcje lub biblioteki stron trzecich generujące diagramy Venna są niedozwolone.
  9. Obowiązują standardowe luki .

To jest , więc wygrywa najkrótszy kod w bajtach.

William Barbosa
źródło
Wygląda na to, że powinieneś dodać notatkę, że rozwiązania muszą być skalowane dla dowolnych rozmiarów danych wejściowych. Obecnie tylko kilka z nich to robi (o ile mogę powiedzieć tylko ASCII). Nie lubię zmieniać reguł po rozpoczęciu konkursu, ale bez tego wymogu ktoś mógłby naprawdę nadużyć dzięki prostemu układowi, który działa tylko na jeden znak w każdym zestawie (gdybym to zrobił, prawdopodobnie zmniejszyłbym rozmiar kodu do jednej trzeciej).
Martin Ender,
@ MartinBüttner Tak, niektóre z nich skalują się dość źle. Ale dodanie notatki, że jest 7 odpowiedzi, wydaje się złym pomysłem. Czy należy dodać notatkę, a oni skomentują post każdego, aby poinformować ich, że schemat powinien być skalowany do X?
William Barbosa,
Ustawienie limitu nadal pozwoli na jego stałe zakodowanie. Myślę, że właściwe skalowanie jest w rzeczywistości najtrudniejszą częścią wyzwania. Więc zostaw to tak, jak jest, lub zmień, aby mówić, że musi sobie poradzić z dowolnymi ustawionymi rozmiarami (co technicznie nie jest nawet zmianą, ponieważ nie ograniczyłeś rozmiarów wejściowych, myślę, że i tak należy przyjąć arbirtrarne rozmiary wejściowe) .
Martin Ender,
@ Ryan Zauważ, że stwierdzam „wyświetlając je w odpowiednich regionach diagramu” w części wyjściowej. Niektóre odpowiedzi (w tym twoje) nie wyświetlają poprawnie wewnętrznej sekcji, jeśli ta sekcja ma więcej niż 5 elementów, więc myślę, że jest niepoprawna
William Barbosa,
Odpowiedni xkcd: xkcd.com/1810
sergiol

Odpowiedzi:

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

Zakładając 10było wejście do mi {{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}było wejście do d,

nowy schemat Venna


Gra w golfa 264

Byłem zaskoczony, że wszystkie obliczenia można przeprowadzić w ramach Graphicssamej funkcji. Z wyjątkiem danych wejściowych jest to jedna linijka.

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
źródło
+1 za pojawienie się kręgów. Dziwię się, że tak dobrze wyglądają na szaro. Rozrzucanie liczb jest jednak dziwne. Używasz, RandomSampleaby wybrać lokalizację?
Level River St
Szary działa, ponieważ krycie wynosi 10%. Do wybrania lokalizacji użyto RandomSample. Po wybraniu lokalizacji jest ona usuwana ze zbioru kandydatów na dodatkowe typy. Bawiłem się innymi metodami (np. Wykorzystując centroid podregionu, ale nie podobały mi się wyniki). BTW, podoba mi się twoje podejście do dopasowywania etykiet.
DavidC
Aby zapisać postacie, przełączyłem się na Circles, więc szare dyski zniknęły. Większość oszczędności wynika z faktu, że wszyscy członkowie regionu są narysowani w centrum tego regionu.
DavidC,
45

Rubinowy, 654 590 566 542 505 bajtów

To było fajne. Użyłem ASCII. Nie byłem jeszcze w stanie przetestować każdej możliwej kombinacji, więc jeśli znajdziesz usterkę testową, daj mi znać.

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

Oczekuje danych wejściowych STDIN w następującym formacie

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

I wtedy nagrodzi cię tym pięknem

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

Nie sądzę, żebym mógł się martwić dodaniem wersji bez golfa. Zapoznaj się z oryginalną wersją w historii edycji, aby uzyskać nieco bardziej czytelną wersję.

Można to z pewnością pograć w golfa, zmniejszając granice zestawów, a nawet utrzymując je tak, jak niektóre graficzne, ale wolę, aby wyglądały ładnie i zostały wykonane „poprawnie”, pomimo tego, że grały w golfa.

Martin Ender
źródło
Gdybyś nie osiągnął dzisiejszego limitu, dotarłbyś dzisiaj do klubu 10K z tą odpowiedzią, szkoda
William Barbosa
@WilliamBarbosa Może jutro dostarczy mi niezbędnych głosów. ;)
Martin Ender
To ładnie wyglądający diagram Venna. Domyślam się, że pojawienie się diagramu jest głównym powodem wszystkich pozytywnych opinii. Co dzieje się w przypadku większych zestawów? Zgaduję, że pozostaje na tej samej wysokości i po prostu robi się coraz szerszy?
Level River St
@steveverrill tak dokładnie. każdy z 8 podzbiorów jest po prostu drukowany jako lista rozdzielana spacjami we właściwej pozycji. granice mają zawsze ten sam kształt, a szerokość każdej sekcji jest określana jako minimum możliwe do zmieszczenia wszystkiego w środku. oczywiście może wyglądać ładniej, gdybym obliczył podział linii, aby każdy podzbiór był mniej więcej kwadratowy, ale z drugiej strony jest to w końcu golf-golf;). wygląda też jeszcze lepiej bez dodatkowego odstępu między wierszami
Martin Ender
1
Zobaczyłem małe postacie z kąta i zrobiłem podwójny rzut, myśląc, że to APL czy coś. :)
hoosierEE
15

BBC BASIC, 243 znaki ASCII (tokenizowany rozmiar pliku 211 bajtów)

Pobierz emulator z http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Grał w golfa

  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 bardzo arbitralnie określa, które znaki nowej linii / białe znaki można wyeliminować. Oprócz usuwania niepotrzebnych nowych linii jest jeszcze jedna sztuczka, której nie ma w wersji bez golfa: Przypisuję rzutnię (patrz wyjaśnienie poniżej w komentarzach bez golfa) na KONIEC pętli kreślarskiej, nie na początku. Oznacza to, że elementy poza zestawem są drukowane w lewym górnym rogu, a kursor jest uwięziony w rzutni w prawym górnym rogu na końcu programu. Powodem tego jest wyeliminowanie VDU26.

Nie golfił

Każdy zestaw liczb jest kończony przez użytkownika wprowadzającego liczbę N + 1 (nieco nietypowy wybór, aby uniknąć błędów spowodowanych próbą zapisu poza zakresem tablicy.) Następnie przechodzi z trybu tekstowego do trybu graficznego i rysuje diagram Venna.

Dane wejściowe są przechowywane w tablicy, po jednej komórce dla każdej wyświetlanej wartości. Dane są przechowywane jako 3-bitowa wartość: 1 dla Set0 + 2 dla Set1 + 4 dla Set2, podając liczbę z zakresu od 0 do 7. BBC basic nie ma operatora zmiany biegów, więc zamiast niego używany jest operator mocy: 2^izamiast 1<<iw Na przykład C.

Po wykreśleniu okręgów zewnętrzne pętle przechodzą przez każdy z ośmiu regionów, przesuwając się do wymaganych współrzędnych (zgodnie z tabelą danych). Pętla wewnętrzna drukuje wszystkie liczby w tym regionie (te o odpowiedniej wartości 3-bitowej w szyk.)

  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

Montaż typowego wejścia i wyjścia (wersja bez golfa)

W wersji golfowej pozycja liczb poza zestawami jest wymieniana z wierszem poleceń >.

wprowadź opis zdjęcia tutaj

Level River St
źródło
Czy to działa w przypadku dowolnie dużych nakładów?
Martin Ender
@ MartinBüttner w zasadzie tak, algorytm może to zrobić, ale wyświetlacz go zawodzi (co może stanowić problem z innymi rozwiązaniami). W komentarzu programu sugeruję, że każdy region jest ograniczony do 7 cyfr, zanim zacznie się przewijać ( liczby są w kolumnie pionowej, ponieważ myślałem, że zawijanie będzie wyglądać okropnie.) Emulator, którego używam, może obsługiwać znacznie wyższe rozdzielczości ekranu, ale wybrałem jeden z „autentycznych” trybów mikrokanalizacji BBC, który jest dość ograniczający. Jeśli ktoś przeniesie to na Javę, jedynym praktycznym ograniczeniem będzie ludzka umiejętność czytania diagramu.
Level River St
Ach tak, zastanawiałem się tylko, czy okręgi dostosują się do wielkości wejściowej ... oczywiście moje rozwiązanie będzie również nieczytelne dla dużych danych wejściowych, jeśli terminal owinie linie, ale dopóki jest wyświetlany za pomocą pasków przewijania, może obsłużyć dowolne dane wejściowe rozmiar.
Martin Ender
2
nawet jeśli byłby przeniesiony do java, musiałbyś dodać kod, aby kółka były większe, aby uzyskać więcej tekstu
Sparr
14

Javascript 1235

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

Testowane w Google Chrome v36.

Dane wejściowe są pobierane przez zmienne górne, set1, set2 i set3.

Aktualizacja: teraz automatycznie skaluje się w zależności od wielkości danych wejściowych.

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

Przykładowe dane wyjściowe:

Venn

rdans
źródło
Nieźle! Byłem w stanie ścisnąć to trochę mocniej, patrz jsfiddle.net/44a4L/2 - spójrz na funkcję „t”, CSS i body.innerHTML. Jednak ta sama logika. Jestem pewien, że nadal można to ścisnąć.
Nenotlep,
Jest to jak dotąd najpiękniejszy, szkoda, że ​​nie skaluje się dobrze. Trzy elementy w najbardziej wewnętrznym obszarze powodują jego pęknięcie. Czy planujesz jakoś skalować?
William Barbosa,
@ Skalowanie WilliamBarbosa jest teraz zaimplementowane
rdans
2
Wspaniały! Oszałamiający! Spektakularny! (Musiał użyć więcej niż jednego superlatywu, ponieważ SE nienawidzi zwięzłości.)
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)

Dane wejściowe to N, po których następują trzy zestawy, oddzielone przecinkami (np 8, {1,2,4}, {2,3,4,5}, {4,6,8}.). Generuje zestaw w sztuce ACSII, taki jak:

+---+-+---+0 7
|1  | |3 5|
| +-+-+-+ |
| |2|4| | |
+-+-+-+-+-+
  |6 8  |
  +-----+
faubi
źródło
Haha, dwa prawie identyczne rozwiązania w ciągu 5 minut. (3 godziny po opublikowaniu wyzwania ...)
Martin Ender
1
Proszę odnieść się do uwagi nr 6. Krawędzie i granice muszą mieć inny znak, na przykład „+”.
William Barbosa,
4

HTML + JavaScript (E6) 752 761

Format wejściowy: maks. Zestaw1 zestaw2 zestaw3 (każdy zestaw to lista liczb oddzielona przecinkami)

Przykład: 10 1,2,3,4,5,9 1,2,3,6,8 7,2,9

Zrzut ekranu

Przykład 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

Zrzut ekranu Chrome

Wszystkie sekcje mają automatyczny rozmiar dzięki renderowaniu 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>

Wersja Javascript E5 Działa w Chrome i MSIE 10 (może 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>

Nie (tak) grał w golfa

<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
źródło
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()

Czy ktoś jeszcze bawił się Logo jako dziecko?

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

wprowadź opis zdjęcia tutaj

Jason S.
źródło
czy czcionka / kółka będą skalowane w celu wprowadzenia dowolnie dużego tekstu?
Sparr
Nie, wciąż o tym myślę.
Jason S
@JasonS Nadal myślisz?
Jonathan Frech
3

perl 388b 346b 488b

Daje to wynik podobny do innego wpisu:

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

Uruchomienie testowe i wyjście:

# 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
źródło
Hm, nie jestem pewien, czy układ jest naprawdę jednoznaczny, jeśli nie widziałeś danych wejściowych.
Martin Ender,
Masz rację, to nie wystarczy
William Barbosa
@WilliamBarbosa ok, sprawiłem, że wyglądało to jak wpis faubiguy
Sparr
2

T-SQL 2095

Zakłada, że ​​@N jest liczbą całkowitą zawierającą N. Zakłada, że ​​@A, @B i @C są tabelami zawierającymi trzy zestawy liczb. Nie próbowałem za dużo grać w golfa.

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

Wersja mniej golfowa:

--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
znaczniki
źródło