다양한 차원의 춤


19

도전

n정수형 의 차원 배열과 첫 번째 n자연수 의 순열이 주어지면 그에 따라 배열 차원을 순열하십시오.

세부

이 과제는 MATLAB에서 영감을 얻었습니다 permute. 데모 순열은 정수 목록으로 제공됩니다. 예를 들어 [1,3,2]1은 1에 매핑되고 2는 3에 매핑되고 3은 2에 매핑됩니다 (여기서 i항목은 값 i이 매핑 됨). 그러나 편리한 다른 형식 (예 :주기 또는 함수)을 사용할 수 있습니다. 더 편리한 경우 0 기반 인덱싱을 사용할 수도 있습니다.

배열은 완전한 "직사각형"배열로 가정 할 수 있습니다 m1 x m2 x ... x mn(즉 , 배열이 고르지 않은 것으로 가정 할 수 있습니다 ).

n많은 언어가 중첩 배열의 차원 수를 제한하기 때문에 너무 크지 않다고 가정 할 수 있습니다 .

언어가 다차원 배열을 지원하지 않으면 배열을 입력으로 나타내는 문자열을 사용할 수도 있습니다.

  • n항등 순열 [1,2,3,...,n]이있는 모든 차원 배열 은 변경되지 않습니다.
  • [[10,20,30],[40,50,60]]순열 [2,1]이 있는 배열 이에 매핑됩니다 [[10,40],[20,50],[30,60]].
  • [[[1,2],[3,4]],[[5,6],[7,8]]]순열 [2,3,1]이 있는 배열 이에 매핑됩니다 [[[1,3],[5,7]],[[2,4],[6,8]]].

답변:


13

9

하스켈 , 168 바이트

pInts 의 목록으로 순열을 취하는 (유형 클래스 다형성) 함수이며 s의 다차원 배열을 나타내는 중첩 된 목록 Int입니다.

로 호출 p [2,1] [[10,20,30],[40,50,60]]하지만 형식 기본값이 실패 :: [[Int]]하면 결과 형식을 제공하는 것과 같은 형식 주석을 추가해야 할 수도 있습니다.

import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]

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

정적 입력이 방해되는 경향이 있기 때문에 Haskell에서는 임의의 깊이로 중첩 된 배열을 사용하여 골프 문제를 해결하기가 다소 어색합니다. Haskell 목록 (챌린지 설명과 동일한 구문을 사용)은 잘 중첩 될 수 있지만 중첩 깊이가 다른 목록은 유형이 호환되지 않습니다. 또한 표준 Haskell 구문 분석 함수에는 구문 분석하려는 값의 유형을 알아야합니다.

결과적으로, 프로그램이 상대적으로 장황한 유형 관련 선언을 포함해야하는 것은 불가피합니다. golfed의 경우, I는 입력 클래스 정의에 정착 P같은 p배열의 종류 이상의 다형성 일 수있다.

한편 TIO의 테스트 하네스는 파싱 문제를 해결할 수있는 방법을 보여줍니다.

작동 원리

  • 이 알고리즘의 본질을 요약하면 : 순열 목록에서 버블 정렬을 수행하여 해당 순열 인덱스가 교체 될 때 주변 차원을 바꿉니다.

  • class P a선언에 의해 주어진 바와 같이 , 어떤 경우든지 p순열 (항상 유형 [Int])과 배열 의 두 인수를 취 합니다.

  • 알고리즘이 작동하는 방식이지만 인덱스의 선택은 상대 순서를 제외하고 임의적입니다. (따라서 0과 1 기반 작업입니다.)
  • 밑면 instance P Int은 차원 1의 배열을 처리하며 p, 한 차원은 자신에게만 매핑 될 수 있기 때문에 변경되지 않은 상태로 반환됩니다.
  • 다른 하나 instance P a => P [a]는 차원 n + 1 배열에 대해 차원 n 하위 배열을 정의하기 위해 p차원 n 하위 배열을 호출 하여 재귀 적 으로 정의됩니다 .
    • p(x:r)m첫 번째의 p r모든 요소에서 첫 번째를 재귀 적으로 호출 하여 첫 번째를 제외한 모든 차원이 서로에 대해 올바르게 치환 된 m결과 배열 n을 제공합니다.
    • 에 수행해야하는 나머지 순열 n은에 의해 제공됩니다 x:y:z = x:sort r.
    • 그렇다면 x<y의 첫 번째 차원 n이 이미 올바르게 배치되어 n반환됩니다.
    • 인 경우 함수 x>y의 첫 번째 및 두 번째 차원을 n교체해야 transpose합니다. 마지막으로 p(x:z)결과의 모든 요소에 재귀 적 으로 적용되어 원래의 첫 번째 차원이 올바른 위치로 바뀝니다.

3

파이썬 2 , 312 바이트

순열에 0 인덱싱을 사용합니다.

from numpy import*
from itertools import*
z=range
def f(i,r):
	l=array(i).shape;R={b:a for a,b in enumerate(r)};r=len(r);m=eval('['*r+'0'+q('for k in z(l[R[%s]])]',r-1,-1,-1))
	for d in product(*[z(p) for p in l]):exec'm'+q('[d[R[%s]]]',r)+'=i'+q('[d[%s]]',r)
	return m
q=lambda s,*j:''.join(s%(j)for j in z(*j))

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

@Jonathan Frech 덕분에 -2 바이트.


파이썬 2의 문장이므로 호출하기 위해 괄호가 필요하지 않습니다 exec (2 바이트 절약) .
Jonathan Frech

에 불필요한 공간이 z(p) for있습니다.
Jonathan Frech

1
사용 map(z,l), s%jprint301 바이트 - 온라인으로보십시오!
Mr. Xcoder


2

자바 스크립트 (ES6) 136 132 바이트

(a,p,v=[],r=[],g=(a,[d,...p],_,h=(r,[i,...v])=>1/v[0]?h(r[i]=r[i]||[],v):r[i]=a)=>1/d?a.map((e,i)=>g(e,p,v[d]=i)):h(r,v))=>g(a,p)&&r

인덱스가 0입니다. 설명 : 순열을 사용하여 다시 정렬 된 인덱스 배열을 작성하여 배열 을 g반복적으로 반복 합니다 . 소진 되면 순열 인덱스를 사용하여 요소를 결과 배열에 재귀 적으로 삽입합니다 .avpphr

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