순열의 구성 – 그룹 제품


12

비 연속 사이클 형태로 두 개의 순열이 주어지면 비 연속 사이클 형태로 제품 / 조성물을 출력합니다.

Q · P = (1 5) (2 4) · (12 34) = (1 3 3).

컴포지션을 찾으려면 분리 된주기를 2 줄 표기법의 순열로 변환하십시오. 사이클의 분리 된 부분에있는 각 숫자는 같은 부분에서 그 뒤에 오는 숫자에 매핑됩니다. 그것은 감싸고 있습니다. 그래서 1 -> 5, 5 -> 1, 2 -> 4, 4 -> 2. 숫자를 찾을 수 없으면에 3 -> 3매핑됩니다. 첫 번째 분리 사이클도 기록 될 수 있습니다 (1 5)(2 4)(3). 이러한 매핑은 다음과 같이 두 줄로 변환됩니다 ( PQ 의 순서 는 반대 임).

와우,이 이미지는 방대하다!

두 개의 순열의 곱은 첫 번째 행이 첫 번째 (가장 오른쪽) 순열의 두 번째 행과 동일하도록 두 번째 (가장 왼쪽) 순열의 열을 재 배열하여 구합니다. 그런 다음 수정 된 두 번째 순열의 두 번째 행에 대해 첫 번째 순열의 첫 번째 행으로 곱을 쓸 수 있습니다.

여기에 이미지 설명을 입력하십시오

위키피디아 기사


규칙 :

  • 입력은 목록 또는 유사한 형식의 목록으로 제공됩니다
  • 당신은 할 수 없습니다 같은 걸릴 (1 5)(2 4)등을 [5, 4, 3, 2, 1]두 줄의 형태로 이미, (값 매핑 인덱스)
  • 모든 숫자는 당신이 가진 수 있도록, 각 그룹에서 발생해야 (1 5)·(1 2)결과 (2 5 1).
  • 출력을 입력으로 사용할 수 있어야합니다.
  • 빈 사이클로 입력을 지원할 필요는 없습니다 (1 5)·(). 대신 (1 5)·(1)또는 이와 동등한 것으로 제공됩니다 .
  • 주기가 줄 바꿈되므로 결과가 올바른 한 순서는 중요하지 않습니다.
  • 0에서 시작하거나 1에서 시작할 수 있습니다. 결과는 동일하기 때문에 중요하지 않습니다.
  • 숫자가보다 클 수 있습니다 9.
  • 출력에 같은 숫자를 두 번 이상 포함 할 수 없습니다. 따라서 [[1],[1]]허용되지 않습니다.
  • 이 작업은 정식아닙니다 ! 나는 위키피디아가 한 일이기 때문에 Q를 P 앞에 뒀다. 주문을 선택할 수 있지만 다른 주문을 지정할 수 있습니다.
  • 최단 코드 승리
  • 내장 기능은 허용되지만 사용하는 경우 솔루션을 사용하지 않고 솔루션을 표시하십시오.

예 :

모든 동등한 출력 가능성이 표시되는 것은 아닙니다

Input
Output

[[1, 5], [2, 4]], [[1, 2, 4, 3]]
[[1, 4, 3, 5]] (or [[4, 3, 5, 1]] or ...)

[[1, 5]], [[1, 2]]
[[2, 5, 1]]

[[10, 2, 3]], [[2]]
[[3, 10, 2]]

[[1]], [[3]]
[[]] (or [[1]] or something equivalent)

[[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]], [[5,6,7,9,14],[2,8,3,10],[1,11]]
[[12, 14, 6, 1], [8, 15, 10, 3, 2], [13, 11, 7, 9, 4]]

(arguments in reverse order from above gives a different answer)
[[5,6,7,9,14],[2,8,3,10],[1,11]], [[10,2,3,15],[1,7],[5,6],[14,4,13,11,12]]
[[9, 14, 4, 13, 1], [10, 8, 3, 15, 2], [7, 11, 12, 5]]

나를 위해, 다음은 순열 하지 순열 그룹 . 순열 그룹은이 구성 연산에서 닫히고 여러 순열의 모음입니다.
Greg Martin

@GregMartin 고정 용어
mbomb007

답변:


2

출력을 입력으로 사용할 수 있어야합니다.
mbomb007

@ mbomb007 출력을 입력으로 사용할 수 있습니다. 각 사이클 목록은 0- 인덱싱 된 박스형 배열 배열이어야합니다.
마일

아니면이 J의 기본 인쇄 동작입니까? 함수를 연결할 수 있는지 확인하고 싶습니다.
mbomb007

@ mbomb007 그렇습니다. 시각적 인 표현입니다. 0 인덱싱되어야하지만 1 인덱싱으로 나열하고 함수에 전달할 변수에 저장하기 전에 0 인덱싱으로 변환했습니다. 그런 다음 출력하기 전에 0 인덱스에서 1 인덱스로 다시 변환합니다.
마일

3

Mathematica, 15 바이트

##⊙Cycles@{}&

네 버지니아, 내장이 있습니다 .... Mathematica는 이미 분리 된 사이클 표기법으로 치환 데이터 유형을 지원합니다.이 순수한 함수는 여러 인수를 형식 Cycles[{{1, 5}, {2, 4}}]으로 입력하고 제품 순열을 다시 형식 으로 출력합니다 Cycles[]. 예를 들어 OP와 반대 순서 규칙을 사용합니다.

##⊙Cycles@{}&[Cycles[{{1, 2, 4, 3}}], Cycles[{{1, 5}, {2, 4}}]]

을 반환합니다 Cycles[{{1, 4, 3, 5}}]. 내가 위에서 사용 된 기호는 정말 티카의 일에 3 바이트 개인 사용 유니 코드 기호 U + F3DE해야한다. Mathematica는이 작업을 위해 내장 된 이름을 가지고 PermutationProduct있지만 3 바이트 더 깁니다.


