활용 순열


17

크기 n 의 순열은 첫 번째 n 양의 정수 의 재정렬입니다 . (각 정수는 정확히 한 번 나타납니다). 순열은 크기가 n 인 항목 목록의 순서를 변경하는 함수처럼 취급 될 수 있습니다 . 예를 들어

(4 1 2 3) ["a", "b", "c", "d"] = ["d", "a", "b", "c"]

따라서 순열은 함수와 같이 구성 될 수 있습니다.

(4 1 2 3)(2 1 3 4) = (4 2 1 3)

이것은 많은 흥미로운 속성을 제공합니다. 오늘 우리는에 초점을 맞추고있다 conjugacy . 순열 YX (사이즈 모두 N 순열 IFF에있다)이다 접합체 gg -1 (같은 크기의 N 해당) 등

x = gyg-1

GG는 -1 식별 순열 (제 같다 N 개의 적절한 순서 번호).

당신의 임무는 표준 입력 방법을 통해 같은 크기의 두 순열을 취하고 그것이 공액인지 여부를 결정하는 것입니다. 두 개의 일관된 값 중 하나를 공액 인 경우 하나, 그렇지 않은 경우 다른 값을 출력해야합니다.

이것은 이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

당신의 처분에 따라 켤레 순열에 대한 많은 이론이 있으므로 행운과 행복한 골프.

위와 같은 순열을 나타내는 순서화 된 값의 컨테이너 (1-n 또는 0-n) 또는 입력 된 컨테이너를 가져와 순열을 수행하는 함수로 입력을 취할 수 있습니다. 기능을 선택하면 사전 정의 된 이름이 아닌 인수로 사용해야합니다.

테스트 사례

(1) (1) -> True
(1 2) (2 1) -> False
(2 1) (2 1) -> True
(4 1 3 2) (4 2 1 3) -> True
(3 2 1 4) (4 3 2 1) -> False 
(2 1 3 4 5 7 6) (1 3 2 5 4 6 7) -> True

입력을 함수로 취할 수 있습니까? 우리는 또한 크기 n을 취할 수 있습니까?
xnor

@xnor 두 가지 모두 확실합니다. 그래도 첫 번째 도움이 될지 잘 모르겠습니다.
Post Rock Garf Hunter

기본 함수 입력 규칙을 사용하면 함수를 미리 정의한 것으로 가정하여 허용되는 경우 바이트를 인수로 쓰면 바이트가 절약됩니다.
xnor

@xnor 이 규칙 에 대해 이야기하고 있습니까? 그것은 순열이 아닌 블랙 박스 함수를위한 것입니다. 합의는 함수 포인터 / 객체가없는 언어가 경쟁 할 수 있도록 설계되었지만 순열은 다르게 표현 될 수 있기 때문에 가능합니다.
Post Rock Garf Hunter

나는 그것들이 블랙 박스라고 생각하지 않았다. 여기서 입력은 함수 일 수 있지만 명시적인 인수로만 사용할 수 있습니까?
xnor

답변:


6

파이썬 2 , 87 바이트

f=lambda P,k:k<1or len({sum([x==eval('L['*k+'x'+']'*k)for x in L])for L in P})&f(P,k-1)

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

P순열과 k길이 의 쌍으로 입력을 받습니다. 1컨쥬 게이트에 대한 출력 및 0아닙니다.

결과를 사용합니다.

k 번째 거듭 제곱 x ky k0 에서 n 사이의 모든 k에 대해 동일한 수의 고정 점을 갖는 경우 두 순열 xy 는 켤레 입니다.

두 번째 켤레 순열은 k 번째 거듭 제곱도 켤레이므로 고정 점의 개수를 유지합니다.

두 개의 비공 액 순열이 항상 다르다는 것은 분명하지 않습니다. 특히, 공액은 정렬 된 사이클 길이리스트에 의해 결정되며, 이들은 고정 된 포인트 수로부터 회복 될 수있다. 이것을 보여주는 한 가지 방법은 선형 대수를 사용하는 것이지만 과잉 일 수 있습니다.

Xx에 대한 순열 행렬 이라고하자 . 그리고, x k 의 고정 점의 수 는 Tr (X k ) 입니다. 이 트레이스는 다중성을 갖는 X k 고유 값의 거듭 제곱 대칭 다항식 입니다 . 이러한 다항식 K 에서 0 으로 , n은 우리가 대응 복구 할 초등학교 대칭 다항식 이 고유의를, 따라서 다항식 특성과 고유 스스로 그렇게.

