주기적 표기법으로 대칭 그룹 Sn의 "짝수"순열을 인쇄합니다.


9

작업

정의

점 {1,2,3,4,5}와 모든 순열을 고려하십시오. 간단한 요령으로이 5 점의 가능한 순열의 총 수를 찾을 수 있습니다.이 점들로 5 개의 슬롯을 채우는 이미징, 첫 번째 슬롯에는 5 개의 가능한 숫자가 있고, 두 번째에는 4가 있습니다 (하나는 첫 번째 슬롯을 채우는 데 사용됨) 세 번째 3 등. 따라서 순열의 총 개수는 5 * 4 * 3 * 2 * 1입니다. 이것은 5입니다! 순열 또는 120 순열 이것을 대칭 그룹 S5라고 생각하면 대칭 그룹 Sn은 n! or (n*n-1*n-2...*1)순열 을 가질 수 있습니다 .

"짝수"순열은 짝수의 짝수 길이주기가있는 순열입니다. 그것은 예를 들어, 순환 표기법으로 작성하면 이해하기 가장 쉬운 (1 2 3)(4 5)순서를 무작위로 바꾸어 넣 1->2->3->14->5->4하나의 3 길이주기가 (1 2 3)하나 둘 길이주기를 (4 5). 순열을 홀수 또는 짝수로 분류 할 때 홀수 길이주기를 무시하고이 순열 [ (1 2 3)(4 5)]은 짝수 길이주기의 홀수 {1}을 갖기 때문에 홀수 라고 말합니다 . 예를 들면 :

  1. (1)(2 3)(4 5)= 2 개의 2 길이 사이클 | 짝수 |
  2. (1 2 3 4 5)= 짝수 길이주기 | 짝수 | * 짝수 길이주기가 없으면 순열이 균일하다는 점에 유의하십시오.

이상한 예 :

  1. (1 2)(3 4 5)= 하나의 2 길이주기 | 홀수 |
  2. (1)(2 3 4 5)= 하나의 4 길이 사이클 | 홀수 |

대칭 그룹의 순열 중 정확히 절반이 짝수이므로 짝수 그룹을 교대 그룹 N이라고 부를 수 있으므로 S5 = 120 A5 = 60 순열입니다.

표기법

이를 위해서는 최소한 각주기가 다른 괄호 안에 있고 각주기가 오름차순으로 바뀌는 순환 표기법으로 치환을 작성해야합니다. 예를 들어 (1 2 3 4 5)아닙니다 (3 4 5 1 2). 그리고 다음과 같이 단일 숫자가있는 사이클의 (1)(2 3 4)(5)경우 단일 / 고정 점을 제외 할 수 있습니다 (1)(2 3 4)(5) = (2 3 4). 그러나 신원 (모든 지점이 고정 된 지점)은 단지 그것을 나타 내기 위해 (1)(2)(3)(4)(5)작성되어야 ()합니다.

도전

가능한 작은 코드로 양의 정수를 입력 {1,2,3,4 ...}로 가져 와서 교대 그룹 An의 모든 순열을 표시하고 싶습니다. 여기서 n은 입력 / 모든 짝수 Sn의 순열. 예를 들면 다음과 같습니다.

Input = 3
()
(1 2 3)
(1 3 2)

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

그리고 예제에서와 같이 한 길이의 모든 사이클을 없애고 정체성에 관해서는 : 아무것도 출력 ()하지 않고 (대괄호뿐만 아니라 다른 순열을 표시하기 위해 사용하는 모든 것과 함께) id허용됩니다.

독해

자세한 정보는 여기에서 찾을 수 있습니다.

행운을 빕니다

그리고 이것은 codegolf이므로 누구든지 교대 그룹 An의 순열을 가장 짧은 바이트로 인쇄 할 수 있습니다.


2
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 일반적으로, 출력을 유연하게 할 수 있으므로 올바른 형식으로 출력하는 데 문제가있는 언어는 불공평 한 단점이 없습니다. 예를 들어 [[1, 2], [3, 4]]대신에 출력 할 수 (1 2)(3 4)있습니까?
Adnan

@Adnan 예, 분명히해야합니다. 다른주기가 개별적으로 표시되어있는 한이를 나타내는 방법에는 문제가 없습니다.
Harry

" '짝수'순열은 짝수 개의 짝수 순열이있는 순열입니다." 이것은 순환 정의처럼 보입니다. 아마도주기 표기법을 먼저 도입 한 다음 그 문장을 "... 짝수의 짝수주기주기"로 다시 쓰십시오.
마틴 엔더

또한 사이클 (2 3 1 4)을 오름차순으로 어떻게 배치 합니까? 가장 작은 요소를 앞에 놓아야합니까?
마틴 엔더

