Diagrama ASCII-Art Venn

8

Dadas dos listas que no contienen elementos duplicados ay b, encontrar el cruce entre las dos listas y generar un Diagrama de Venn ASCII-Art. El diagrama de Venn utilizará una versión cuadriculada de los círculos tradicionales para simplificar.

Ejemplo

Dado:

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

Salida (el orden es 100% arbitrario, siempre que el diagrama de Venn sea correcto):

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

El programa puede considerar '1' == 1o '1' != 1, hasta su implementación. También puede optar por manejar todo como cadenas y solo aceptar la entrada de cadena.


Dado:

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

Salida (observe cómo las dos partes vacías todavía tienen el espacio de la plataforma derecha):

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

Dado:

a=[1]
b=[1]

Salida:

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

Reglas

  • Los elementos del diagrama de Venn se alinean a la izquierda y se rellenan hasta la entrada de longitud máxima más 1.
  • El orden de los elementos dentro de las subsecciones del diagrama de Venn es arbitrario.
  • Las esquinas del diagrama de Venn (donde se |encuentra -) deben estar representadas por a +.
  • Está garantizado que a.join(b).length() > 0, si ambos están vacíos, puede hacer lo que sea.
    • Incluso puede imprimir una foto de Abe Lincoln, no me importa.
  • Esto es , y .

Prima

El carbón de leña produce cuadros como este naturalmente, pero toda la parte de la teoría del conjunto ... No sé qué tan bien lo hace. +100 de recompensa por el envío de carbón más corto antes de que pueda agregar una recompensa a la pregunta (2 días después de que se me pregunte).

Urna de pulpo mágico
fuente
3
Personalmente, siento que ser capaz de soportar '1' == 1es demasiado
difícil
@KritixiLithos, bastante justo, actualizó las especificaciones del desafío para que no perjudique a los que comenzaron. Ahora es su elección cómo desea que funcione la comparación de cadena a entero, ambas opciones son presentaciones igualmente válidas.
Urna mágica del pulpo
1
¿Podemos suponer que la entrada solo contendrá cadenas?
Rod
Relacionado.
Martin Ender
1
@ L3viathan una edición móvil y su publicación ha terminado.
Magic Octopus Urn

Respuestas:

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

Pruébalo en línea!

varilla
fuente
Ligeramente equivocado, te estás perdiendo el botón derecho de un espacio.
Magic Octopus Urn
@carusocomputing arreglado
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);

Versión en línea

Expandido

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
fuente
2

Carbón , 106 89 87 bytes:

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

Pruébalo en línea! Tenga en cuenta que el enlace es un código detallado con fines explicativos, con la -slopción que muestra el código de carbón nativo equivalente. Toma la entrada como cadenas separadas por una nueva línea con una línea en blanco después de cada conjunto.

Editar: Guardado 11 bytes gracias a @ ASCII-only. La versión anterior en realidad tenía un error cuando la última palabra en el primer conjunto no estaba en el segundo conjunto y también la primera columna era la más alta, lo que se manifestaba como una incapacidad aparente para optimizar un temporal. Ahorré 2 bytes al optimizar dos comandos Move (el desverbosificador ahora lo hace automáticamente, pero el código resultante siempre fue válido, por lo que la respuesta sigue compitiendo).

Editar: No creo que Multiprintsolía funcionar con salida multilínea, pero lo hace actualmente y usar eso ahorraría 6 bytes, más otros 4 bytes porque el carbón de leña actual preinicializa la uvariable en la lista vacía: ¡ Pruébelo en línea!

Neil
fuente
Oh, si desea imprimir sin mover el cursor, use Multiprint( )
solo ASCII
De acuerdo, 95 bytes , recuerde eliminar comas / punto y coma para eliminar el delimitador en forma no detallada (se solucionará más adelante), también Mapexiste (lo siento, se documentará lo antes posible)
ASCII-solo
@ Solo ASCII Huh, bueno, estoy seguro de que probé Multiprint en algún momento, así que no sé por qué no pude hacerlo funcionar. Además, gracias por Mapayudarme a optimizar la respuesta un poco más. Finalmente, creo que Charcoal a veces te permite usarlo sin un que ahorre un byte aquí, ¿o es un error?
Neil
Direcciones sin son intencionales (pero siempre recordar una dirección con una variable después es una impresión direccional)
Solo ASCII
1
Bien, listo, ahora todo lo que tenemos que hacer es esperar a que Dennis Movelogre una mejor desverbosificación (ahora también elimina más separadores innecesarios para que pueda volver a agregar las comas si lo desea)
solo ASCII