두 세트가 같습니까?


9

{}빈 세트입니다. 당신이 사용 ()하거나 []선택할 수 있습니다.

"set"을 엄격하게 정의하지는 않겠지 만, 모두 다음 속성을 만족시킵니다.

집합은 일반적인 수학적 구조를 따릅니다. 다음은 몇 가지 중요한 사항입니다.

  • 세트는 주문되지 않습니다.
  • 세트에는 자체가 포함되어 있지 않습니다.
  • 요소가 세트에 있는지 여부에 관계없이 부울입니다. 따라서 세트 요소는 다중성을 가질 수 없습니다 (예 : 요소를 여러 번 설정할 수 없음).
  • 세트의 요소도 세트이며 {}유일한 기본 요소입니다.

직무

두 세트가 같은지 결정하는 프로그램 / 함수를 작성하십시오.

입력

stdin 또는 함수 인수를 통한 두 개의 유효한 세트. 입력 형식이 이유 내에서 느슨합니다.

유효한 입력은 다음과 같습니다.

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

유효하지 않은 입력 :

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

산출

입력 값이 같으면 거짓 값, 그렇지 않으면 거짓 값.

테스트 사례

제출은 테스트 사례뿐만 아니라 모든 유효한 입력에 대해 올바르게 답변해야합니다. 이들은 언제든지 업데이트 될 수 있습니다.

진실한 :

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

거짓 :

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

채점

추가 규칙

정렬되지 않은 반복 가능한 유형을 모두 금지하는 추가 규칙이 추가되었습니다. 그들은 너무 일반적이며이 도전을 너무나 사소하게 만듭니다. 이를 위반하는 답변을 자유롭게 남겨 두십시오. 규칙이 변경되기 전에 답변을 표시하십시오.


중첩 가능한 집합 유형의 언어가 동등성을 검사 할 수 있습니까?
xnor

@xnor 내장은 공정한 게임이어야합니다.
Liam

1
@Dennis는 비록 이것이 "균형 문자열"도전이지만, 나는 그것을 파싱 도전으로 생각하지 않았다. 그러나 이제는 모든 입력이 유효하다고 가정하여 파싱 도전으로 만들었습니다. 그래서 당신이 옳다고 생각합니다. 충분한 언어는 아마도 이것을 사소한 정렬되지 않은 목록에 대한 아이디어를 가지고있을 것입니다.
Liam

1
어떤 결정을 하든지 괜찮을 것입니다. 개인적으로, 세트를 사용하는 것은 도전을 사소하게 만들지 않고도 창의력을 발휘할 수 있다고 생각하지만 (줄리아 응답이 중첩 배열을 반복적으로 중첩 집합으로 변환하는 것과 같이) 입력으로 중첩 집합을 허용하면 전체가 너무 간단합니다 ==. Julia, 2 바이트, frozenset.__eq__Python, 16 바이트 등).
Dennis

8
See the comments for an explanation. 이러지 마십시오. 코멘트는 휘발성이고 매우 쉽게 사라 지므로 중요한 sutff는 포스트 본문에
cat

답변:




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

수학, 16 바이트

Equal@@Sort//@#&

두 세트를 모두 포함하는 목록을 기대하는 이름없는 함수

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

//@( MapAll)를 사용 하여 모든 수준에서 집합을 정렬 한 다음 결과가 같다고 주장합니다.


2

자바 스크립트 (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내가 얻을 것 모두 쉼표입니다.
Neil

@ Bálint 나는을 제거하는 것을 잊어 버린 이유를 모르겠다. 나는 f=바이트 수에 포함시키지 않았고 게시물을 편집하기에는 너무 게으르다.
Neil

2

파이썬 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을 넣으면 in *사용하여 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/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↰ᵐ

온라인으로 사용해보십시오!

하나는 입력 변수를 통해 설정하고 다른 하나는 출력 변수를 통해 설정합니다. 세트가 같으면 성공하고 그렇지 않으면 실패합니다.

내 주요 프롤로그 답변과 마찬가지로 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

하스켈, 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
데이터 유형은 재귀 적입니다 : 나는 es S의 (wrapped-in- L) 목록으로 정의 S합니다. Haskell에는 다음 목록의 목록을 나타낼 수있는 내장 유형이 없습니다.
Lynn

0

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