ASCII-Art Venn Diagramm

8

Gegeben seien zwei Listen , die keine doppelten Elemente enthalten aund bfinden Sie den Crossover zwischen den beiden Listen und Ausgabe eines ASCII-Art Venn - Diagramm. Das Venn-Diagramm verwendet der Einfachheit halber eine quadratische Version der traditionellen Kreise.

Beispiel

Gegeben:

a = [1, 11, 'Fox', 'Bear', 333, 'Bee']
b = ['1', 333, 'Bee', 'SchwiftyFive', 4]

Ausgabe (Reihenfolge ist 100% beliebig, solange das Venn-Diagramm korrekt ist):

+-----+----+-------------+
|11   |333 |SchwiftyFive |
|Fox  |Bee |4            |
|Bear |1   |             |
+-----+----+-------------+

Das Programm kann entweder '1' == 1oder '1' != 1bis zu Ihrer Implementierung berücksichtigen . Sie können auch festlegen, dass alles nur als Zeichenfolgen behandelt wird und nur Zeichenfolgeneingaben akzeptiert werden.


Gegeben:

a=[]
b=[1,2,3]

Ausgabe (Beachten Sie, dass die beiden leeren Teile immer noch den Platz auf dem rechten Pad haben):

+-+-+--+
| | |1 |
| | |2 |
| | |3 |
+-+-+--+

Gegeben:

a=[1]
b=[1]

Ausgabe:

+-+--+-+
| |1 | |
+-+--+-+

Regeln

  • Elemente des Venn-Diagramms sind linksbündig ausgerichtet und auf den Eintrag mit der maximalen Länge plus 1 aufgefüllt.
  • Die Reihenfolge der Elemente innerhalb der Unterabschnitte des Venn-Diagramms ist beliebig.
  • Ecken des Venn-Diagramms (wo sich |trifft -) müssen durch a dargestellt werden +.
  • Sie haben die Garantie, dass a.join(b).length() > 0Sie alles tun können, wenn beide leer sind.
    • Sie können sogar ein Bild von Abe Lincoln drucken, egal.
  • Dies ist , und .

Bonus

Holzkohle rendert Boxen wie diese natürlich, aber der ganze Teil der Mengenlehre ... Ich weiß nicht, wie gut das funktioniert. +100 Kopfgeld für die kürzeste Einreichung von Holzkohle, bevor ich der Frage ein Kopfgeld hinzufügen kann (2 Tage nach der Beantwortung).

Magische Krakenurne
quelle
3
Persönlich '1' == 1
denke
@KritixiLithos hat die Herausforderungsspezifikation so aktualisiert, dass sie denjenigen, die begonnen haben, nicht schadet. Sie haben nun die Wahl, wie der Vergleich von Zeichenfolgen zu Ganzzahlen funktionieren soll. Beide Optionen sind gleichermaßen gültige Übermittlungen.
Magic Octopus Urn
1
Können wir davon ausgehen, dass die Eingabe nur Zeichenfolgen enthält?
Rod
Verbunden.
Martin Ender
1
@ L3viathan ein Handy bearbeiten und dein Beitrag ist vorbei.
Magic Octopus Urn

Antworten:

2

Python 2 , 221 210 212 Bytes

m=map
A,B=m(set,input())
d=A-B,B&A,B-A
e=[max(m(len,s))+1for s in d]
p,i,n='+|\n'
o=b=p+p.join(m('-'.__mul__,e))+p+n
while sum(m(len,d)):o+=i+i.join(m(str.ljust,[len(s)and s.pop()or''for s in d],e))+i+n
print o+b

Probieren Sie es online aus!

Stange
quelle
Etwas falsch, Sie vermissen das rechte Feld mit einem Leerzeichen.
Magic Octopus Urn
@ carusocomputing behoben
Rod
2

PHP> = 7,1, 287 Bytes

