Hai bộ có bằng nhau không


9

{}là tập hợp trống. Bạn có thể sử dụng ()hoặc []nếu bạn chọn.

Chúng tôi sẽ không định nghĩa chặt chẽ "bộ", nhưng bộ tất cả đều thỏa mãn các thuộc tính sau:

Bộ theo cấu trúc toán học thông thường. Dưới đây là một số điểm quan trọng:

  • Bộ không được đặt hàng.
  • Không có bộ chứa chính nó.
  • Các phần tử có trong một tập hợp hoặc không, đây là boolean. Do đó, các phần tử tập hợp không thể có bội số (tức là một phần tử không thể nằm trong một tập hợp nhiều lần.)
  • Các phần tử của một tập hợp cũng là các tập hợp và {}là phần tử nguyên thủy duy nhất.

Bài tập

Viết chương trình / hàm xác định xem hai tập có bằng nhau không.

Đầu vào

Hai bộ hợp lệ thông qua stdin hoặc đối số hàm. Các định dạng đầu vào là lỏng lẻo trong lý do.

Một số đầu vào hợp lệ là:

{} {{}}
{{},{{}}} {{{{{},{{}}}}}}
{{},{{},{{}}}} {{{},{{}}},{{{{{},{{}}}}}}}

Đầu vào không hợp lệ:

