Angesichts mehrere Sätze, beispielsweise s1={2,3,7}
, s2={1,2,4,7,8}
und s3={4,7}
ein Venn - Diagramm visualisiert jedem Satz durch eine geschlossene Kurve und Satz Elemente , die entweder innerhalb oder außerhalb des Umfangs der Kurve, je nachdem , ob es sich um Element des Satzes ist oder nicht. Da alle Set-Elemente im Venn-Digramm nur einmal vorkommen, müssen sich die Kurven für jedes Set überlappen, wenn ein Element in mehr als einem Set vorhanden ist. Wir nennen jede solche Überlappung eine Zelle des Venn-Diagramms.
Diese Erklärung kann etwas verwirrend sein. Schauen wir uns ein Beispiel an.
Beispiel
Ein Venn - Diagramm für Sätze s1
, s2
und s3
könnte wie folgt aussehen:
Die Zellen dieses Venn - Diagramm sind (von oben nach unten gelesen, links nach rechts) {1,8}
, {2}
, {7}
, {4}
, {3}
, {}
und {}
.
In der Praxis trifft man üblicherweise nur auf Venn-Diagramme mit zwei oder drei Sätzen, da die Darstellung von Venn-Diagrammen mit vier oder mehr Sätzen nicht sehr klar ist. Sie existieren jedoch, zB für sechs Sets:
CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309
Die Aufgabe
Geben Sie bei einer nicht leeren Menge positiver Ganzzahlen in einer angemessenen Darstellung die Menge der Zellen des Venn-Diagramms der Eingabesätze zurück. Insbesondere ist keine grafische Darstellung erforderlich.
- Sie können ein vollständiges Programm oder eine Funktion schreiben.
- Sie können so viele leere Mengen zurückgeben, wie leere Zellen vorhanden sind (dh eine Liste aller Zellen), anstatt nur eine leere Menge (dh die Menge der Zellen).
- Einige vernünftigen Möglichkeiten der Eingabe für das obige Beispiel beinhalten , sind aber nicht beschränkt auf
{{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"
oder"2 3 7\n1 2 4 7 8\n4 7"
. Wenn Sie Zweifel haben, ob das von Ihnen gewählte Eingabeformat akzeptabel ist, können Sie einen Kommentar abgeben. - Ihr Ausgabeformat sollte nach Möglichkeit mit Ihrem Eingabeformat übereinstimmen. Beachten Sie, dass diese Regel erfordert, dass Ihr Format leere Sätze eindeutig anzeigen kann.
- Das ist Code-Golf , also versuchen Sie, so wenig Bytes wie möglich in der Sprache Ihrer Wahl zu verwenden. Um den Wettbewerb pro Sprache anstatt zwischen den Sprachen zu fördern, akzeptiere ich keine Antwort.
Testfälle
Hier sind einige Eingaben zusammen mit möglichen Ausgaben:
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}}
quelle
{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}
?Antworten:
Haskell , 71 Bytes
Eine anonyme Funktion, die eine Liste mit ganzen Zahlen erstellt und eine ähnliche Liste zurückgibt.
Verwenden Sie als
(foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]]
.Probieren Sie es online!
Wie es funktioniert
\\
(Differenz) undintersect
vonData.List
.[]
.x
ist die aktuelle Menge, die dem Diagramm hinzugefügt werden soll, undr
ist die Liste der bereits erstellten Zellen.x\\(id=<<r)
ist die Teilmenge von Elementenx
, die sich in keiner der bereits konstruierten Zellen befinden.[intersect x,(\\x)]<*>r
Teilt jede Zeller
danach auf, ob ihre Elemente enthalten sindx
oder nicht.quelle
Jelly ,
1417 BytesProbieren Sie es online!
Funktionsübermittlung (da das Format, in dem Jelly Listen druckt, standardmäßig kein Roundtrip ist - es kann kein eigenes Ausgabeformat lesen -, sondern eine Funktion, die im gleichen Format ein- und ausgegeben wird). Der TIO-Link enthält eine Fußzeile, in der die Funktion ausgeführt und die Ausgabe im gleichen Format wie die Eingabe gedruckt wird.
Erläuterung
Die Anforderung, dass wir mindestens eine leere Menge ausgeben, wenn nicht alle Venn-Diagrammabschnitte verwendet werden, nimmt hier mehr als die Hälfte des Programms ein (es ist dafür verantwortlich
’
, dass wir mindestens eine Gruppe für nicht übereinstimmende Elemente haben, was uns erlaubt um zu verfolgen, wie viele Sätze es ursprünglich gab, plus die letzten neun Bytes des Quellcodes mit Ausnahme vonĠ
). Die grundlegende Art und Weise, wie wir es implementieren, besteht darin, sicherzustellen, dass alle 2 ^ n Venn-Diagramm-Teilmengen mindestens einen Eintrag haben, indem ein Dummy-Eintrag hinzugefügt wird, der den Abschnitt "In keinen Sätzen" und (später) jeweils einen Dummy-Eintrag ausfüllt In einem anderen Abschnitt wird dannĠ
für jede Teilmenge eine Gruppe ausgegeben, die wir mit entfernen könnenṖṖ€
.quelle
Perl 5, 79 Bytes
Übernimmt Eingaben als Liste anonymer Arrays wie ([2,3,7], [1,2,4,7,8], [4,7]). Gibt einen Hash aus, bei dem die Schlüssel Bezeichnungen und die Werte anonyme Arrays sind, die den Ausgabesätzen entsprechen.
Im Rahmen eines vollständigen Programms:
Erläuterung:
Gibt jedem Set eine Ganzzahl als Beschriftung
$.
. Erstellt einen Hash, der für jedes eindeutige Element eine Ganzzahl speichert$_
. Fügt2**$.
für jeden Satz, der in$_
angezeigt wird, eine binäre Zuordnung hinzu, die anzeigt, in welchen Sätzen jedes Element angezeigt wird. Zum Schluss wird für jede Zelle des Venn-Diagramms ein anonymes Array erstellt und die in den entsprechenden Sätzen angezeigten Elemente in das Array verschoben. Jedes Element jedes Arrays existiert also in denselben Mengen und damit in derselben Zelle des Venn-Diagramms.quelle
Pyth , 11 Bytes
Testsuite.
Wie es funktioniert
Jeder Bereich des Venn-Diagramms repräsentiert Elemente, die sich in [bestimmten Kombinationen der Mengen] befinden, jedoch nicht in [den anderen Mengen].
Wir generieren also alle möglichen Kombinationen (und entfernen die leeren Kombinationen), indem wir die Potenzmenge des Eingangs ermitteln.
Für jede generierte Kombination ermitteln wir den Schnittpunkt der Mengen in der Kombination und filtern die Elemente heraus, die in den anderen Mengen enthalten sind.
quelle
JavaScript (ES6), 123 Byte
quelle