Golf a Venn Diagram generator


26

Golf a Venn Diagram generator

inserisci qui la descrizione dell'immagine

Per celebrare correttamente il 180 ° compleanno di John Venn , oggi il tuo compito sarà quello di creare un programma che produca un diagramma di Venn !

Ingresso:

Un numero intero positivo Nche definirà l'intervallo di numeri visualizzati nel diagramma (Da zero a N) e tre serie di numeri interi positivi.

Produzione:

Un diagramma di Venn a 3 insiemi che mostra tutti i numeri interi da 0 a Ne le relazioni degli insiemi visualizzandoli nelle regioni appropriate del diagramma, simili a questo .

Gli appunti

  1. Usa stdin(o qualunque sia l'equivalente della tua lingua) per ottenere i valori.
  2. È possibile definire il formato di input per i set e per N(Separato da virgola, barra o qualsiasi altra cosa funzioni meglio per te).
  3. I numeri che non compaiono in nessuno degli insiemi ma che rientrano nell'intervallo specificato devono apparire sul diagramma, non all'interno di nessuna regione.
  4. Non è necessario assegnare un nome ai set.
  5. L'output può essere un disegno o un'arte ascii.
  6. Il diagramma può avere qualsiasi forma purché i contorni siano inequivocabilmente distinguibili (se si sceglie l'arte ASCII, usare + (o simile) per attraversare i confini è essenziale, ad esempio).
  7. Le regioni potrebbero ma non devono essere ombreggiate.
  8. Le funzioni integrate o le librerie di terze parti che generano diagrammi di Venn non sono consentite.
  9. Si applicano scappatoie standard .

Questo è , quindi vince il codice più breve, in byte.


Sembra che avresti dovuto aggiungere una nota che le soluzioni devono scalare per dimensioni di input arbitrarie. Attualmente solo pochi lo fanno (per quanto ne so solo quelli ASCII). Non mi piace cambiare le regole dopo l'inizio del concorso, ma senza questo requisito qualcuno probabilmente potrebbe davvero abusarne con un layout semplice che funziona solo per un personaggio in ogni set (se lo facessi probabilmente taglierei la dimensione del codice a un terzo circa).
Martin Ender,

@ MartinBüttner Sì, alcuni scalano piuttosto male. Ma aggiungere una nota ora che ci sono 7 risposte sembra una cattiva idea. Dovresti aggiungere la nota e commentare il post di tutti per far loro sapere che il diagramma dovrebbe ridimensionarsi bene fino a X?
William Barbosa,

L'impostazione di un limite consentirà comunque di codificare semplicemente quel limite. Penso che il corretto ridimensionamento sia in realtà la parte più difficile della sfida. Quindi o lascialo così com'è, o modificalo per dire che deve occuparsi di dimensioni di set arbitrarie (che tecnicamente non è nemmeno un cambiamento, dal momento che non hai limitato le dimensioni di input penso che le dimensioni di input arbirtrary dovrebbero essere assunte comunque) .
Martin Ender,

@Ryan Nota che dichiaro "mostrandoli nelle regioni appropriate del diagramma" nella sezione di output. Alcune risposte (comprese le tue) non visualizzano correttamente la sezione più interna se detta sezione ha più di 5 elementi, quindi penso che non sia valida
William Barbosa,

Rilevante xkcd: xkcd.com/1810
sergiol

Risposte:


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

Supponendo che sia 10stato inserito per me sia {{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}stato inserito per d,

nuovo diagramma di Venn


Golfed 264

Sono stato sorpreso che tutto il calcolo potesse essere eseguito all'interno della Graphicsfunzione stessa. Con l'eccezione degli input, è un one-liner.

m=Input[];d=Input[]
Graphics@{Text@@@({#[[1]],{{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,FromDigits[Boole[Table[d[[k]]~MemberQ~#,{k,3}]],2]}&/@Range[0,m],Last])),Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}}}

+1 per l'aspetto dei cerchi. Sono sorpreso che siano così belli in grigio. La dispersione dei numeri è però strana. Stai usando RandomSampleper scegliere la posizione?
Level River St

Il grigio funziona perché l'opacità è del 10%. RandomSample è stato utilizzato per selezionare la posizione. Una volta che una posizione è stata scelta, viene rimossa dal gruppo di candidati per ulteriori scelte. Ho giocato con altri metodi (ad esempio impiegando il centroide di una sottoregione, ma i risultati non mi sono piaciuti). A proposito, mi piace il tuo approccio al montaggio delle etichette.
DavidC

Per salvare i personaggi, sono passato a Circles, quindi i dischi grigi sono spariti. La maggior parte dei risparmi deriva dal fatto che tutti i membri di una regione sono tracciati al centro di quella regione.
David C

45

Rubino, 654 590 566 542 505 byte

È stato divertente. Ho usato ASCII. Non sono stato ancora in grado di testare ogni possibile combinazione, quindi se trovi un caso di test glitch, per favore fatemelo sapere.

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

Si aspetta l'input su STDIN nel seguente formato

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

E poi ti ricompenserò con questa bellezza

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

Non credo di potermi preoccupare di aggiungere una versione non giocata. Dai un'occhiata alla versione originale nella cronologia delle modifiche per una versione leggermente più leggibile.

Questo potrebbe certamente essere ulteriormente migliorato rendendo i limiti del set meno rigidi o addirittura mantenendoli fissi come alcuni di quelli grafici, ma preferisco che appaia bello e sia fatto "correttamente" nonostante sia golfato.


Se non avessi raggiunto il limite di oggi, raggiungeresti oggi il club 10K con questa risposta, che peccato
William Barbosa,

@WilliamBarbosa Forse mi darà i necessari voti domani. ;)
Martin Ender il

È un bel diagramma di Venn. Immagino che l'aspetto del diagramma sia il motivo principale per tutti i tuoi voti. Cosa succede per set più grandi? Immagino che rimanga alla stessa altezza e diventi sempre più ampio?
Level River St

@steveverrill sì, esattamente. ciascuno degli 8 sottoinsiemi viene appena stampato come elenco delimitato da spazi nella giusta posizione. i confini hanno sempre la stessa forma e la larghezza di ogni sezione è determinata per essere il minimo possibile per adattarsi a tutto all'interno. ovviamente, potrebbe sembrare più bello se calcolassi l'interruzione di riga per mantenere ogni sottoinsieme approssimativamente quadrato, ma dopo tutto questo è code-golf dopo tutto;). inoltre sembra ancora migliore senza la spaziatura aggiuntiva tra le linee
Martin Ender

1
Ho visto i piccoli personaggi angolari e ho fatto una doppia ripresa, pensando che fosse APL o qualcosa del genere. :)
hoosierEE

15

BBC BASIC, 243 caratteri ASCII (dimensione file tokenizzata 211 byte)

Scarica l'emulatore da http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

golfed

  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 è molto arbitrario su quali newline / spazi bianchi è possibile eliminare. Oltre a rimuovere le nuove righe non necessarie, qui c'è un altro trucco che non è nella versione non golfata: assegno il viewport (vedi la spiegazione sotto nei commenti non golfati) alla fine del ciclo di stampa, non all'inizio. Ciò significa che gli elementi all'esterno del set vengono tracciati in alto a sinistra e il cursore viene intrappolato in una finestra in alto a destra alla fine del programma. Il motivo è eliminare VDU26.

Ungolfed

Ogni serie di numeri viene terminata dall'utente immettendo il numero N + 1 (una scelta leggermente insolita, questo per evitare errori causati dal tentativo di scrivere al di fuori dell'intervallo di un array.) Quindi passa da una modalità di testo a una modalità grafica e traccia il diagramma di Venn.

I dati di input sono memorizzati in un array, una cella per ogni valore da visualizzare. I dati vengono archiviati come valore a 3 bit: 1 per Set0 + 2 per Set1 + 4 per Set2 che fornisce un numero compreso tra 0 e 7. BBC basic non ha un operatore a turni, quindi viene utilizzato l'operatore di potenza 2^iinvece di 1<<iin C per esempio.

Dopo aver tracciato i cerchi, un loop esterno attraversa ciascuna delle otto regioni, spostandosi sulle coordinate richieste (come da una tabella di dati.) Un loop interno stampa tutti i numeri in quella regione (quelli con il corrispondente valore a 3 bit nel 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

Montaggio di input e output tipici (versione non modificata)

Nella versione golfata, la posizione dei numeri al di fuori dei set viene scambiata con il prompt dei comandi >.

inserisci qui la descrizione dell'immagine


Funziona con input arbitrariamente grandi?
Martin Ender,

@ MartinBüttner in linea di principio sì, l'algoritmo può farlo, ma il display lo delude (come è probabile che sia il problema con altre soluzioni.) Nel commento del programma suggerisco che ogni regione è limitata a 7 numeri prima che inizi a scorrere ( i numeri sono in una colonna verticale poiché pensavo che il wrapping potesse sembrare orribile.) L'emulatore che sto usando può gestire risoluzioni dello schermo molto più elevate, ma ho optato per una delle "autentiche" modalità micro-schermo della BBC che è abbastanza limitante. Se qualcuno lo porta su Java, l'unico limite pratico sarà la capacità umana di leggere il diagramma.
Level River St

Ah sì, mi stavo solo chiedendo se i cerchi si sarebbero adattati alle dimensioni dell'input ... ovviamente la mia soluzione sarà anche illeggibile per input di grandi dimensioni se il tuo terminale avvolge le linee, ma fintanto che viene visualizzato con barre di scorrimento può gestire qualsiasi input dimensione.
Martin Ender,

2
anche se questo fosse stato portato su Java dovresti aggiungere del codice per rendere le cerchie più grandi per più testo
Sparr

14

Javascript 1235

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

Testato su google chrome v36.

L'input viene preso nelle variabili upper, set1, set2 e set3.

Aggiornamento: ora si ridimensiona automaticamente in base alla dimensione dell'input.

function t(e,t){z.getElementById(e).innerHTML+=" "+t}z=document;s=200+upper*20;z.body.innerHTML+="<style>#m{width:"+s+"px;height:"+s+"px;}div{position:absolute;text-align:center;border-radius:50%;}#s1{left:calc(15% + 15px);top:30px;bottom:30%;right:calc(15% + 15px);background-color:rgba(255,0,0,0.4);padding:10%;}#s2{left:30px;bottom:30px;top:30%;right:30%;background-color:rgba(0,255,0,0.4);padding-right:40%;padding-top:30%;}#s3{right:30px;bottom:30px;top:30%;left:30%;background-color:rgba(0,0,255,0.4);padding-left:40%;padding-top:30%;}#s123{left:40%;top:40%;right:40%;bottom:40%;}#s12{left:20%;top:35%;right:65%;bottom:50%;}#s13{right:20%;top:35%;left:65%;bottom:50%;}#s23{left:40%;right:40%;bottom:15%;top:70%;}</style><div id=m><div id=s1 class=s></div><div id=s2 class=s></div><div id=s3 class=s></div><div id=s123 class=v></div><div id=s12 class=v></div><div id=s13 class=v></div><div id=s23 class=v></div></div>";for(i=0;i<=upper;i++){i1=i2=i3=false;if(set1.indexOf(i)!=-1)i1=true;if(set2.indexOf(i)!=-1)i2=true;if(set3.indexOf(i)!=-1)i3=true;if(i1&&i2&&i3)t("s123",i);else if(i1&&i2)t("s12",i);else if(i1&&i3)t("s13",i);else if(i2&&i3)t("s23",i);else if(i1)t("s1",i);else if(i2)t("s2",i);else if(i3)t("s3",i);else t("m",i)}

Uscita campione:

Venn


Molto carino! Sono stato in grado di comprimerlo un po 'più forte, vedi jsfiddle.net/44a4L/2 - guarda la funzione "t", CSS e body.innerHTML. Stessa logica però. Sono sicuro che potrebbe ancora essere schiacciato.
Nenotlep,

Questa è la più bella finora, è un peccato che non si ridimensioni bene. Tre elementi all'interno dell'area più interna lo fanno rompere. Pensi di ridimensionarlo in qualche modo?
William Barbosa,

Il ridimensionamento di @WiamiamBarbosa è ora implementato
rdans il

2
Bellissima! Sbalorditivo! Spettacolare! (Ho dovuto usare più di un superlativo perché SE odia la brevità.)
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)

L'ingresso è N seguito dai tre set, separati da virgole (ad es 8, {1,2,4}, {2,3,4,5}, {4,6,8}.). Emette un set nell'arte ACSII come il seguente:

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

Haha, due soluzioni quasi identiche in 5 minuti. (3 ore dopo che la sfida è stata pubblicata ...)
Martin Ender il

1
Fare riferimento alla nota numero 6. I bordi e i bordi di attraversamento devono essere di carattere diverso, ad esempio "+".
William Barbosa,

4

HTML + JavaScript (E6) 752 761

Formato di input: set max1 set2 set3 (ogni set è un elenco di numeri separato da virgole)

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

Immagine dello schermo

Esempio 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

Schermata di Chrome

Tutte le sezioni si dimensionano automaticamente grazie al rendering html.

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,x=>'09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x])
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,x=>r[x]))
</script></body></html>

