퍼 뮤터 구축


9

이 문제를 해결하기 위해리스트를 입력으로 받아서 해당리스트의 순열을 리턴하는 함수 (함수가 완전한 프로그램 일 수 있음)를 작성하려고합니다. 기능은 다음 요구 사항을 준수해야합니다.

  • 결정적이어야합니다.

  • 함수 자체를 가변 횟수로 구성하면 순열 목록을 얻을 수 있어야합니다.

이것은 코드 골프 질문이므로 바이트 수가 적을수록 답이 바이트로 표시됩니다.

추가 규칙

  • 당신은 목록의 모든 유형, (걸릴 수 있습니다 [Integer], [String], [[Integer]]그것만큼)를

    • 비어 있지 않을 수 있습니다
    • 16 개 이상의 가능한 값을 가진 개별 개체를 포함 할 수 있습니다. (하스켈을 사용할 수 없으며 [()]기능이이라고 주장 할 수 없습니다 id)
    • 중복 객체를 포함 할 수 있음 (세트 없음)
  • 프로그램이나 함수를 작성할 수 있지만 표준 IO를 준수해야합니다.


그러나 S_n주기적입니다n<3
Leaky Nun

@LeakyNun, 대칭 그룹을 생성하는 단일 순열을 요구하지 않습니다 next_permutation. 함수를 요구 합니다.
피터 테일러

0과 1의 목록 만 바꾸는 것으로 충분합니까?
xnor

이 제한의 요점을 잘 모르겠습니다. 부울 목록을 허용하는 경우 두 개의 개별 항목에 대해 반복 가능 항목을 허용하지 않는 점은 무엇입니까?
Dennis

@ 데니스 당신은 좋은 지적을합니다. 부울 목록을 허용하지 않습니다. 또는 가능한 값이 16보다 작은 유형.
Ad Hoc Garf Hunter

답변:


4

CJam (11 바이트)

