Cellules du diagramme de Venn

12

Étant donné plusieurs ensembles, par exemple s1={2,3,7}, s2={1,2,4,7,8}et s3={4,7}, un diagramme de Venn visualise chaque ensemble par une courbe fermée et des éléments d'ensemble qui sont à l'intérieur ou à l'extérieur du périmètre de la courbe, selon qu'ils font partie de l'ensemble ou non. Étant donné que tous les éléments d'ensemble n'apparaissent qu'une seule fois dans le digramme de Venn, les courbes représentant chaque ensemble doivent se chevaucher si un élément est présent dans plusieurs ensembles. Nous appelons chacun de ces chevauchements une cellule du diagramme de Venn.

Cette explication peut être un peu déroutante, alors regardons un exemple.

Exemple

Un diagramme de Venn pour les ensembles s1, s2et s3pourrait ressembler à ceci:

Les cellules de ce diagramme de Venn sont (lire de haut en bas, de gauche à droite) {1,8}, {2}, {7}, {4}, {3}, {}et {}.

En pratique, on ne rencontre généralement que des diagrammes de Venn de deux ou trois ensembles, car la représentation des diagrammes de Venn de quatre ensembles ou plus n'est pas très claire. Cependant, ils existent, par exemple pour six ensembles:

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

La tâche

Étant donné un ensemble non vide d'ensembles d'entiers positifs dans toute représentation raisonnable, renvoyer l'ensemble de cellules du diagramme Venn des ensembles d'entrée. Plus précisément, aucune représentation graphique n'est nécessaire.

  • Vous pouvez écrire un programme complet ou une fonction.
  • Vous pouvez renvoyer autant d'ensembles vides qu'il y a de cellules vides (c'est-à-dire une liste de toutes les cellules) au lieu d'un seul ensemble vide (c'est-à-dire l' ensemble de cellules).
  • Voici quelques façons d'entrée raisonnables pour l'exemple ci - dessus comprennent , sans s'y limiter {{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"ou "2 3 7\n1 2 4 7 8\n4 7". En cas de doute si le format d'entrée choisi est acceptable, n'hésitez pas à demander dans un commentaire.
  • Si possible, votre format de sortie doit correspondre à votre format d'entrée. Notez que cette règle requiert que votre format puisse afficher sans ambiguïté les ensembles vides.
  • Il s'agit de , essayez donc d'utiliser le moins d'octets possible dans la langue de votre choix. Afin d'encourager la concurrence par langue plutôt qu'entre les langues, je n'accepterai pas de réponse.

Cas de test

Voici quelques entrées ainsi que des sorties possibles:

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}}
Laikoni
la source
Je suppose que cela est vrai en raison de la définition d'un ensemble, mais pouvons-nous supposer qu'il n'y aura pas de doublons dans l'un des sous-ensembles?
HyperNeutrino
@Hyper Neutrino Oui, vous pouvez supposer que tous les jeux sont exempts de doublons.
Laikoni
Vous pourriez peut-être ajouter un cas de test dans lequel aucune des cellules n'est vide. Par exemple {{1,2,3,4}, {1,2,5,6}, {1,3,5,7}}.
Ørjan Johansen
Comment le second ne donne- {{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}t- il pas ?
Leaky Nun
1
@carusocomputing En y regardant de plus près, vous constaterez que ce n'est pas un vrai diagramme de Venn car certains chevauchements possibles manquent.
Laikoni

Réponses:

8

Haskell , 71 octets

Une fonction anonyme prenant une liste de listes d'entiers et renvoyant une liste similaire.

Utiliser comme (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))[]

Essayez-le en ligne!

Comment ça fonctionne

  • Utilise les opérations de type ensemble \\(différence) et intersectfrom Data.List.
  • Plie la liste des "ensembles" (représentés sous forme de listes) dans une liste de cellules, en commençant par la liste vide [].
  • xest l'ensemble actuel à ajouter au diagramme et rest la liste des cellules déjà construites.
    • x\\(id=<<r)est le sous-ensemble d'éléments xqui ne se trouvent dans aucune des cellules déjà construites.
    • [intersect x,(\\x)]<*>rdivise chaque cellule en rfonction de si ses éléments sont dedans xou non.
  • Il ne tente certainement pas de fusionner des cellules vides, il y en a donc pas mal dans la sortie.