이 고유 값은 x 의 사이클에 해당하는 단일의 근본이므로 사이클 크기와 다중도를 복구 할 수 있습니다. 따라서 "서명"은 활용까지의 순열을 식별합니다.


6

J , 25 바이트 23 바이트 16 바이트

마일의 암묵적 솔루션 :

-:&([:/:~#&>)&C.

OP의 명시 적 솔루션 :

c=:4 :'-://:~"1#&>C.&>x;y'   

내장 C.함수를 사용하여 사이클 표현을 생성 하여 순열 x와 y가 동일한 사이클 유형인지 확인합니다 .

   4 1 3 2   c   4 2 1 3
1
   3 2 1 4   c   4 3 2 1
0
   2 1 3 4 5 7 6   c   1 3 2 5 4 6 7
1

1
PPCG와 멋진 첫 게시물에 오신 것을 환영합니다. -:&([:/:~#&>)&C.암묵적 인 양식을 사용하여 메소드를 16 바이트 로 줄였습니다. 다음은 TIO 링크입니다.
마일

감사합니다. :) 나는 여전히 J 초보자이며, 명시 적 형식으로 쉽게 사용하는 것처럼 보이지만 효율적인 암묵적 형식을 작성하려면 여전히 많은 생각이 필요합니다. 솔루션을 추가하겠습니다.
Mathias Dolidon

추신 : 함수 할당의 문자도 계산하지 않습니까? c=:
Mathias Dolidon

1
@MathiasDolidon 아니요, 기본적으로 합의에 따라 함수를 그대로 사용할 수 있기 때문에 할당에 필요한 문자를 계산하지 않습니다 (괄호와 함께 사용하지만 계산하지는 않음).
Outgolfer Erik

1
확인 ! 제목의 명시 적 솔루션에 대한 카운트를 소급하여 업데이트했습니다.
Mathias Dolidon

4

MATL , 20 19 17 16 바이트

xY@!"&G@)@b)X=va

입력 : 두 개의 열 벡터 ( ;구분자로 사용). 출력 : 1켤레 인 0경우 그렇지 않은 경우.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

사용 된 순열에 대한 이론은 없다 (무지한). 그냥 무력과이 두 가지 사실 :

  • 두 개의 순열 pq 의 경우 조성 pqp 를 사용하여 q 의 요소를 인덱싱하는 것과 같습니다 .

  • 조건 x = gyg -1xg = gy 와 같습니다 .

주석이 달린 코드 :

x      % Implicitly input first permutation, x. Delete it. Gets copied into clipboard G
Y@     % Implicitly input second permutation, y. Push a matrix with all permutations
       % of its elements, each permutation on a different row. So each matrix row is
       % a permutation of [1 2 ...n], where n is the size of y
!      % Transpose. Now each permutation is a column
"      % For each column
  &G   %   Push x, then y
  @    %   Push current column. This is a candidate g permutation
  )    %   Reference indexing. This gives g composed with y
  @    %   Push current column again
  b    %   Bubble up. Moves x to the top of the stack
  )    %   Reference indexing. This gives x composed with g
  X=   %   Are they equal as vectors? Gives true or false
  v    %   Concatenate stack so far. The stack contains the latest true/false result
       %   and possibly the accumulated result from previous iterations
  a    %   Any: gives true if any element is true. This is the "accumulating" function
       % Implicit end. Implicit display


2

젤리 , 11 바이트

Œ!©Ụ€ịị"®⁸e

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

작동 원리

Œ!©Ụ€ịị"®⁸e  Main link. Left argument: x. Right argument: y

Œ!©          Take all permutations g of x. Copy the result to the register.
   Ụ€        Grade up each; sort the indices of each permutation g by their
             corresponding values. For permutations of [1, ..., n], grading up
             essentially computes the inverse, g⁻¹.
     ị       Let each g⁻¹ index into y, computing g⁻¹y.
      ị"®    Let the results index into the corresponding g, computing g⁻¹yg.
         ⁸e  Test if x occurs in the result.

내가 이해하는 한, 실제로 다른 y인덱스가 g⁻¹아닌 각 인덱스에 인덱스가 있습니다. 예를 참조하십시오 (4 1 2 3)(2 1 3 4) = (4 2 1 3). 접근 방식을 사용 (1 4 2 3)하면 두 번째 인덱스가 첫 번째 인덱스이기 때문에 대신 결과가 발생 합니다. 그것을 고려할 때, 나는 아직 망치지 않을 12 바이트 솔루션을 가지고 있습니다. :-)
Outgolfer Erik 11

