Diagrama de Venn ASCII-Art

8

Dadas duas listas que não contêm elementos duplicados ae b, encontre o cruzamento entre as duas listas e produza um diagrama de Venn ASCII-Art. O diagrama de Venn usará uma versão quadriculada dos círculos tradicionais para simplificar.

Exemplo

Dado:

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

Saída (a ordem é 100% arbitrária, desde que o diagrama de Venn esteja correto):

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

O programa pode considerar '1' == 1ou '1' != 1, até sua implementação. Você também pode optar por manipular tudo como strings e aceitar apenas a entrada de strings.


Dado:

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

Saída (observe como as duas partes vazias ainda têm o espaço no teclado direito):

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

Dado:

a=[1]
b=[1]

Resultado:

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

Regras

  • Os elementos do diagrama de Venn são alinhados à esquerda e preenchidos com a entrada de comprimento máximo mais 1.
  • A ordem dos elementos nas subseções do diagrama de Venn é arbitrária.
  • Os cantos do diagrama de Venn (onde se |encontram -) devem ser representados por a +.
  • Você tem a garantia de que a.join(b).length() > 0, se os dois estiverem vazios, poderá fazer o que for.
    • Você pode até imprimir uma foto de Abe Lincoln, não se importe.
  • Isso é , e .

Bônus

O carvão vegetal processa caixas como essa naturalmente, mas toda a teoria dos conjuntos parte ... Não sei o quão bem isso é feito. Recompensa de +100 pelo envio mais curto de carvão antes que eu possa adicionar uma recompensa à pergunta (dois dias depois de ser feita).

Urna de polvo mágico
fonte
3
Pessoalmente, sinto que ser capaz de apoio '1' == 1é um pouco demais de um estiramento
user41805
O @KritixiLithos é bastante justo, atualizou a especificação do desafio para que não machuque aqueles que começaram. Agora é sua escolha como você deseja que a comparação de string para número inteiro funcione, sendo ambas as opções igualmente válidas.
Magic Octopus Urn
1
Podemos assumir que a entrada conterá apenas cadeias?
Rod
Relacionado.
Martin Ender
1
@ L3viathan uma edição móvel e sua postagem terminou.
Magic Octopus Urn

Respostas:

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

Experimente online!

Cajado
fonte
Um pouco errado, você está perdendo o teclado de espaço certo.
Magic Octopus Urn
@carusocomputing fixed
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);

Versão Online

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

Carvão , 106 89 87 bytes:

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

Experimente online! Observe que o link é detalhado para fins explicativos, com a -slopção que mostra o código de carvão nativo equivalente. Recebe a entrada como seqüências separadas por nova linha com uma linha em branco após cada conjunto.

Editar: salvou 11 bytes graças a @ ASCII-only. A versão anterior realmente teve um bug quando a última palavra no primeiro conjunto não estava no segundo e também a primeira coluna foi a mais alta, que se manifestou como uma aparentemente incapacidade de otimizar temporariamente. Economizou 2 bytes otimizando dois comandos Mover (o deverbosifier agora faz isso automaticamente, mas o código resultante sempre foi válido, portanto a resposta ainda está competindo).

Edit: Eu não acho que Multiprintcostumava trabalhar com saída de múltiplas linhas, mas atualmente o uso disso economizaria 6 bytes, mais 4 bytes, porque o atual Charcoal pré-inicializa a uvariável na lista vazia: Experimente online!

Neil
fonte
Oh, se você pretende imprimir sem mover o cursor, o uso Multiprint( )
ASCII-only
Ok, 95 bytes , lembre-se de remover vírgulas / ponto e vírgula para remover delimitador em não verboso forma (irá corrigir mais tarde), também Mapexiste (desculpe, irá documentar o mais cedo possível)
ASCII-only
@ Somente ASCII Huh, bem, tenho certeza de que tentei a Multiprint em algum momento, então não sei por que não consegui fazê-la funcionar. Além disso, obrigado por Map, isso me ajudou a otimizar a resposta um pouco mais. Finalmente, acho que o carvão às vezes permite que você use sem um que salvaria um byte aqui, ou isso é um bug?
Neil
Direções sem um são intencionais (mas lembre-se sempre uma direção com uma variável depois é uma cópia direcional)
ASCII-only
1
Ok, pronto, agora tudo o que precisamos fazer é aguardar que Dennis Movetente o melhor deverbosifying (agora também remove mais separadores desnecessários, para que você possa adicionar as vírgulas se desejar)
somente ASCII