É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
, s2
et s3
pourrait 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 code-golf , 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}}
la source
{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}
t- il pas ?Réponses:
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]]
.Essayez-le en ligne!
Comment ça fonctionne
\\
(différence) etintersect
fromData.List
.[]
.x
est l'ensemble actuel à ajouter au diagramme etr
est la liste des cellules déjà construites.x\\(id=<<r)
est le sous-ensemble d'élémentsx
qui ne se trouvent dans aucune des cellules déjà construites.[intersect x,(\\x)]<*>r
divise chaque cellule enr
fonction de si ses éléments sont dedansx
ou non.la source
Gelée ,
1417 octetsEssayez-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
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
Perl 5, 79 octets
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:
Explication:
Donne à chaque ensemble un nombre entier en tant que marqueur,
$.
. Crée un hachage qui stocke un entier pour chaque élément unique$_
. Ajoute2**$.
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.la source
Pyth , 11 octets
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.
la source
JavaScript (ES6), 123 octets
la source