@MartinEnder 그렇습니다. 가장 작은 요소를 먼저 쓸 수있는 것처럼 가장 작은 요소 (2 3 1 4)가 순서를 어지럽히 지 않는 한 가장 먼저 시작해야합니다.2->3->1->4->2(1 4 2 3)
Harry

답변:


5

Pyth, 26 바이트

t#Mf%+QlT2mcdf<>dTS<dTd.pS

          m            .pSQ   Map over permutations d of [1, …, Q]:
             f        d         Find all indices T in [1, …, Q] such that
               >dT                the last Q-T elements of d
              <   S<dT            is less than the sorted first T elements of d
           cd                   Chop d at those indices
   f                          Filter on results T such that
      Q                         the input number Q
     + lT                       plus the length of T
    %    2                      modulo 2
                                is truthy (1)
t#M                           In each result, remove 0- and 1-cycles.

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

이 솔루션은 한 줄 표기법의 순열과주기 표기법의 순열 사이의 깔끔한 추출을 기반으로합니다. 물론 두 표기법이 동일한 순열을 나타내는 명백한 추론이 있습니다.

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] = (18 8 2 3 3 6) (5 10 7)

그러나 너무 많은 코드가 필요합니다. 대신, 이전의 모든 선행자보다 작은 숫자보다 먼저 한 줄 표기법을 조각으로 자르고이 조각주기를 호출 한 다음 새로운 순열을 만듭니다.

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] ↦ (8) (4 6) (3 10) (15 5 2 7)

이 bijection을 반대로하려면 순환 형태의 순열을 취하고 각주기를 회전하여 가장 작은 숫자가 먼저 나오고 가장 작은 숫자가 내림차순으로 나타나도록 순환을 정렬하고 모든 괄호를 지울 수 있습니다.


OP는 1주기없이 신원 순열을 나타내야합니다. 그렇지 않다면 더 나을 것이라고 생각합니다.
마일

1
Harry는 내 젤리 답변을 좋아하는 것처럼 보였습니다 id. 아마 차임 할 수 있을까?
Lynn