@EriktheOutgolfer가 수정되었습니다.
Dennis

@Dennis 그러나 설명을 기반으로 결론에 도달하지 못했지만 Œ!©Ụ€⁹ịЀ®ị"⁸e주요 수정을 한 후에 더 짧아지는 것을 제외하고는 (거의 인수가있는 모든 색인화)와 같은 것을 가지고 있다는 것을 제외하고는 똑같은 접근법에 도달했습니다 . 나는 g⁻¹yg같은 생각하지 않습니다 gyg⁻¹. 또한 귀하의 답변이 이러한 수정으로도 혜택을 얻을 수 있다고 생각하지만 이전에 말했듯이 아직 재미를 망치고 싶지 않습니다.
Outgolfer Erik

예, 정확히 동일합니다. 경우 x = g⁻¹yg, 다음 gxg⁻¹ = y, 그렇게 x하고 y접합체이다.
Dennis

흠, 12 바이트 솔루션을 공개해야한다고 생각합니다.eŒ!ị"Ụị@¥€¥¥
Outgolfer Erik 14

1

껍질 , 9 바이트

¤¦ṠmöLU¡!

1공액 및 비공 액에 0대해 리턴 합니다 . 온라인으로 사용해보십시오!

설명

순열의 켤레 류 PL은 = [1,2, ..., N] 에서 각 숫자의 최소 기간 함유 MULTISET 의해 결정되는 L 이하 P를 . 때 P가 리스트 형식에서 가져온 것입니다, 나는 대체 할 수있는 L을 함께 P 와 같은 MULTISET를 얻을. 프로그램은 각 입력에 대해 해당하는 다중 집합을 계산하고 하나가 다른 하나의 하위 집합인지 확인합니다. 그것들은 같은 수의 요소를 가지고 있기 때문에 이것은 동일한 다중 집합과 같습니다.

¤¦ṠmöLU¡!  Implicit inputs: two lists of integers.
¤          Apply one function to both and combine with another function.
  ṠmöLU¡!  First function. Argument: a list P.
  Ṡm       Map this function over P:
       ¡!  iterate indexing into P,
      U    take longest prefix with unique elements,
    öL     take its length.
 ¦         Combining function: is the first list a subset of the other, counting multiplicities?

1

펄, 61 58 57 바이트

포함 +2을 위해ap

STDIN에서 0 기반 순열을 2 행으로 제공

perl -ap '$_=[@1]~~[@1=map{-grep$_-$G[$i++%@G],@F=@G[@F]}@G=@F,0]'
3 0 2 1
3 1 0 2
^D

알고리즘은 xnor의 솔루션 에서 약간의 변형입니다.

이 코드의 이전 버전은 perl 버그에 부딪 히고 최신 perl 5.26.1에서 여러 입력에 대해 코어를 덤프 하지만 이전 perl에서는 작동합니다 5.16.3.

@{$.}=map{-grep$_==$F[$i++%@F],@G=@F[@G]}@G=@F,0}{$_=@1~~@2

아마도 내 오래된 perlgolf 적의 또 다른 예일 것입니다. perl이 스택을 제대로 다시 계산하지 않는다는 사실입니다.


1

자바 스크립트 (ES6), 66 64 바이트

(a,b,g=a=>b+a.map(h=(e,i)=>e-i&&1+h(a[e],i)).sort())=>g(a)==g(b)

다른 답변을 올바르게 읽으면 문제는 모든 요소의 기간을 계산하고 두 목록의 각 기간이 동일한 지 확인하는 것과 같습니다. 편집 : @Arnauld 덕분에 마침표보다 1을 적게 계산하여 1 바이트를 절약했습니다. @Arnauld 덕분에 JavaScript의 이상한 강제 규칙을 남용하여 배열을 비교하여 다른 바이트를 절약했습니다. 카레로 다른 바이트를 절약 할 수는 있지만 치킨 티카 마살라가 아니라면 카레를 좋아하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.