Apakah kedua set sama


9

{}adalah set kosong. Anda dapat menggunakan ()atau []jika Anda memilih.

Kami tidak akan mendefinisikan "set" dengan ketat, tetapi set semua memenuhi properti berikut:

Set mengikuti struktur matematika yang biasa. Inilah beberapa poin penting:

  • Set tidak dipesan.
  • Tidak ada set yang berisi dirinya sendiri.
  • Elemen-elemen ada dalam satu set atau tidak, ini boolean. Oleh karena itu elemen set tidak dapat memiliki multiplisitas (yaitu elemen tidak dapat di set beberapa kali.)
  • Elemen himpunan juga merupakan himpunan dan {}merupakan satu-satunya elemen primitif.

Tugas

Tulis program / fungsi yang menentukan apakah dua set sama.

Memasukkan

Dua set yang valid melalui stdin atau argumen fungsi. Format input longgar karena alasan.

Beberapa input yang valid adalah:

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

Input tidak valid:

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

Keluaran

Nilai kebenaran jika inputnya sama, salah jika sebaliknya.

Uji kasus

Kiriman Anda harus menjawab dengan benar untuk semua input yang valid, bukan hanya untuk kasus uji. Ini dapat diperbarui kapan saja.

Benar:

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

Falsy:

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

Mencetak gol

Aturan tambahan

Aturan tambahan telah ditambahkan yang melarang semua jenis iterable yang tidak terurut sama sekali. Mereka terlalu umum dan meremehkan tantangan ini terlalu banyak. Jangan ragu untuk meninggalkan jawaban yang melanggar ini, mohon buat indikasi bahwa jawaban itu dibuat sebelum peraturan berubah.


Bisakah bahasa dengan tipe himpunan yang baru saja memeriksa kesetaraan?
xnor

@xnor Built-in seharusnya menjadi permainan yang adil, ya
Liam

1
@ Dennis, meskipun ini adalah tantangan "string seimbang", saya tidak pernah benar-benar menganggapnya sebagai tantangan parsing. Tapi, sekarang saya berpikir tentang itu, dengan mengasumsikan bahwa semua input valid, saya agak membuatnya menjadi tantangan penguraian. Jadi saya pikir Anda benar. Bahasa yang cukup mungkin memiliki gagasan daftar yang tidak teratur yang akan meremehkan ini.
Liam

1
Saya akan baik-baik saja dengan keputusan apa pun yang Anda buat. Secara pribadi, sementara saya berpikir bahwa menggunakan set entah bagaimana masih bisa menjadi kreatif tanpa meremehkan tantangan (seperti jawaban Julia saya, yang secara rekursif mengubah array bersarang menjadi set bersarang), memungkinkan set bersarang sebagai input membuat semuanya agak terlalu sederhana ( ==dalam Julia, 2 byte; frozenset.__eq__dengan Python, 16 byte; dll.).
Dennis

8
See the comments for an explanation. Tolong jangan lakukan ini. Komentar mudah berubah dan hilang dengan mudah, jadi sutff penting masuk dalam postingan
cat

Jawaban:



4

Jelly , 6 byte

߀Ṣ
ÇE

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ÇE   Main link. Argument: [s, t] (pair of set arrays)

Ç    Apply the helper link to [s, t].
 E   Check if the elements of the resulting pair are equal.


߀Ṣ  Helper link. Argument: u (set array)

߀   Recursively map this link over u.
  Ṣ  Sort the result.

3

Brachylog , 8 byte

{p:1a.}.

Ini mengharapkan tanda kurung di Input dan Output.

Sebagai contoh:

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

Penjelasan

{     }.   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

Mathematica, 16 byte

Equal@@Sort//@#&

Fungsi tanpa nama yang mengharapkan daftar yang berisi kedua set, misalnya

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

Kami menggunakan //@( MapAll) untuk mengurutkan set di setiap level dan kemudian menegaskan hasilnya sama.


2

JavaScript (ES6), 42 byte

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

Menerima input menggunakan []mis f([[],[[]]],[[[]],[]]). Bekerja dengan mengubah array menjadi string dan kemudian menyortirnya dari dalam ke luar. 0dan 1digunakan karena mereka lebih pendek dari '['dan ']', jadi misalnya g([[[]],[]])adalah 001,00111yang mewakili [[],[[]]].


Anda tidak menggunakan rekursi, jadi Anda bisa membuatnya anonim
Bálint

Kenapa itu 0+ada di sana?
Bálint

@ Bálint Karena tanpa 0+dan yang +1saya dapatkan hanyalah koma.
Neil