Versione Javascript E5 Funziona in Chrome e MSIE 10 (forse 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>

Non (così) giocato a 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

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

Qualcun altro ha giocato con Logo da bambino?

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

inserisci qui la descrizione dell'immagine


il carattere / i cerchi verranno ridimensionati per input arbitrariamente grandi?
Sparr,

No, sto ancora pensando a quello.
Jason S,

@JasonS Stai ancora pensando?
Jonathan Frech,

3

perl 388b 346b 488b

Questo ha prodotto un output simile a un'altra voce:

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

Esecuzione test e output:

# 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, non sono sicuro che il layout sia davvero inequivocabile se non hai visto l'input.
Martin Ender,

Hai ragione, non è abbastanza venn-y
William Barbosa,

@WilliamBarbosa ok, l'ho fatto sembrare la voce di Faubiguy
Sparr

2

T-SQL 2095

Presuppone @N è un int contenente N. Presupposti @A, @B e @C sono tabelle contenenti i tre set di numeri. Non ho provato a giocare a golf troppo.

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

Versione meno giocata a golf:

--finding the sets
DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'
DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)
INSERT INTO @(Z)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P 
INSERT INTO @(Y)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL 
INSERT INTO @(X)
SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL 
INSERT INTO @(W)
SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL 
INSERT INTO @(V)
SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL 
INSERT INTO @(U)
SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL 
INSERT INTO @(T)
SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL 
WHILE @N>=0
BEGIN 
    INSERT INTO @(S)
    SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)
    SET @N-=1 
END

--displaying the venn diagram
DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))
INSERT INTO @Z 
SELECT @F,@H,@F,@H,@G,@H,@G,''
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @F,@H,@J,@H,@G,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@J,@H,@F,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@G,@H,@F,@H,@F,''
SELECT*FROM @Z
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.