Рівні два набори


9

{}- порожній набір. Ви можете використовувати ()або []якщо захочете.

Ми не будемо чітко визначати "встановити", але всі набори відповідають таким властивостям:

Набори дотримуються звичайної математичної структури. Ось кілька важливих моментів:

  • Набори не замовлені.
  • Жоден набір не містить себе.
  • Елементи є або в наборі, або ні, це булеве. Тому набір елементів не може мати кратності (тобто елемент не може бути у множині кілька разів.)
  • Елементи набору також є множинами і {}є єдиним примітивним елементом.

Завдання

Напишіть програму / функцію, яка визначає, чи рівні два набори.

Вхідні дані

Два допустимих набору через аргумент stdin або аргумент. Формат вводу втрачається в межах причини.

Деякі дійсні входи:

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

Недійсні входи:

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

Вихідні дані

Достовірне значення, якщо входи рівні, помилково хибні.

Тестові справи

Ваша заявка повинна відповідати правильно для всіх дійсних даних, а не лише для тестових випадків. Вони можуть бути оновлені в будь-який момент.

Truthy:

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

Фальсі:

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

Оцінка балів

Додаткові правила

Додано додаткове правило, яке забороняє взагалі не упорядковані ітерабельні типи. Вони занадто поширені і занадто сильно реалізують цей виклик. Не соромтесь залишати відповіді, що порушують це, на місці, будь ласка, вкажіть, що вони були зроблені до зміни правила.


Чи може мова з нестабільним набором типу просто перевірити рівність?
xnor

@xnor Вбудовані повинні бути чесною грою, так
Ліам

1
@ Денніс добре, хоча це "складне" струнне завдання, я ніколи не вважав це проблемою розбору. Але тепер, коли я замислююся над цим, припускаючи, що всі дані є дійсними, я начебто зробив це завданням для розбору. Тож я думаю, ти маєш рацію. Досить мов, мабуть, має уявлення про не упорядкований список, який би це дорік.
Ліам

1
Я буду добре з будь-яким рішенням, яке ви приймете. Особисто я вважаю, що використання наборів якимось чином може бути творчим без тривіалізації виклику (як моя відповідь Джулії, яка рекурсивно перетворює вкладений масив у вкладений набір), дозволяючи вкладеним наборам як введення робить все це занадто просто ( ==у Джулія, 2 байти; frozenset.__eq__в Python - 16 байт тощо).
Денніс

8
See the comments for an explanation. Будь ласка, не робіть цього. Коментарі є летючими і йдуть дуже легко, тому важливо йде тільки капелюхи в пост тіла
кіт

Відповіді:




3

Брахілог , 8 байт

{p:1a.}.

Це очікує дужок у вході та виході.

Наприклад:

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

Пояснення

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

Математика, 16 байт

Equal@@Sort//@#&

Безіменна функція, яка очікує список, що містить обидва набори, наприклад

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

Ми використовуємо //@( MapAll) для сортування множин на кожному рівні, а потім стверджуємо, що результати є рівними.


2

JavaScript (ES6), 42 байти

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

Приймає введення за допомогою []s, напр f([[],[[]]],[[[]],[]]). Працює, перетворюючи масиви в рядки, а потім сортуючи їх зсередини назовні. 0і 1використовуються тому, що вони коротші '['та ']', наприклад, g([[[]],[]])це те, 001,00111що представляє [[],[[]]].


Ви не використовуєте рекурсії, тому можете зробити анонім
Bálint

Чому це 0+там?
Балінт

@ Bálint Тому що без 0+і +1все, що я отримаю, - це коми.
Ніл

@ Bálint Я не знаю, чому я забув видалити f=, я не включив його до числа байтів, і я занадто ледачий, щоб редагувати публікацію саме для цього.
Ніл

2

Python 2, 49 байт

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

Наприклад, виклик анонімної функції g:

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

g([[],[[],[]],[[],[[]]],[[]],[[[]]]], [[[],[]],[[[]],[]],[[]],[[[]]],[]])повертається False, але множини рівні. Це слід виправити за допомогою картографування перед сортуванням.
Денніс

2

Пролог (SWI) , 37 байт

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

Спробуйте в Інтернеті!

Вводиться як вкладені списки, тобто з квадратними дужками замість дужок. Спочатку це було X+Y:-sort(X,M),sort(Y,N),maplist(+,M,N)., але потім я спробував перекласти відповідь Bratalog v1 Fatalize і виявилося на 3 байти коротше.

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)

Насправді він може обробляти фігурні дужки замість цього ще на 23 байти:

Пролог (SWI) , 60 байт

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

Спробуйте в Інтернеті!

*тут перетворюється (непорожній, отже, X=Y;) дуговий термін з правого боку в список елементів терміна, а потім сортує його в ліву частину.

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

Так як аргументи +проходять через *вже, поставивши sortв системі *економить 7 байт по порівнянні з використанням permutationв +.

І нарешті, ось версія, яка обробляє вхідні списки, можливо, що мають повторювані елементи, саме це надихнуло мене написати рішення в Prolog для початку:

Пролог (SWI) , 57 байт

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

Спробуйте в Інтернеті!

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.

По суті, X/Yзаявляє, що X є підмножиною Y, оголошуючи, що для кожного елемента X існує рівний елемент Y, тому X/Y,Y/Xоголошує, що X і Y є рівними множинами.


І тепер мені потрібен сон
Непов’язана струна

2

APL (NARS2000), 4 байти

≡⍦

- це оператор мультисетів, який модифікує функції для трактування своїх аргументів як наборів замість списків
- це функція еквівалентності, яка повертає булеву інформацію, вказуючи, чи аргументи цілком еквівалентні за значенням та формою

Щодо додаткового правила: Зауважте, що ця відповідь використовує не упорядкований набір даних, а лише звичайні списки (які можуть містити кілька однакових елементів). Це просто лікує їх як набори.

Кількість байтів становить 4, оскільки NARS2000 використовує виключно UCS-2.



1

SETL, 1 байт

=

Приймає набори як аргументи зліва і справа.

Зауважте, що це НЕ дотримується доданого правила, яке забороняє не упорядковані набори типів даних.


1

Brachylog v2, 3 байти

p↰ᵐ

Спробуйте в Інтернеті!

Приймає один набір через вхідну змінну, а інший - через вихідну змінну. Успішно, якщо множини рівні, а помилки, якщо їх немає.

Як і моя основна відповідь на Пролог, переклад відповіді Brachylog v1 Fatalize (який, на мою думку, міг би бути зіграний 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 байт

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

З-за інтересу, чому вам потрібно було тут визначити свій тип списку? (Є ==і <не визначені за замовчуванням для списків?)

1
тип даних є рекурсивним: я визначаю Sяк (загорнутий L) список Ses. У Haskell немає вбудованого типу, який може представляти списки списків списків…
Lynn

0

Perl 6 , 55 байт

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

Приймає введення з [].

Спробуйте в Інтернеті!


Деякі речі: вам не потрібен простір після аргументів до кодового блоку, часто $^замість цього використовується синтаксис, і я не думаю, що []введення працює, тому що всі [[]],[[[]]],[[[[]]]]тощо оцінюють так[]
Jo King,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.