Venn Diagram Cells


12

Dati più insiemi, ad es. s1={2,3,7}, s2={1,2,4,7,8}E s3={4,7}, un diagramma di Venn visualizza ogni set da una curva chiusa e imposta elementi che si trovano all'interno o all'esterno del perimetro della curva, a seconda che siano o meno elementi dell'insieme. Poiché tutti gli elementi dell'insieme vengono visualizzati una sola volta nel digram di Venn, le curve che rappresentano ciascun insieme devono sovrapporsi se un elemento è presente in più di un insieme. Chiamiamo ciascuna di queste sovrapposizioni una cella del diagramma di Venn.

Questa spiegazione potrebbe essere un po 'confusa, quindi diamo un'occhiata a un esempio.

Esempio

Un diagramma di Venn per i set s1, s2e s3potrebbe essere la seguente:

Le cellule di questo diagramma Venn sono (lette dall'alto verso il basso, da sinistra a destra) {1,8}, {2}, {7}, {4}, {3}, {}e {}.

In pratica, si incontrano comunemente solo diagrammi di Venn di due o tre serie, poiché la rappresentazione dei diagrammi di Venn di quattro o più serie non è molto chiara. Tuttavia esistono, ad esempio per sei set:

CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309

L'obiettivo

Dato un insieme non vuoto di insiemi di numeri interi positivi in ​​qualsiasi rappresentazione ragionevole, restituisce l'insieme di celle del diagramma di Venn degli insiemi di input. In particolare, non è necessaria alcuna rappresentazione grafica.

  • È possibile scrivere un programma completo o una funzione.
  • È possibile restituire tutti i set vuoti quante sono le celle vuote (ovvero un elenco di tutte le celle) anziché un solo set vuoto (ovvero il set di celle).
  • Alcuni modi ragionevoli di ingresso per l'esempio precedente includono ma non sono limitati a {{2,3,7},{1,2,4,7,8},{4,7}}, [[2,3,7],[1,2,4,7,8],[4,7]], "2,3,7;1,2,4,7,8;4,7"o "2 3 7\n1 2 4 7 8\n4 7". In caso di dubbi sull'accettabilità del formato di input scelto, non esitare a chiedere in un commento.
  • Il formato di output deve corrispondere al formato di input, se possibile. Nota che questa regola richiede che il tuo formato sia in grado di visualizzare in modo univoco insiemi vuoti.
  • Questo è , quindi prova a usare il minor numero di byte possibile nella lingua che preferisci. Al fine di incoraggiare la concorrenza per lingua anziché tra lingue, non accetterò una risposta.

Casi test

Ecco alcuni input insieme a possibili output:

input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}

Suppongo che ciò sia vero a causa della definizione di un set, ma possiamo supporre che non ci saranno duplicati all'interno di uno dei sottoinsiemi?
HyperNeutrino,

@Hyper Neutrino Sì, puoi presumere che tutti i set siano duplicati gratuitamente.
Laikoni,

Forse potresti aggiungere un caso di test in cui nessuna delle celle è vuota. Ad esempio {{1,2,3,4}, {1,2,5,6}, {1,3,5,7}}.
Ørjan Johansen

In che modo il secondo non dà {{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}?
Leaky Nun,

1
@carusocomputing A un esame più attento scoprirai che questo non è un vero diagramma di Venn perché mancano alcune possibili sovrapposizioni.
Laikoni,

Risposte:


8

Haskell , 71 byte

Una funzione anonima che prende un elenco di elenchi di numeri interi e restituisce un elenco simile.

Usa come (foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]].

import Data.List
foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[]

Provalo online!

Come funziona

  • Utilizza le operazioni simil-set \\(differenza) e intersectda Data.List.
  • Piega l'elenco dei "set" (rappresentati come elenchi) in un elenco di celle, a partire dall'elenco vuoto [].
  • xè l'insieme corrente da aggiungere al diagramma ed rè l'elenco di celle già costruite.
    • x\\(id=<<r)è il sottoinsieme di elementi xche non si trovano in nessuna delle celle già costruite.
    • [intersect x,(\\x)]<*>rsuddivide ogni cella in rbase al fatto che i suoi elementi siano dentro xo meno.
  • Sicuramente non tenta di unire celle vuote, quindi ce ne sono parecchie nell'output.

La stessa idea della mia implementazione, ma due byte più brevi. Molto bene!
Laikoni

4

Gelatina , 14 17 byte

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€

Provalo online!

