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).


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


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!


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

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!


Oh, si desea imprimir sin mover el cursor, use Multiprint( P)
— 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 Mque ahorre un byte aquí, ¿o es un error?
— Neil

Direcciones sin Mson 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.