<?for([$a,$b]=$_GET,$x=max(($m=array_map)(count,$r=[($d=array_diff)($a,$b),array_intersect($a,$b),$d($b,$a)]));$n<3;$n++)for(sort($r[+$n]),$i=-1;$i<=$x;$i++){$o[$i].="|+"[$b=$i<0||$i==$x].str_pad($b?"":$r[+$n][$i],max($m(strlen,$r[+$n]))+1," -"[$b]).("|+"[$b][$n<2]);}echo join("
",$o);

Online Version

Erweitert

for([$a,$b]=$_GET, # store input arrays in shorter variables
$x=max(($m=array_map)(count,   # get maximum of 
$r=[($d=array_diff)($a,$b),array_intersect($a,$b),$d($b,$a)])); #the set array
$n<3;$n++)
  for(sort($r[+$n]),$i=-1;$i<=$x;$i++){ # sort array to remove keys
    $o[$i].="|+"[$b=$i<0||$i==$x].   # concat line $b boolean for first and last line beginning char 
    str_pad($b?"":$r[+$n][$i]   # string of item in array if not first or last line
    ,max($m(strlen,$r[+$n]))+1  # fill till maximum length of items in array
    ," -"[$b]) # with char depends on first/last line or item line
    .("|+"[$b][$n<2]); # make end of string if last array is reach
}
echo join("   
",$o); #Output
Jörg Hülsermann
quelle
2

Holzkohle , 106 89 87 Bytes:

A⟦⟧ςA⟦⟧λA⟦⟧ρA⟦⟧τWS⊞ςιWS⊞⎇№ςιτριFς⊞⎇№τι⟦⟧λιF⟦λτρ⟧«Fι«↓Pκ»MLι↑←A⁺⌈EιLκ³ζURζ⁺⌈⟦LλLτLρ⟧²Mζ→

Probieren Sie es online aus! Beachten Sie, dass der Link zu Erklärungszwecken ausführlichen Code enthält, mit der -slOption, die den entsprechenden nativen Kohlecode anzeigt. Übernimmt die Eingabe als durch Zeilenumbrüche getrennte Zeichenfolgen mit einer Leerzeile nach jedem Satz.

Bearbeiten: 11 Bytes dank @ ASCII-only gespeichert. Die vorherige Version hatte tatsächlich einen Fehler, als das letzte Wort im ersten Satz nicht im zweiten Satz war und auch die erste Spalte die höchste war, was sich in einer offensichtlichen Unfähigkeit äußerte, ein temporäres zu optimieren. Durch die Optimierung von zwei Verschiebungsbefehlen wurden 2 Bytes gespeichert (der Deverbosifier führt dies jetzt automatisch aus, aber der resultierende Code war immer gültig, sodass die Antwort immer noch konkurriert).

Bearbeiten: Ich glaube nicht, dass es Multiprintfrüher mit mehrzeiliger Ausgabe gearbeitet hat, aber es funktioniert derzeit und wenn dies verwendet wird, würden 6 Bytes plus weitere 4 Bytes eingespart, da die aktuelle Charcoal die uVariable in die leere Liste vorinitialisiert : Probieren Sie es online aus!

Neil
quelle
Oh, wenn Sie drucken möchten, ohne den Cursor zu bewegen, verwenden Sie Multiprint( )
ASCII-only
Okay, 95 Bytes , denken Sie daran, Kommas / Semikolons zu entfernen, um Trennzeichen in nicht ausführlicher Form zu entfernen (wird später behoben), Mapexistiert ebenfalls (sorry, wird so schnell wie möglich dokumentiert)
ASCII-only
@ Nur ASCII Huh, ich bin mir sicher, dass ich irgendwann Multiprint ausprobiert habe, also weiß ich nicht, warum ich es nicht zum Laufen bringen konnte. Vielen Dank auch Map, es hat mir geholfen, die Antwort ein bisschen mehr zu optimieren. Schließlich denke ich, dass Sie mit Charcoal manchmal ohne ein verwenden können, das hier ein Byte spart, oder ist das ein Fehler?
Neil
Richtungen ohne ein sind beabsichtigt (aber denken Sie immer an eine Richtung mit einer Variablen nach einem Richtungsdruck)
ASCII-only
1
Okay, fertig, jetzt müssen wir nur noch darauf warten, dass Dennis für die bessere MoveDeverbosifizierung zieht (es werden jetzt auch mehr nicht benötigte Trennzeichen entfernt, sodass Sie die Kommas wieder hinzufügen können, wenn Sie möchten)
ASCII-