2つのセットは等しいですか


9

{}空のセットです。使用する()[]、選択した場合。

「セット」を厳密に定義することはしませんが、セットはすべて次のプロパティを満たします。

セットは通常の数学的構造に従います。ここにいくつかの重要なポイントがあります:

  • セットは注文されていません。
  • セット自体は含まれていません。
  • 要素はセットに含まれるかどうか、これはブール値です。したがって、セット要素は多重度を持つことができません(つまり、要素はセットに複数回存在することはできません)。
  • セットの要素もセットで{}あり、唯一のプリミティブ要素です。

仕事

2つのセットが等しいかどうかを判別するプログラム/関数を記述します。

入力

stdinまたは関数引数を介した2つの有効なセット。入力フォーマットが理由で緩いです。

有効な入力は次のとおりです。

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

無効な入力:

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

出力

入力が等しい場合は真の値、それ以外の場合は偽。

テストケース

あなたの提出物は、テストケースだけでなく、すべての有効な入力に対して正しく答えるべきです。これらはいつでも更新できます。

真実:

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

偽物:

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

得点

追加ルール

順序付けられていない反復可能な型を完全に禁止するルールが追加されました。彼らはあまりにも一般的であり、この挑戦​​をあまりにも些細なことです。これに違反する回答はそのまま残してください。ルール変更前に作成されたことを示してください。


ネスト可能なセット型の言語は、等しいかどうかを確認できますか?
xnor

@xnor Built-insは公正なゲームである必要があります、そうです
Liam

1
@Dennisよく、これは「バランスドストリング」の課題ですが、解析の課題とは考えていません。しかし、今考えてみると、すべての入力が有効であると想定することで、一種の解析課題にしています。だから私はあなたが正しいと思います。十分な言語はおそらく、これを簡単にする無秩序なリストの考えを持っています。
Liam

1
私はあなたがどんな決定をしても大丈夫です。個人的に、私は入力が(少し単純すぎる全部を作るよう何とかセットを使用すると、まだネストされたセットを許可する、(再帰的にネストされたセットにネストされた配列を変換し、私のジュリア答え、など)の挑戦をtrivializingずに創造できることを考えている間==にジュリア、2バイトfrozenset.__eq__、Pythonでは16バイトなど)。
Dennis

8
See the comments for an explanation. これを行わないでください。コメントは揮発性で非常に簡単に消えるので、重要なsutffは投稿の本文に入れられます

回答:




3

Brachylog、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

Mathematica、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表します[[],[[]]]


あなたはそれを匿名にすることができるようにあなたは、再帰を使用しない
バリント

なぜ0+そこにあるのですか?
バリント

バリント@なしているため0++1私は取得したいすべてのコンマです。
Neil

@Bálintを削除するのを忘れた理由がわかりません。f=バイトカウントに含めなかったので、そのためだけに投稿を編集するのは面倒です。
Neil

2

Python 2、49バイト

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

たとえば、無名関数を呼び出しますg

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

g([[],[[],[]],[[],[[]]],[[]],[[[]]]], [[[],[]],[[[]],[]],[[]],[[[]]],[]])はを返しますFalseが、セットは同じです。並べ替える前に、マッピングによって修正する必要があります。
Dennis

2

プロローグ(SWI)、37バイト

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

オンラインでお試しください!

入力をネストされたリスト、つまり中括弧の代わりに角括弧で受け取ります。元々これはでしたがX+Y:-sort(X,M),sort(Y,N),maplist(+,M,N).、それからFatalizeのBrachylog v1の回答を翻訳してみたところ、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.

への引数+は両方とも*既に通過しているため、sortin *を使用するとpermutation、in を使用するよりも7バイト節約できます+

そして最後に、重複した要素を含む可能性のある入力リストを処理するバージョンがあります。これは、最初に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/YXはYのサブセットであることを宣言します。Xのすべての要素に対して、Yの等しい要素があることをX/Y,Y/X宣言するため、XとYが等しいセットであることを宣言します。


そして今、私は睡眠が必要です
関連のない文字列

2

APL(NARS2000)、4バイト

≡⍦

引数をリストで
はなくセットとして扱うように関数を変更するマルチセット演算子です。等価関数は、引数の値と形状が完全に等しいかどうかを示すブール値を返します

追加のルールについて:この回答では、順序付けされていないセットデータタイプは使用せず、通常のリスト(複数の同一の要素が含まれている可能性があります)のみを使用しています。単にそれらをセットとして扱います。

NARS2000はUCS-2のみを使用するため、バイトカウントは4です。



1

SETL、1バイト

=

左右の引数としてセットを取ります。

これは、順序付けされていないセットのデータ型を禁止する追加のルールに準拠していないことに注意してください。


1

Brachylog v2、3バイト

p↰ᵐ

オンラインでお試しください!

1つのセットを入力変数から受け取り、もう1つのセットを出力変数から受け取ります。セットが等しい場合は成功し、等しくない場合は失敗します。

私のメインのPrologの回答と同様に、FatalizeのBrachylog v1の回答の翻訳(これは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

興味津々で、なぜここで独自のリストタイプを定義する必要があったのですか?(ARE ==<リストがデフォルトで定義されていない?)

1
データ型は再帰的ですS。ESの(wrapped-in- L)リストとして定義しますS。Haskellのはなし内蔵されたタイプのリストのリストのリストを表すことができる...
リン・

0

Perl 6、55バイト

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

で入力を受け取ります[]

オンラインでお試しください!


いくつかのこと:コードブロックへの引数の後にスペースは必要ありません。$^代わりに構文を使用する方が短いことがよくあります。また[]、すべてが次のように[[]],[[[]]],[[[[]]]]評価されるため、入力は機能しないと思います[]
Jo King

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.