ASCII-Diagram Venn Seni


8

Diberikan dua daftar yang tidak mengandung elemen duplikat adan b, temukan crossover antara dua daftar dan hasilkan ASCII-Art Venn Diagram. Diagram Venn akan menggunakan versi singkat dari lingkaran tradisional untuk kesederhanaan.

Contoh

Diberikan:

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

Output (Pesanan 100% sewenang-wenang, asalkan Diagram Venn benar):

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

Program dapat mempertimbangkan '1' == 1atau '1' != 1, hingga implementasi Anda. Anda juga dapat memilih untuk hanya menangani semuanya sebagai string, dan hanya menerima input string.


Diberikan:

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

Keluaran (Perhatikan bagaimana dua bagian yang kosong masih memiliki ruang bantalan kanan):

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

Diberikan:

a=[1]
b=[1]

Keluaran:

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

Aturan

  • Elemen-elemen Diagram Venn rata kiri dan empuk ke entri panjang max ditambah 1.
  • Urutan elemen dalam sub-bagian dari Diagram-Ven adalah sewenang-wenang.
  • Sudut Diagram Venn (tempat |bertemu -) harus diwakili oleh a +.
  • Anda yakin bahwa a.join(b).length() > 0, jika keduanya kosong, Anda dapat melakukan apa pun.
    • Anda bahkan dapat mencetak foto Abe Lincoln, tidak peduli.
  • Ini adalah , dan .

Bonus

Arang membuat kotak-kotak seperti ini secara alami, tetapi seluruh teori himpunan bagian ... Tidak tahu seberapa baik ia melakukannya. +100 hadiah untuk pengiriman arang terpendek sebelum saya dapat menambahkan hadiah untuk pertanyaan (2 hari sejak diminta).


3
Secara pribadi, saya merasa bahwa mampu mendukung '1' == 1sedikit
berlebihan

@KritixiLithos cukup adil, memperbarui spesifikasi tantangan sehingga tidak melukai mereka yang sudah mulai. Sekarang adalah pilihan Anda tentang bagaimana Anda ingin agar perbandingan integer berfungsi, kedua pilihan tersebut adalah pengiriman yang sama-sama valid.
Magic Gurita Guci

1
Bisakah kita berasumsi bahwa input hanya akan berisi string?
Rod


1
@ L3viathan satu pengeditan seluler dan kiriman Anda selesai.
Magic Gurita Guci

Jawaban:


2

Python 2 , 221 210 212 byte

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

Cobalah online!


Sedikit salah, Anda kehilangan satu spasi di kanan-pad char.
Magic Gurita Guci

@caruscomputing diperbaiki
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 Online

Diperluas

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

Charcoal , 106 89 87 byte:

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

Cobalah online! Perhatikan bahwa tautan adalah untuk menuliskan kode untuk tujuan penjelasan, dengan -slopsi yang menunjukkan kode Arang asli yang setara. Mengambil input sebagai string yang dipisahkan oleh baris baru dengan baris kosong setelah setiap set.

Sunting: Disimpan 11 byte berkat hanya @ ASCII. Versi sebelumnya benar-benar memiliki bug ketika kata terakhir di set pertama tidak di set kedua dan juga kolom pertama adalah yang tertinggi, yang dimanifestasikan sebagai ketidakmampuan untuk mengoptimalkan sementara waktu. Disimpan 2 byte dengan mengoptimalkan dua perintah Pindahkan (deverbosifier sekarang melakukan ini secara otomatis tetapi kode yang dihasilkan selalu valid sehingga jawabannya masih bersaing).

Sunting: Saya pikir tidak Multiprintterbiasa bekerja dengan keluaran multiline tetapi saat ini bekerja dan memanfaatkannya akan menghemat 6 byte, ditambah 4 byte lebih lanjut karena Charcoal saat ini menginisialisasi uvariabel ke daftar kosong: Coba online!


Oh, jika Anda ingin mencetak tanpa memindahkan kursor, gunakan Multiprint( )
ASCII-satunya

Oke, 95 byte , ingatlah untuk menghapus koma / titik koma untuk menghapus pembatas dalam bentuk non-verbose (akan diperbaiki nanti), juga Mapada (maaf, akan mendokumentasikan secepatnya)
ASCII-hanya

@ Hanya ASCII Huh, well, saya yakin saya pernah mencoba Multiprint, jadi saya tidak tahu mengapa saya tidak bisa membuatnya berfungsi. Juga, terima kasih Map, itu membantu saya mengoptimalkan jawabannya sedikit lebih. Akhirnya, saya pikir kadang-kadang Charcoal memungkinkan Anda menggunakan tanpa yang akan menyimpan byte di sini, atau apakah itu bug?
Neil

Petunjuk tanpa disengaja (tapi selalu ingat arah dengan variabel setelah adalah cetak terarah)
ASCII-satunya

1
Oke, sudah, sekarang yang perlu kita lakukan adalah menunggu Dennis menarik Movedeverbosifikasi yang lebih baik (itu juga sekarang menghilangkan lebih banyak pemisah yang tidak dibutuhkan sehingga Anda dapat menambahkan koma kembali jika Anda mau)
ASCII-only
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.