{{} {}              Brackets will always be balanced.
{{},{}} {}          Set contains the same element twice

Đầu ra

Một giá trị trung thực nếu các đầu vào bằng nhau, giả mạo khác.

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

Việc gửi của bạn phải trả lời chính xác cho tất cả các đầu vào hợp lệ, không chỉ cho các trường hợp thử nghiệm. Đây có thể được cập nhật tại bất kỳ điểm nào.

Sự thật:

{} {}
{{},{{}}} {{{}},{}}
{{},{{},{{{}},{}}}} {{{{},{{}}},{}},{}}

Giả mạo:

{} {{}}
{{},{{},{{{}},{}}}} {{{{}}},{},{{}}}
{{},{{}},{{{}}},{{},{{}}}} {}

Chấm điểm

Quy tắc bổ sung

Một quy tắc bổ sung đã được thêm vào cấm hoàn toàn các loại lặp không có thứ tự. Họ quá phổ biến và tầm thường hóa thử thách này quá nhiều. Vui lòng để lại câu trả lời vi phạm điều này, vui lòng chỉ đưa ra một dấu hiệu cho thấy chúng được thực hiện trước khi thay đổi quy tắc.


Một ngôn ngữ với loại tập hợp có thể lồng chỉ kiểm tra sự bình đẳng?
xnor

@xnor Được xây dựng nên là trò chơi công bằng, vâng
Liam

1
@Dennis tốt, mặc dù đây là một thử thách "chuỗi cân bằng", tôi chưa bao giờ thực sự nghĩ đó là một thử thách phân tích cú pháp. Nhưng, bây giờ tôi nghĩ về nó, bằng cách giả sử rằng tất cả các đầu vào là hợp lệ, tôi đã biến nó thành một thách thức phân tích cú pháp. Vì vậy, tôi nghĩ rằng bạn đúng. Đủ các ngôn ngữ có thể có ý tưởng về một danh sách không theo thứ tự sẽ tầm thường hóa điều này.
Liam

1
Tôi sẽ ổn với bất cứ quyết định nào của bạn. Cá nhân, trong khi tôi nghĩ rằng bằng cách nào đó vẫn có thể sáng tạo mà không tầm thường hóa thử thách (như câu trả lời Julia của tôi, chuyển đổi một cách đệ quy một mảng lồng nhau thành một tập hợp lồng nhau), cho phép các tập hợp lồng nhau làm đầu vào làm cho mọi thứ trở nên quá đơn giản ( ==trong Julia, 2 byte; frozenset.__eq__bằng Python, 16 byte, v.v.).
Dennis

8
See the comments for an explanation. Xin đừng làm điều này. Nhận xét rất dễ bay hơi và biến mất rất dễ dàng, vì vậy sutff quan trọng sẽ xuất hiện trong phần thân bài
chú mèo

Câu trả lời:




3

Brachylog , 8 byte

{p:1a.}.

Điều này mong đợi dấu ngoặc trong Đầu vào và Đầu ra.

Ví dụ:

?- run_from_atom('{p:1a.}.', [[]:[[]]], [[[]]:[]]).
true .

Giải trình

{     }.   True if the predicate inside brackets is true with input Input and output Output

 p          Unify an implicit variable with a permutation of Input
  :1a       Apply this same predicate to each element of that implicit variable
     .      True if Output can be unified with the resulting list


2

Toán học, 16 byte

Equal@@Sort//@#&

Một hàm không tên dự kiến ​​một danh sách chứa cả hai bộ, ví dụ

Equal@@Sort//@#& @ {{{}, {{}}}, {{{}}, {}}}

Chúng tôi sử dụng //@( MapAll) để sắp xếp các tập hợp ở mọi cấp độ và sau đó khẳng định kết quả là bằng nhau.


2

JavaScript (ES6), 42 byte

f=(a,b,g=a=>0+a.map(g).sort()+1)=>g(a)==g(b)

Chấp nhận đầu vào bằng []s eg f([[],[[]]],[[[]],[]]). Hoạt động bằng cách chuyển đổi các mảng thành chuỗi và sau đó sắp xếp chúng từ trong ra ngoài. 01được sử dụng vì chúng ngắn hơn '['']', ví dụ như g([[[]],[]])001,00111đại diện [[],[[]]].


Bạn không sử dụng đệ quy, vì vậy bạn có thể đặt tên ẩn
Bálint

Tại sao lại có điều 0+đó?
Bálint

@ Bálint Bởi vì không có 0++1tất cả những gì tôi nhận được là dấu phẩy.
Neil

@ Bálint Tôi không biết tại sao tôi quên xóa f= , tôi đã không đưa nó vào số byte và tôi quá lười để chỉnh sửa bài chỉ vì điều đó.
Neil

2

Python 2, 49 byte

f=lambda x:sorted(map(f,x))
lambda a,b:f(a)==f(b)

Ví dụ: gọi hàm ẩn danh g:

>>> g( [[],[[]]] , [[[]],[]] )
True

g([[],[[],[]],[[],[[]]],[[]],[[[]]]], [[[],[]],[[[]],[]],[[]],[[[]]],[]])trả về False, nhưng các bộ bằng nhau Điều đó nên được sửa bằng cách ánh xạ trước khi sắp xếp.
Dennis

2

Prolog (SWI) , 37 byte

X+Y:-permutation(X,Z),maplist(+,Z,Y).

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

Đưa đầu vào dưới dạng danh sách lồng nhau, nghĩa là với dấu ngoặc vuông thay vì dấu ngoặc nhọn. Ban đầu, đây là X+Y:-sort(X,M),sort(Y,N),maplist(+,M,N)., nhưng sau đó tôi đã thử dịch câu trả lời Brachylog v1 của Fatalize và nó ngắn hơn 3 byte.

X+Y :-                    X+Y succeeds when
    permutation(X, Z),    for some permutation Z of X
    maplist(+, Z, Y).     + succeeds for every pair in Z zipped with Y.
                          (where maplist will succeed without the recursive call to + for
                          two empty lists, and fail if the lists have different lengths)

Nó thực sự có thể xử lý các dấu ngoặc nhọn thay vào đó, để có thêm 23 byte:

Prolog (SWI) , 60 byte

{A}*C:-A=..[,|B],sort(B,C).
X+Y:-X=Y;X*M,Y*N,maplist(+,M,N).

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

*ở đây chuyển đổi một X=Y;thuật ngữ niềng răng (không trống, do đó ) ở bên phải của nó thành một danh sách các phần tử của thuật ngữ sau đó sắp xếp nó sang bên trái của nó.

{A}*C :-            X*C succeeds when X is the brace term containing A
    A =.. [,|B],    where A is a comma-tuple and B is a list of its elements,
    sort(B, C).     and C is B sorted.

Kể từ khi cả hai đối số +đang trải qua *rồi, đặt một sorttrong *tiết kiệm 7 byte qua sử dụng permutationtrong+ .

Và cuối cùng, đây là phiên bản xử lý các danh sách đầu vào có thể có các yếu tố trùng lặp, đó là điều đã truyền cảm hứng cho tôi viết một giải pháp trong Prolog để bắt đầu:

Prolog (SWI) , 57 byte

X+Y:-X/Y,Y/X.
X/Y:-maplist(-(Y),X).
Y-E:-member(F,Y),E+F.

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

X+Y :-                   X+Y succeeds when
    X/Y, Y/X.            X/Y and Y/X succeed.
X/Y :-                   X/Y succeeds when
    maplist(-(Y), X).    for every element E of X, Y-E succeeds
                         (or when X is empty).
Y-E :-                   Y-E succeeds when
    member(F, Y),        there exists some element F of Y
    E+F.                 such that E+F succeeds.

Về cơ bản, X/Ytuyên bố rằng X là tập con của Y, bằng cách tuyên bố rằng với mọi phần tử của X, có một phần tử bằng nhau của Y, do đó X/Y,Y/Xtuyên bố rằng X và Y là các tập bằng nhau.


Và bây giờ tôi cần ngủ
Chuỗi không liên quan

2

APL (NARS2000), 4 byte

≡⍦

là toán tử multiset, nó sửa đổi các hàm để coi các đối số của chúng là tập hợp thay vì danh sách
là hàm tương đương, trả về một Boolean cho biết nếu các đối số hoàn toàn tương đương về giá trị và hình dạng

Về quy tắc bổ sung: Lưu ý rằng câu trả lời này không sử dụng bất kỳ kiểu dữ liệu tập hợp không có thứ tự nào, mà chỉ là các danh sách bình thường (có thể chứa nhiều phần tử giống hệt nhau). Nó chỉ xử lý chúng là bộ.

Số byte là 4 vì NARS2000 chỉ sử dụng UCS-2.



1

SETL, 1 byte

=

Đưa ra các đối số trái và phải.

Lưu ý rằng điều này KHÔNG tuân thủ quy tắc được thêm vào, cấm các kiểu dữ liệu được đặt không có thứ tự.


1

Brachylog v2, 3 byte

p↰ᵐ

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

Đưa một bộ qua biến đầu vào và bộ kia qua biến đầu ra. Thành công nếu các bộ bằng nhau và thất bại nếu chúng không.

Giống như câu trả lời Prolog chính của tôi, một bản dịch của câu trả lời Brachylog v1 của Fatalize (mà tôi nghĩ có thể bị đánh golf xuống p:0a?).

       The input
p      can be re-ordered so that
 ↰     when this predicate is applied again to
  ᵐ    all of its elements,
       it is the output.


0

Haskell, 77 byte

import Data.List
data S=L[S]deriving(Eq,Ord)
f(L x)=L$sort$f<$>x
a!b=f a==f b

Không quan tâm, tại sao bạn cần xác định loại danh sách của riêng mình ở đây? (Được ==<không được xác định theo mặc định cho danh sách?)

1
kiểu dữ liệu được đệ quy: Tôi định nghĩa Slà một Ldanh sách (bọc trong ) của Ses. Haskell không có loại tích hợp có thể đại diện cho danh sách các danh sách danh sách của
Lynn

0

Perl 6 , 55 byte

my&f=->\a,\b {a==b&&all map {f(|$_)},(a.sort Z,b.sort)}

Đưa đầu vào với [].

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


Một số điều: bạn không cần khoảng trắng sau các đối số cho khối mã, $^thay vào đó, việc sử dụng cú pháp thường ngắn hơn và tôi không nghĩ []đầu vào hoạt động, vì tất cả các [[]],[[[]]],[[[[]]]]v.v đều đánh giá[]
Jo King

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.