Các tế bào sơ đồ Venn


12

Cho nhiều tập hợp, ví dụ s1={2,3,7}, s2={1,2,4,7,8}s3={4,7}, sơ đồ Venn trực quan hóa từng bộ bằng một đường cong kín và các phần tử nằm bên trong hoặc bên ngoài chu vi của đường cong, tùy thuộc vào việc chúng có phải là phần tử của tập hợp hay không. Bởi vì tất cả các phần tử tập hợp chỉ xuất hiện một lần trong biểu đồ Venn, các đường cong đại diện cho mỗi bộ cần chồng lấp nếu một phần tử có mặt trong nhiều bộ. Chúng tôi gọi mỗi cái như vậy chồng lên nhau một ô của sơ đồ Venn.

Giải thích này có thể hơi khó hiểu, vì vậy hãy xem xét một ví dụ.

Thí dụ

Một sơ đồ Venn cho bộ s1, s2s3có thể trông như thế này:

Các tế bào của biểu đồ Venn này được (đọc từ trên xuống dưới, từ trái qua phải) {1,8}, {2}, {7}, {4}, {3}, {}{}.

Trong thực tế, người ta thường chỉ gặp các sơ đồ Venn gồm hai hoặc ba bộ, bởi vì biểu diễn của sơ đồ Venn gồm bốn hoặc nhiều bộ không rõ ràng. Tuy nhiên, chúng tồn tại, ví dụ như trong sáu bộ:

CC BY-SA 3.0, https: //commons.wik mega.org/w/index.php?curid=1472309

Nhiệm vụ

Cho một tập hợp các số nguyên dương không trống trong bất kỳ biểu diễn hợp lý nào, trả về tập hợp các ô của sơ đồ Venn của bộ đầu vào. Cụ thể, không cần đại diện đồ họa là cần thiết.

  • Bạn có thể viết một chương trình đầy đủ hoặc một chức năng.
  • Bạn có thể trả về nhiều tập hợp trống vì có các ô trống (tức là danh sách tất cả các ô) thay vì chỉ một tập hợp trống (tức là tập hợp các ô).
  • Một số cách hợp lý đầu vào cho ví dụ trên bao gồm nhưng không giới hạn ở {{2,3,7},{1,2,4,7,8},{4,7}}, [[2,3,7],[1,2,4,7,8],[4,7]], "2,3,7;1,2,4,7,8;4,7"hoặc "2 3 7\n1 2 4 7 8\n4 7". Nếu nghi ngờ liệu định dạng đầu vào bạn chọn có được chấp nhận hay không, vui lòng hỏi trong một nhận xét.
  • Định dạng đầu ra của bạn phải phù hợp với định dạng đầu vào của bạn, nếu có thể. Lưu ý rằng quy tắc này yêu cầu định dạng của bạn để có thể hiển thị rõ ràng các bộ trống.
  • Đây là , vì vậy hãy cố gắng sử dụng càng ít byte càng tốt trong ngôn ngữ bạn chọn. Để khuyến khích sự cạnh tranh trên mỗi ngôn ngữ thay vì giữa các ngôn ngữ, tôi sẽ không chấp nhận câu trả lời.

Các trường hợp thử nghiệm

Dưới đây là một số đầu vào cùng với đầu ra có thể:

input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}

Tôi cho rằng điều này là đúng vì định nghĩa của một tập hợp, nhưng chúng ta có thể cho rằng sẽ không có bản sao trong một trong các tập con không?
HyperNeutrino

@Hyper Neutrino Có, bạn có thể giả sử tất cả các bộ được sao chép miễn phí.
Laikoni

Có lẽ bạn có thể thêm một trường hợp thử nghiệm trong đó không có ô nào trống. Ví dụ: {{1,2,3,4}, {1,2,5,6}, {1,3,5,7}}.
Ørjan Johansen

Làm thế nào để thứ hai không cho {{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}?
Nữ tu bị rò rỉ

1
@carusocomputing Khi kiểm tra kỹ hơn, bạn sẽ thấy rằng đây không phải là sơ đồ Venn thực sự vì một số lớp phủ có thể bị thiếu.
Laikoni

Câu trả lời:


8

Haskell , 71 byte

Một hàm ẩn danh lấy danh sách các số nguyên và trả về một danh sách tương tự.

Sử dụng như là (foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]] .

import Data.List
foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[]

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

Làm thế nào nó hoạt động

  • Sử dụng các hoạt động giống như tập hợp \\(sự khác biệt) vàintersect từ Data.List.
  • Gấp danh sách "bộ" (được biểu thị dưới dạng danh sách) vào danh sách các ô, bắt đầu với danh sách trống [] .
  • x là tập hợp hiện tại sẽ được thêm vào sơ đồ và r là danh sách các ô đã được xây dựng.
    • x\\(id=<<r) là tập hợp con của các phần tử của x không nằm trong bất kỳ ô nào đã được xây dựng.
    • [intersect x,(\\x)]<*>rphân chia từng ô rtheo liệu các phần tử của nó có ở trong khôngx hay không.
  • Hầu hết chắc chắn không cố gắng hợp nhất các ô trống, vì vậy có khá nhiều trong số đó ở đầu ra.

Ý tưởng tương tự như triển khai của tôi, nhưng ngắn hơn hai byte. Làm tốt!
Laikoni