나는 그것이 말한 방식으로 너무 확신하지 못하며, (Lynn 's) 솔루션도 같은 것을 보지 못했습니다.
마일

빈 문자열을 사용하여 신원 순열을 표현할 수 없다는 것을 이해했기 때문에 모든 1주기를 유지하기 위해 내 대답을 수정했습니다 (6 바이트도 편리하게 절약).
Neil

1
더 명확하게 내 질문을 편집했습니다. 답변의 두 번째 부분에서 한 것처럼 "한 번의주기"를 생략하고 싶습니다. 그건 그렇고 잘했습니다.
Harry

6

Mathematica, 84 49 31 바이트

GroupElements@*AlternatingGroup

두 가지 기능의 구성. 을 {Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}나타내는 형식으로 출력합니다 (), (a b), (c d)(e f), ....


3

J , 53 바이트

[:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]

J는 제로 패드 비정형 배열이므로 각 순열의주기는 상자 배열로 표시됩니다.

41 바이트를 사용하여 출력이 완화 된 경우

[:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]

여기서 각 순열에는 1주기와 0주기가 포함될 수 있습니다.

용법

   f =: [:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]
   f 3
┌┬───────┬───────┐
││┌─────┐│┌─────┐│
│││1 2 3│││1 3 2││
││└─────┘│└─────┘│
└┴───────┴───────┘
   f 4
┌┬───────┬───────┬─────────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┬─────────┐
││┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌───┬───┐│
│││2 3 4│││2 4 3│││1 2│3 4│││1 2 3│││1 2 4│││1 3 2│││1 3 4│││1 3│2 4│││1 4 2│││1 4 3│││2 3│1 4││
││└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└───┴───┘│
└┴───────┴───────┴─────────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┴─────────┘

대체 구현의 경우

   f =: [:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]
   f 3
┌─────┬─┬─┐
│1    │2│3│
├─────┼─┼─┤
│1 2 3│ │ │
├─────┼─┼─┤
│1 3 2│ │ │
└─────┴─┴─┘

이것은 실제로 아름답다 ... 잘했다.
Harry

2

젤리 , 34 28 바이트

L€’SḂ
ṙLR$Ṃµ€Ṣ
Œ!ŒṖ€;/Ç€ÑÐḟQ

여기에서 시도하십시오 .

설명

Jelly 프로그램의 각 줄은 기능을 정의합니다. 맨 아래는 " main"입니다.

  • 첫 번째 줄은 사이클 곱이 홀수인지 테스트하는 함수를 정의합니다.

    L€      Length of each
      ’     Add 1 to each length 
       S    Take the sum
        Ḃ   Modulo 2
    
  • 두 번째 줄 [1…n]은 다음과 같이 순환 곱으로 순열의 분할을 정규화 합니다.

         µ€    For each list X in the partition:
    ṙLR$          Rotate X by each element in [1…length(X)].
        Ṃ         Get the lexicographically smallest element.
                  Thus, find the rotation so that the smallest element is in front.
           Ṣ   Sort the cycles in the partition.
    

    (4 3)(2 5 1)를 들어 로 바뀝니다 (1 2 5)(3 4).

주요 프로그램은 다음과 같습니다. n명령 행에서 인수 를 취합니다 .

Œ!              Compute all permutations of [1…n].
  ŒṖ€           Compute all partitions of each permutation.
     ;/         Put them in one big list.
       ǀ       Normalize each of them into a cycle product.
         ÑÐḟ    Reject elements satisfying the top function,
                i.e. keep only even cycle products.
            Q   Remove duplicates.

5를 입력으로 실행하려고 시도했지만 전혀 출력이 없었습니다. 이 스크립트는 그룹 A3 및 A4에만 해당됩니까, 아니면 잠재적으로 그룹을 제공 할 수 있습니까? 나는 젤리를 본 적이 없기 때문에 설명이 도움이 될 것입니다.
Harry

아니요, 지금까지 challange에 3과 4 만 넣었습니다.
Harry

젤리는 실제로 파티션을 위해 내장되어 있습니다. 고맙게도 친구가 생각 나게했습니다. 그래서 지금은 더 효율적 (핸들 N = 5, 야호!)의 짧은을.
Lynn

OP는 1주기를 생략해야한다는 것을 명확히하기 위해 질문을 편집했습니다.
Anders Kaseorg

2

자바 스크립트 (파이어 폭스 30-57) 220 218 212 211 바이트

f=(a,p)=>a[2]?[for(i of a)for(j of f(a.filter(m=>m!=i),p,p^=1))[i,...j]]:[[a[p],a[p^1]]]

안타깝게도 88 바이트 만의 순열 목록으로 교대 군을 생성하기에 충분 a그 다음 날 추가 비용이되도록 132 130 124 원하는 형식으로 출력을 변환하는 123 바이트 :

n=>f([...Array(n).keys()],0).map(a=>a.map((e,i)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&s)

나는 내 ES6 버전 다운 트림 관리했습니다 222 216 215 바이트를 :

n=>(g=(a,p,t=[])=>a[2]?a.map(e=>g(a.filter(m=>m!=e),p,[...t,e],p^=1)):[...t,a[p],a[p^1]].map((e,i,a)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&r.push(s))([...Array(n).keys(r=[])],0)&&r

각 순열과주기가 개별적으로 표시되는 한 형식이 완벽한 순환 표기법이 아닌 경우에는 신경 쓰지 않습니다. [1 2 3] [4 5] 및 << 123> <45 >>와 같이 모두 허용됩니다. ) 및 한 길이의 사이클이 제거됩니다. 아마도 이것은 당신의 대답을 단축시킬 수 있습니다
Harry

@Harry 나는 결코 보여주지 않을 것이다 (1,2,3)(4,5)-그것은 이상한 순열이다! 현재 나는 예를 보여줄 것입니다 (1,2,3)(4)(5)-길이가 1 인 사이클을 제거하면 6 바이트가 소요 될뿐만 아니라 ID 사이클에 대한 빈 결과로 끝나고 다른 4 바이트를 고쳐야합니다.
Neil

당신이 신원에 대해 아무것도 인쇄되지 않았다는 것을 의미한다면, 나는 내가 말한대로 그것을 받아 들일 것입니다 as for the identity outputs of nothing ... are accepatble. 또한 "원시 데이터"를 출력하면 (1,2,3) (4) (5) 또는 다른 형식으로 표시됩니까?
Harry

@Harry 이제 신원에 대한 빈 항목을 포함하여 길이가 1 인 사이클을 제외하고 바이트를 절약 할 수 있습니다!
Neil

@Harry Raw 데이터는 [1, 2, 0, 3, 4]특정 예를위한 것이므로 원하는 곳이 없습니다.
Neil

1

간격 , 32 바이트

카운트를 반으로 줄인 @ChristianSievers에게 감사드립니다.

f:=n->List(AlternatingGroup(n));

프롬프트에서 사용법 :

gap> f(4);
[ (), (1,3,2), (1,2,3), (1,4,3), (2,4,3), (1,3)(2,4), (1,2,4), (1,4)(2,3), (2,3,4), (1,3,4), (1,2)(3,4), (1,4,2) ]

아주 좋은 서식, 나는 GAP 가이 문제에 대답하기에 아주 좋은 선택이라고 생각합니다.
Harry

하나의 순열이 끝나고 다음이 시작되는 위치에 답이 표시되지 않습니다. 함수가 값을 부작용으로 인쇄 할 필요는 없지만 값을 인터프리터가 인쇄 할 목록으로 반환 할 수 있다고 가정하면f:=n->List(AlternatingGroup(n));
Christian Sievers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.