{_e!_@a#(=}

하나의 중복 요소가있는 4 요소 목록의 전체주기를 보여주는 온라인 데모 .

해부

{      e# Define a block
  _e!  e#   Find all permutations of the input. Note that if there are duplicate
       e#   elements in the input then only distinct permutations are produced.
       e#   Note also that the permutations are always generated in lexicographic
       e#   order, so the order is independent of the input.
  _@a# e#   Find the index of the input in the list
  (=   e#   Decrement and get the corresponding element of the list
       e#   Incrementing would also have worked, but indexing by -1 feels less
       e#   wrong than indexing by the length, and makes this more portable to
       e#   GolfScript if it ever adds a "permutations" built-in
}

2

Mathematica + Combinatorica (내장 패키지) 34 바이트

패키지를로드하려면 19 바이트, 함수는 15 바이트

<<"Combinatorica`";NextPermutation

용법:

%@{c, b, a}

내장되지 않은 61 바이트

Extract[s=Permutations[Sort@#],Mod[s~Position~#+1,Length@s]]&

Combinatorica는 Mathematica에 완전히 통합되어야하지만 NextPermutation 함수가 간과 된 것 같습니다.



2

C ++, 42 바이트

#include <algorithm>
std::next_permutation

이 정확한 연산은 C ++에 내장되어 있습니다.


2
왜 이후 공간 #include?
Yytsi

2

자바 스크립트 (ES6) 145 139 137 134 108 바이트

@Neil 덕분에 무려 25 바이트를 절약했습니다!

알파벳 문자 배열로 입력을받습니다. 다음 순열을 다른 배열로 반환합니다.

a=>(t=x=y=-1,a.map((v,i)=>v<a[i+1]?(t=v,x=i):y=i>x&v>t?i:y),a[x]=a[y],a[y]=t,a.concat(a.splice(x+1).sort()))

어떻게?

이것은 각 반복에서 다음 4 단계를 처리하는 사전 순서대로 생성됩니다 .

  1. a [X] <a [X + 1] 와 같은 가장 큰 지수 X를 구합니다

    a.map((v, i) => v < a[i + 1] ? (t = v, x = i) : ...)
  2. 최대 인덱스 찾기 Y의 보다 큰 X가 되도록 A [Y]>를 [X]

    a.map((v, i) => v < a[i + 1] ? ... : y = i > x & v > t ? i : y)
  3. 가치의 교환 이 [X]를 그와 A [Y]

    a[x] = a[y], a[y] = t
  4. 정렬 순서에서 A [X + 1] 까지와 사전 편찬 식 순서를 오름차순으로, 최종 요소를 포함

    a.concat(a.splice(x + 1).sort())

예:

단계

데모


반전하지 않고 정렬 할 수 없습니까? 또한 v<a[i+1]&&(t=v,x=i)바이트를 절약 한다고 생각 하고 splice두 가지 대신에 더 많은 비용을 절약 할 수 있습니다 slice.
Neil

@Neil Good catch!
Arnauld

나는 map112 바이트를 위해 두 s 를 병합 할 수 있다고 생각 합니다.a=>(t=x=y=-1,a.map((v,i)=>v<a[i+1]?(t=v,x=i):y=i>x&v>t?i:y),a[x]=a[y],a[y]=t,t=a.splice(++x).sort(),a.concat(t))
Neil

나는 a.concat(a.splice(++x).sort())그렇지 않으면 그것을 시도했을 것이라고 생각하지 않았다는 것을 인정 해야합니다 ...
Neil

@ 닐 감사합니다! 업데이트되었습니다. ( concat ()에 t 가 실제로 필요하지 않기 때문에 4 바이트가 더 절약 됩니다.)
Arnauld

1

젤리 , 6 바이트

Œ¿’œ?Ṣ

사전 식 내림차순으로 순열을 순환합니다.

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

작동 원리

Œ¿’œ?Ṣ  Main link. Argument: A (array)

Œ¿      Compute the permutation index n of A, i.e., the index of A in the
        lexicographically sorted list of permutations of A.
  ’     Decrement the index by 1, yielding n-1.
     Ṣ  Sort A.
   œ?   Getthe (n-1)-th permutation of sorted A.

1

C, 161 바이트

실제 O (n) 알고리즘.

#define S(x,y){t=x;x=y;y=t;}
P(a,n,i,j,t)int*a;{for(i=n;--i&&a[i-1]>a[i];);for(j=n;i&&a[--j]<=a[i-1];);if(i)S(a[i-1],a[j])for(j=0;j++<n-i>>1;)S(a[i+j-1],a[n-j])}

사용법 예 :

int main(int argc, char** argv) {
    int i;
    int a[] = {1, 2, 3, 4};

    for (i = 0; i < 25; ++i) {
        printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
        P(a, 4);
    }

    return 0;
}

1

파이썬 2 , 154 바이트

x=input()
try:exec'%s=max(k for k in range(%s,len(x))if x[%s-1]<x[k]);'*2%tuple('i1kjii');x[i-1],x[j]=x[j],x[i-1];x[i:]=x[:i-1:-1]
except:x.sort()
print x

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


나는 이것이 목록을 제자리에 바꾸는 함수로서 더 짧다고 생각한다.
orlp

나는 그것을 시도했지만 exec함수에 모든 종류의 오류
Dennis

0

젤리 , 10 바이트

ṢŒ!Q©i⁸‘ị®

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

정렬> 모든 순열> 입력 찾기> 1 추가> "모든 순열에 인덱스


@PeterTaylor 나는 그것을 고쳤다.
Leaky Nun

순열에 대한 특정 내장이 있습니다 (즉, 할 수 있습니다 Œ¿‘œ?Ṣ). 나는 같은 알고 이후로 도둑질하고 싶지 않았다.
Outgolfer 에릭

@EriktheOutgolfer 중복이 포함 된 입력의 경우 약간 지저분 할 수 있습니다.
Leaky Nun

흠 ... 나는 그렇게 생각합니다. 이전에 작동했던 버전이 있었지만 당신은 그 것을 사용하는 것 같습니다 Q. 당신은 여전히 ​​골프를 할 수 있습니다 ṢŒ!Qµi³‘ị.
Outgolfer Erik


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