@ Bálint Saya tidak tahu mengapa saya lupa menghapus f=, saya tidak memasukkannya dalam hitungan byte dan saya terlalu malas untuk mengedit posting hanya untuk itu.
Neil

2

Python 2, 49 byte

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

Misalnya, memanggil fungsi anonim g:

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

g([[],[[],[]],[[],[[]]],[[]],[[[]]]], [[[],[]],[[[]],[]],[[]],[[[]]],[]])kembali False, tetapi set sama. Itu harus diperbaiki dengan memetakan sebelum menyortir.
Dennis

2

Prolog (SWI) , 37 byte

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

Cobalah online!

Mengambil input sebagai daftar bersarang, yaitu dengan tanda kurung siku bukan kurung kurawal. Awalnya, ini X+Y:-sort(X,M),sort(Y,N),maplist(+,M,N)., tapi kemudian saya mencoba menerjemahkan jawaban Fatalize's Brachylog v1 dan ternyata 3 byte lebih pendek.

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)

Ini sebenarnya dapat menangani kurung kurawal sebagai gantinya, selama 23 byte lebih:

Prolog (SWI) , 60 byte

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

Cobalah online!

*di sini mengkonversi (bukan kosong, maka X=Y;) istilah penjepit di sisi kanan ke daftar elemen istilah kemudian mengurutkannya ke sisi kiri.

{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.

Karena kedua argumen +telah melalui *, menempatkan sortdi *menyimpan 7 byte lebih dari menggunakan permutationdi+ .

Dan akhirnya, inilah versi yang menangani daftar input yang mungkin memiliki elemen duplikat, yang menginspirasi saya untuk menulis solusi di Prolog:

Prolog (SWI) , 57 byte

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

Cobalah online!

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.

Pada dasarnya, X/Ymenyatakan bahwa X adalah himpunan bagian dari Y, dengan menyatakan bahwa untuk setiap elemen X, ada elemen yang sama dengan Y, jadi X/Y,Y/Xnyatakan bahwa X dan Y adalah himpunan yang sama.


Dan sekarang saya perlu tidur
Unrelated String

2

APL (NARS2000), 4 byte

≡⍦

adalah operator multiset, yang memodifikasi fungsi untuk memperlakukan argumen mereka sebagai set alih-alih daftar
adalah fungsi ekivalensi, yang mengembalikan Boolean yang menunjukkan jika argumen benar-benar setara dalam nilai dan bentuk

Mengenai aturan tambahan: Perhatikan bahwa jawaban ini tidak menggunakan set tipe data yang tidak berurutan, tetapi hanya daftar normal (yang mungkin berisi beberapa elemen identik). Itu hanya memperlakukan mereka sebagai set.

Jumlah byte adalah 4 karena NARS2000 menggunakan UCS-2 secara eksklusif.


1

Julia, 36 35 32 byte

u*v=(sort(u.*v)...)
s%t=s*s==t*t

Input adalah array bersarang baik {}sintaks (usang) atau Any[].

Cobalah online!


1

SETL, 1 byte

=

Mengambil set sebagai argumen kiri dan kanan.

Perhatikan bahwa ini TIDAK mematuhi aturan tambahan yang melarang tipe data yang tidak berurutan.


1

Brachylog v2, 3 byte

p↰ᵐ

Cobalah online!

Membawa satu set melalui variabel input dan set lainnya melalui variabel output. Berhasil jika set sama dan gagal jika tidak.

Seperti jawaban Prolog utama saya, sebuah terjemahan dari jawaban Fatalize's Brachylog v1 (yang saya pikir bisa diturunkan ke golf 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

𝔼𝕊𝕄𝕚𝕟, 7 karakter / 9 byte

ѨƾꞨî,Ꞩí

Try it here (ES6 browsers only).

Penjelasan

         // implicit: î=input1,í=input2
  Ꞩî,Ꞩí // apply the Set method to both inputs
Ѩƾ      // check if the Sets are equal
        // implicit 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

Karena ketertarikan, mengapa Anda perlu mendefinisikan jenis daftar Anda sendiri di sini? (Apakah ==dan <tidak didefinisikan secara default untuk daftar?)

1
datatype bersifat rekursif: Saya mendefinisikan Ssebagai Ldaftar Ses. Haskell tidak memiliki tipe bawaan yang dapat mewakili daftar daftar daftar ...
Lynn

0

Perl 6 , 55 byte

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

Mengambil input dengan [].

Cobalah online!


Beberapa hal: Anda tidak perlu spasi setelah argumen ke blok kode, sering kali lebih pendek untuk menggunakan $^sintaks, dan saya tidak berpikir []input bekerja, karena semua [[]],[[[]]],[[[[]]]]dll mengevaluasi untuk[]
Jo King

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.