Invio di funzioni (poiché il formato Jelly stampa gli elenchi per impostazione predefinita non va di andata e ritorno - non può leggere il proprio formato di output - ma una funzione di input e output nello stesso formato). Il collegamento TIO contiene un piè di pagina che esegue la funzione e stampa il suo output nello stesso formato in cui viene analizzato l'input.

Spiegazione

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€
FṀ‘               Find the largest number that appears in any of the input sets, + 1
   ³ þ            For each number from 1 to that number, and each of the input sets
    i ¬             find whether the number is missing from the set
       Ḅ          Convert the list of missing sets into a single number using binary
         ;        Append
        µ ṀḶ$     all numbers from 0 to the maximum value minus 1
             Ġ    Group indexes by values
              ṖṖ€ Delete the last group and last element of other groups

Il requisito che produciamo almeno un set vuoto se non vengono utilizzate tutte le sezioni del diagramma di Venn riesce a occupare qui più della metà del programma (è responsabile del fatto che ci sia almeno un gruppo per elementi non corrispondenti, permettendoci per tenere traccia di quanti set erano originariamente, oltre agli ultimi nove byte del codice sorgente ad eccezione di Ġ). Il modo base in cui lo implementiamo è quello di garantire che tutti i sottoinsiemi del diagramma 2 ^ n Venn abbiano almeno una voce, aggiungendo una voce fittizia che riempirà la sezione "in nessun set" e (in seguito) una voce fittizia per ciascuno altra sezione, quindi Ġgenererà un gruppo per ogni sottoinsieme, che possiamo rimuovere usando ṖṖ€.


Ehm, non ci sono restrizioni per un massimo di 7 set e uno dei casi di test ne ha di più.
Ørjan Johansen

Supponevo che il set originale avesse lunghezza 3, perché è così che funzionano i diagrammi di Venn, ma apparentemente no? In tal caso, forse ho bisogno di un modo diverso di aggiungere l'insieme vuoto solo se non tutte le sezioni del diagramma di Venn sono riempite. È una specie di brutta imperfezione su quella che altrimenti sarebbe una domanda abbastanza elegante.

Bene, potresti sostituire 7 con 2 ^ n-1, suppongo.
Ørjan Johansen

Ho trovato un modo per ottenere il valore 2 ^ n-1 che corrisponde alla specifica, ma è dolorosamente lungo. Speriamo che ci sia un modo più breve, ma anche così, questa domanda è frustrante.

4

Perl 5, 79 byte

sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h}

Prende input come un elenco di array anonimi come ([2,3,7], [1,2,4,7,8], [4,7]). Emette un hash in cui le chiavi sono etichette e i valori sono array anonimi corrispondenti ai set di output.

Come parte di un programma completo:

*x=
sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h};
%x=x([2,3,7],[1,2,4,7,8],[4,7]);
print"Set $_:@{$x{$_}}\n"for keys%x;

Spiegazione:

Dà ogni insieme un intero come un'etichetta, $.. Crea un hash che memorizza un numero intero per ogni elemento univoco $_. Aggiunge 2**$.per ogni set in cui $_appare, creando in modo efficace una mappa binaria che mostra in quali set appare ogni elemento. Infine, crea un array anonimo per ogni cella del diagramma di Venn e invia alla matrice gli elementi che compaiono nei set corrispondenti. Quindi ogni elemento di ciascun array esiste negli stessi set e quindi nella stessa cella del diagramma di Venn.


3

Pyth , 11 byte

m-@Fds-Qdty

Suite di test.

Come funziona

Ogni regione del diagramma di Venn rappresenta elementi che si trovano in [determinate combinazioni degli insiemi] ma non in [gli altri insiemi].

Quindi, generiamo tutte le possibili combinazioni (e rimuoviamo le combinazioni vuote) trovando il gruppo di potenza dell'input.

Per ogni combinazione generata, troviamo l'intersezione degli insiemi nella combinazione e filtriamo gli elementi che si trovano negli altri insiemi.

m-@Fds-Qdty  input as Q
          y  power set
         t   remove the first one (empty combination)
m            for each combination d:
  @Fd            find the intersection of all the sets in d
 -               filter out those who are in
     s               the union of
      -Qd            the sets not in the combination
                     (input minus combination)

2

JavaScript (ES6), 123 byte

a=>a.map((b,i)=>b.map(e=>m[e]|=1<<i),m=[])&&[...Array(1<<a.length)].map((_,i)=>m.map((e,j)=>e==i&&j).filter(j=>j)).slice(1)
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.