3

하스켈 , 157 바이트

편집하다:

  • -9 바이트 : 실제로 더 많은 골프를 쳤다. 주변의 괄호를 제거했습니다 p++q. 의 인수 순서를 바꿨습니다 g. 당함 제거 d시작하여 iterate함께 p x후, takeWhile더 이상 묶여 없습니다 fst+ span. 고정했다 iterate.

늦었을 때 이렇게하면 ... 골프를 더 할 수있을 것입니다.

더 간단하고 허용 된 것처럼 보였으므로 출력에는 단일 요소 사이클이 포함됩니다.

q#p=g(p++q>>=id)$f q.f p
f p a=last$a:[y|c<-p,(x,y)<-zip(0:c)(c++c),x==a]
g(x:l)p|c<-x:fst(span(/=x)$p`iterate`p x)=c:g[x|x<-l,x`notElem`c]p
g[]p=[]

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

작동 방식 :

  • #주요 기능입니다. q#p숫자 목록 두 목록을 가져와 비슷한 목록을 반환합니다. 테스트는 P 앞에 Q가있는 것처럼 보이므로 동일한 순서를 사용했습니다.
  • f p순열 변환 p함수에 이산 사이클 폼을 한 후 f qf p통상의 조성물 연산자로 구성 될 수있다. .
    • 목록 이해는주기를 반복 하여 후속 작업을 c검색 a하고 찾습니다. 이해가 아무것도 발견하지 않으면 a방금 반환됩니다.
    • zip(0:c)(c++c)요소 c와 그 후속 요소 쌍의 목록입니다 . 질문은 "하나에서 시작"할 수있게 0하므로 더미 값으로 사용할 수 있습니다 . 두 번째 zip에 사용 tail하는 것보다 첫 번째 주장 에 덧붙이는 것이 더 저렴합니다 .
  • g l pl요소 목록 과 순열 함수를 취하고 요소를 p터치하는주기 목록을 리턴합니다.
    • 다음 cx목록 의 첫 번째 요소 를 포함하는주기 이며, 다른 요소는 까지 발견 될 때까지 c반복하여 발견됩니다. 나머지주기를 찾기 위해 되풀이 할 때, 모든 요소가 목록 이해와 함께 먼저 제거됩니다.p xxc

결과를 계산할 때 순서가 중요하다는 점에 주목 해 주셔서 감사합니다. 예를 추가하거나 이에 대한 의견을 잊어 버렸습니다. 그것은 수정되었습니다.
mbomb007

1

파이썬, 220 바이트

a,b=eval(input())
p,o=a+b,[]
for i in range(1,1+max(map(max,p))):
 if not any(i in t for t in o):
  u,m=(i,),i
  while 1:
   for t in p[::-1]:
    if m in t:m=t[(t.index(m)+1)%len(t)]
   if m==i:o+=[u];break
   u+=(m,)
o

2
사이트에 오신 것을 환영합니다. 나는 당신이 이것을 줄일 수있는 몇 가지 방법을 봅니다. python에 대한 팁 페이지를 확인 하십시오 .
Ad Hoc Garf Hunter

0

파이썬 3.8 , 187 바이트

q,p=eval(input())
g=lambda p,i:[*(c[c.index(i)-1]for c in p if i in c),i][0]
h=lambda*c:(x:=g(p,g(q,c[0])))in c and(*c[(m:=c.index(min(c))):],*c[:m])or h(x,*c)
exit({*map(h,sum(p|q,()))})

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

입력 : q그리고 p그 순서대로, 각각은에서 튜플 세트입니다 STDIN.
출력 : Q·P튜플 세트로 곱한 순열 STDERR입니다.

설명

이 함수 gi순열에서 숫자에 매핑되는 숫자를 찾습니다 p(일명는 g의 역 순열입니다 p).

g=lambda p,i:        
[                   # creates a list
  *(                # containing the following
    c[c.index(i)-1] #   the number before i in cycle c
    for c in p      #   for all cycles in permutation
    if i in c       #   if i is in that cycle
  )                 #
  ,i                # adds i to the end of that list
                    #   (in case i is not in any cycle)
][0]                # returns the first element of the list

이 함수 h는 숫자 Q·P를 받아서 해당 숫자가 포함 된 주기를 반환합니다 . 리턴 된주기는 가장 작은 요소가 인덱스 0이되도록 형식화 된 튜플입니다.

h=lambda*c:                   # input: an incomplete cycle c, as a list
(x:=g(p,g(q,c[0])))           # finds the number x before the first number in c
in c                          # if x is also in c (aka the cycle is complete)
and                           # then returns the following:
(                             #   c as a tuple with min element at index 0
  *c[(m:=c.index(min(c))):],  #   (c, from the min element to the end)
  *c[:m]                      #   (c, from start to the min element)
)
or                            # else (cycle is incomplete) returns the following
h(x,*c)                       #   recursive result when after prepending x to c

h모든 숫자에 적용 하면에서 모든주기를 얻을 수 있습니다 Q·P. 결과에서 중복 사이클을 방지하기 위해 모든 사이클을 세트에 넣습니다. 이것은 반환 된 비슷한 사이클 h이 동일한 튜플로 포맷 되기 때문에 작동합니다 (인덱스 0에서 가장 작은 요소 포함). 다른 모든 숫자가 자신에게 매핑되므로 또는에
표시되는 숫자 만 고려하면됩니다 .PQ

exit(              # returns through STDERR
  {                # create a set from the followings
    *map(h,        #   map function h to
      sum(p|q,())  #   all numbers in P or Q
    )
  }
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.