Sơ đồ Venn ASCII-Art


8

Đưa ra hai danh sách không chứa các phần tử trùng lặp abtìm giao điểm giữa hai danh sách và đưa ra Sơ đồ Venn ASCII-Art. Biểu đồ Venn sẽ sử dụng một phiên bản vuông góc của các vòng tròn truyền thống để đơn giản.

Thí dụ

Được:

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

Đầu ra (Thứ tự là 100% tùy ý, miễn là Biểu đồ Venn đúng):

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

Chương trình có thể xem xét '1' == 1hoặc '1' != 1, tùy theo việc bạn thực hiện. Bạn cũng có thể chọn chỉ xử lý mọi thứ dưới dạng chuỗi và chỉ chấp nhận đầu vào chuỗi.


Được:

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

Đầu ra (Lưu ý cách hai phần trống vẫn có khoảng trống ở bên phải):

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

Được:

a=[1]
b=[1]

Đầu ra:

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

Quy tắc

  • Các yếu tố của Biểu đồ Venn được căn trái và được đệm vào mục nhập độ dài tối đa cộng với 1.
  • Thứ tự của các phần tử trong các phần con của Biểu đồ Venn là tùy ý.
  • Các góc của biểu đồ Venn (nơi |gặp nhau -) phải được biểu diễn bằng a +.
  • Bạn đang trốn tránh rằng a.join(b).length() > 0, nếu cả hai đều trống rỗng, bạn có thể làm bất cứ điều gì.
    • Bạn thậm chí có thể in một bức ảnh của Abe Lincoln, đừng quan tâm.
  • Đây là , .

Tặng kem

Than làm cho các hộp như thế này một cách tự nhiên, nhưng toàn bộ phần lý thuyết ... Không biết nó làm tốt đến mức nào. +100 tiền thưởng cho lần gửi than ngắn nhất trước khi tôi có thể thêm tiền thưởng vào câu hỏi (2 ngày kể từ khi được hỏi).


3
Cá nhân, tôi cảm thấy rằng việc có thể hỗ trợ '1' == 1là hơi quá sức
dùng41805

@KritixiLithos đủ công bằng, cập nhật thông số thử thách để nó không làm tổn thương những người đã bắt đầu. Bây giờ bạn có thể lựa chọn cách bạn muốn so sánh chuỗi với số nguyên hoạt động, cả hai lựa chọn đều là các bài nộp hợp lệ như nhau.
Bạch tuộc ma thuật Urn

1
Chúng ta có thể giả định rằng đầu vào sẽ chỉ chứa các chuỗi?
Rod


1
@ L3viathan một chỉnh sửa di động và bài viết của bạn đã kết thúc.
Bạch tuộc ma thuật Urn

Câu trả lời:


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

Hãy thử trực tuyến!


Hơi sai một chút, bạn đang thiếu một phím cách bên phải.
Bạch tuộc ma thuật Urn

@carusocomputing đã được sửa
Rod

2

PHP> = 7.1, 287 byte

<?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);

Phiên bản trực tuyến

Mở rộng

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

Than , 106 89 87 byte:

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

Hãy thử trực tuyến! Lưu ý rằng liên kết là mã verbose cho mục đích giải thích, với -sltùy chọn hiển thị mã Char than bản địa tương đương. Đưa đầu vào dưới dạng các chuỗi được phân tách bằng dòng mới với một dòng trống sau mỗi bộ.

Chỉnh sửa: Đã lưu 11 byte chỉ nhờ @ ASCII. Phiên bản trước thực sự có lỗi khi từ cuối cùng trong tập đầu tiên không nằm trong tập thứ hai và cũng là cột đầu tiên cao nhất, biểu hiện là không có khả năng tối ưu hóa tạm thời. Đã lưu 2 byte bằng cách tối ưu hóa hai lệnh Move (deverbosifier hiện thực hiện điều này một cách tự động nhưng mã kết quả luôn hợp lệ để câu trả lời vẫn còn cạnh tranh).

Chỉnh sửa: Tôi không nghĩ đã Multiprinttừng làm việc với đầu ra đa dòng nhưng hiện tại và việc sử dụng nó sẽ tiết kiệm được 6 byte, cộng thêm 4 byte nữa vì Char than hiện tại đã xác định trước ubiến vào danh sách trống: Hãy thử trực tuyến!


Ồ, nếu bạn muốn in mà không di chuyển con trỏ, hãy sử dụng Multiprint( )
ASCII - chỉ

Được rồi, 95 byte , hãy nhớ xóa dấu phẩy / dấu chấm phẩy để xóa dấu phân cách ở dạng không dài dòng (sẽ sửa sau), cũng Maptồn tại (xin lỗi, sẽ tài liệu càng sớm càng tốt)
ASCII chỉ có

@ Chỉ có ASCII Huh, tốt, tôi chắc chắn rằng tôi đã thử Multiprint tại một số điểm, vì vậy tôi không biết tại sao tôi không thể làm cho nó hoạt động. Ngoài ra, cảm ơn vì Map, nó đã giúp tôi tối ưu hóa câu trả lời hơn một chút. Cuối cùng, tôi nghĩ rằng Char than đôi khi cho phép bạn sử dụng mà không cần một byte nào để lưu một byte ở đây, hay đó là một lỗi?
Neil

Các hướng không có chủ ý (nhưng luôn nhớ một hướng có biến sau là in hướng)
ASCII - chỉ

1
Được rồi, xong rồi, bây giờ tất cả những gì chúng ta cần làm là đợi Dennis rút ra cách Movekhử nhiễu tốt hơn (giờ đây nó cũng loại bỏ các dấu phân cách không cần thiết hơn để bạn có thể thêm dấu phẩy trở lại nếu bạn muốn)
ASCII
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.