4

Thạch , 14 17 byte

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€

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

Gửi chức năng (vì định dạng Jelly in liệt kê theo mặc định không phải là chuyến đi khứ hồi - nó không thể đọc định dạng đầu ra của chính nó - nhưng một chức năng đầu vào và đầu ra theo cùng định dạng). Liên kết TIO chứa chân trang chạy chức năng và in đầu ra của nó theo cùng định dạng mà đầu vào được phân tích cú pháp.

Giải trình

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€
FṀ‘               Find the largest number that appears in any of the input sets, + 1
   ³ þ            For each number from 1 to that number, and each of the input sets
    i ¬             find whether the number is missing from the set
       Ḅ          Convert the list of missing sets into a single number using binary
         ;        Append
        µ ṀḶ$     all numbers from 0 to the maximum value minus 1
             Ġ    Group indexes by values
              ṖṖ€ Delete the last group and last element of other groups

Yêu cầu chúng tôi xuất ra ít nhất một tập hợp trống nếu không phải tất cả các phần của sơ đồ Venn được sử dụng quản lý để chiếm hơn một nửa chương trình ở đây (nó chịu trách nhiệm đảm bảo rằng chúng tôi có ít nhất một nhóm cho các phần tử không khớp, cho phép chúng tôi để theo dõi xem có bao nhiêu bộ ban đầu, cộng với chín byte cuối cùng của mã nguồn ngoại trừ Ġ). Cách cơ bản để chúng tôi thực hiện là đảm bảo rằng tất cả các tập hợp sơ đồ Venn 2 ^ n có ít nhất một mục, bằng cách thêm một mục giả sẽ điền vào phần "không có bộ" và (sau) một mục giả cho mỗi mục phần khác, sau đó Ġsẽ xuất ra một nhóm cho mỗi tập hợp con mà chúng ta có thể loại bỏ bằng cách sử dụng ṖṖ€.


Không có giới hạn tối đa 7 bộ và một trong các trường hợp thử nghiệm có nhiều hơn.
Ørjan Johansen

Tôi giả sử bộ ban đầu có độ dài 3, vì đó là cách biểu đồ Venn hoạt động, nhưng rõ ràng là không? Trong trường hợp đó, có lẽ tôi chỉ cần một cách khác để thêm tập hợp trống nếu không phải tất cả các phần của sơ đồ Venn đều được điền. Đó là một điều khó chịu đối với những gì khác là một câu hỏi khá thanh lịch.

Vâng, bạn có thể thay thế 7 bằng 2 ^ n-1, tôi giả sử.
Ørjan Johansen

Tôi đã tìm thấy một cách để có được giá trị 2 ^ n-1 phù hợp với thông số kỹ thuật, nhưng nó rất dài. Hy vọng rằng có một cách ngắn hơn, nhưng ngay cả như vậy, câu hỏi này là bực bội.

4

Perl 5, 79 byte

sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h}

Lấy đầu vào dưới dạng danh sách các mảng ẩn danh như ([2,3,7], [1,2,4,7,8], [4,7]). Xuất ra một hàm băm trong đó các khóa là nhãn và các giá trị là các mảng ẩn danh tương ứng với các bộ đầu ra.

Là một phần của chương trình đầy đủ:

*x=
sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h};
%x=x([2,3,7],[1,2,4,7,8],[4,7]);
print"Set $_:@{$x{$_}}\n"for keys%x;

Giải trình:

Cung cấp cho mỗi bộ một số nguyên dưới dạng nhãn , $.. Tạo một hàm băm lưu trữ một số nguyên cho mỗi phần tử duy nhất $_. Thêm 2**$.vào cho mỗi tập hợp $_xuất hiện, tạo hiệu quả bản đồ nhị phân hiển thị tập hợp từng phần tử xuất hiện. Cuối cùng, tạo một mảng ẩn danh cho mỗi ô của sơ đồ Venn và đẩy các phần tử xuất hiện trong các tập tương ứng vào mảng. Vì vậy, mỗi phần tử của mỗi mảng tồn tại trong cùng một tập hợp và do đó cùng một ô của sơ đồ Venn.


3

Bình thường , 11 byte

m-@Fds-Qdty

Bộ thử nghiệm.

Làm thế nào nó hoạt động

Mỗi vùng của sơ đồ Venn đại diện cho các phần tử nằm trong [các kết hợp nhất định của các bộ] nhưng không nằm trong [các bộ khác].

Vì vậy, chúng tôi tạo ra tất cả các kết hợp có thể (và loại bỏ các kết hợp trống) bằng cách tìm bộ sức mạnh của đầu vào.

Đối với mỗi kết hợp được tạo, chúng tôi tìm giao điểm của các tập hợp trong kết hợp và lọc ra các phần tử có trong các tập hợp khác.

m-@Fds-Qdty  input as Q
          y  power set
         t   remove the first one (empty combination)
m            for each combination d:
  @Fd            find the intersection of all the sets in d
 -               filter out those who are in
     s               the union of
      -Qd            the sets not in the combination
                     (input minus combination)

2

JavaScript (ES6), 123 byte

a=>a.map((b,i)=>b.map(e=>m[e]|=1<<i),m=[])&&[...Array(1<<a.length)].map((_,i)=>m.map((e,j)=>e==i&&j).filter(j=>j)).slice(1)
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.