Ørjan Johansen
la source
La même idée que mon implémentation, mais deux octets de moins. Bien joué!
Laikoni
4

Gelée , 14 17 octets

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

Essayez-le en ligne!

Soumission de la fonction (parce que le format dans lequel Jelly imprime les listes par défaut ne fait pas l'aller-retour - il ne peut pas lire son propre format de sortie - mais une fonction entre et sort dans le même format). Le lien TIO contient un pied de page qui exécute la fonction et imprime sa sortie dans le même format que l'entrée est analysée.

Explication

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

L'obligation de produire au moins un ensemble vide si toutes les sections du diagramme de Venn ne sont pas utilisées parvient à occuper plus de la moitié du programme ici (il est responsable de cela qui garantit que nous avons au moins un groupe pour les éléments non correspondants, ce qui nous permet pour garder une trace du nombre d'ensembles à l'origine, plus les neuf derniers octets du code source à l'exception de Ġ). La manière fondamentale de l'implémenter est de s'assurer que tous les 2 ^ n sous-ensembles de diagrammes de Venn ont au moins une entrée, en ajoutant une entrée factice qui remplira la section "en aucun ensemble" et (plus tard) une entrée factice pour chaque autre section, puis Ġsortira un groupe pour chaque sous-ensemble, que nous pouvons supprimer à l'aide ṖṖ€.


la source
Il n'y a aucune restriction à au plus 7 ensembles, et l'un des cas de test en a plus.
Ørjan Johansen
J'ai supposé que l'ensemble d'origine avait une longueur de 3, car c'est ainsi que fonctionnent les diagrammes de Venn, mais apparemment non? Dans ce cas, j'ai peut-être besoin d'une méthode différente pour ajouter l'ensemble vide uniquement si toutes les sections du diagramme de Venn ne sont pas remplies. C'est quelque chose d'un vilain défaut sur ce qui est autrement une question assez élégante.
Eh bien, vous pouvez remplacer 7 par 2 ^ n-1, je suppose.
Ørjan Johansen
J'ai trouvé un moyen d'obtenir la valeur 2 ^ n-1 qui correspond à la spécification, mais c'est douloureusement long. Espérons qu'il existe un moyen plus court, mais même ainsi, cette question est frustrante.
4

Perl 5, 79 octets

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

Prend l'entrée comme une liste de tableaux anonymes comme ([2,3,7], [1,2,4,7,8], [4,7]). Génère un hachage où les clés sont des étiquettes et les valeurs sont des tableaux anonymes correspondant aux ensembles de sorties.

Dans le cadre d'un programme complet:

*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;

Explication:

Donne à chaque ensemble un nombre entier en tant que marqueur, $.. Crée un hachage qui stocke un entier pour chaque élément unique $_. Ajoute 2**$.pour chaque ensemble qui $_apparaît dans, créant effectivement une carte binaire montrant dans quels ensembles chaque élément apparaît. Enfin, crée un tableau anonyme pour chaque cellule du diagramme de Venn et pousse les éléments apparaissant dans les ensembles correspondants vers le tableau. Ainsi, chaque élément de chaque tableau existe dans les mêmes ensembles et donc la même cellule du diagramme de Venn.

Chris
la source
3

Pyth , 11 octets

m-@Fds-Qdty

Suite de tests.

Comment ça fonctionne

Chaque région du diagramme de Venn représente des éléments qui se trouvent dans [certaines combinaisons des ensembles] mais pas dans [les autres ensembles].

Ainsi, nous générons toutes les combinaisons possibles (et supprimons les combinaisons vides) en trouvant le jeu de puissance de l'entrée.

Pour chaque combinaison générée, nous trouvons l'intersection des ensembles dans la combinaison et filtrons les éléments qui se trouvent dans les autres ensembles.

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)
Leaky Nun
la source
2

JavaScript (ES6), 123 octets

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)
Neil
la source