사전 순으로 정렬 된 일련의 사전-첨부 순열을 생성 n를 정의하십시오 1, 2, …, n. 숫자로 시작하십시오

다음 절차에 의해 생성 될 수있는 숫자의 순열이되도록 접두사 추가 길이 n를 정의하십시오 1, 2, ..., n.

  • 숫자로 시작하십시오 1.

  • 에서 2~ 까지의 각 숫자에 n대해이 숫자를 순서의 시작 또는 끝에 배치하십시오 ( 따라서 순서 이름을 추가 하거나 추가 하십시오).

예를 들어, 이것은 길이가 4 인 접두사 추가 시퀀스를 생성하는 올바른 방법입니다.

1
21     [beginning]
213    [end]
2134   [end]

당신의 작업은 숫자를 취할 것입니다 프로그램이나 기능을 구축하는 것입니다 n에서 330입력으로, 그리고 인쇄하거나 길이의 모든 앞에 추가-APPEND 시퀀스를 반환 n(9)가 표현 될 것 위에 당신이 문자열이 아닌 목록 번호를 출력하는 경우 (사전 편찬 순서로 a-u문자열 길이를 유지하기 위해 문자로 ). 예를 들어, 다음 순서입니다 n = 4.

1234  [RRR]
2134  [LRR]
3124  [RLR]
3214  [LLR]
4123  [RRL]
4213  [LRL]
4312  [RLL]
4321  [LLL]

일반적으로 length의 2 n-1 prepend-addend 순열이 n있습니다.

코드에서 언어에 내장 정렬 기능을 사용할 수 없습니다. 어떤 언어로든 가장 짧은 프로그램이 이깁니다.



답변

CJam, 22 20 19 17 바이트

]]l~{)f+_1fm>|}/p

코드 확장 :

]]                   "Put [[]] onto stack. What we will do with this array of array is";
                     "that in each iteration below, we will first append the next";
                     "number to all present arrays, then copy all the arrays and";
                     "move the last element to first in the copy";
  l~                 "Read input number. Lets call it N";
    {         }/     "Run this code block N times ranging from 0 to N - 1";
     )f+             "Since the number on stack starts from 0, add 1 to it and append";
                     "it to all arrays in the array of array beginning with [[]]";
        _1fm>        "Copy the array of array and move last element from all arrays";
                     "to their beginning";
             |       "Take set union of the two arrays, thus joining them and eliminating";
                     "duplicates. Since we started with and empty array and started adding";
                     "numbers from 1 instead of 2, [1] would have appeared twice if we had";
                     "simply done a concat";
                p    "Print the array of arrays";

작동 방식 :

이것은 코드의 디버그 버전입니다.

]]l~ed{)edf+ed_ed1fm>ed|ed}/edp

입력에서 어떻게 작동하는지 봅시다 3:

[[[]] 3]                                 "]]l~"            "Empty array of array and input";
[[[]] 1]                                 "{)"              "First iteration, increment 0";
[[[1]]]                                  "{)f+"            "Append it to all sub arrays";
[[[1]] [[1]]]                            "{)f+_"           "Copy the final array of array";
[[[1]] [[1]]]                            "{)f+_1fm>"       "shift last element of each";
                                                           "sub array to the beginning";
[[[1]]]                                  "{)f+_1fm>|}"     "Take set based union";
[[[1]] 2]                                "{)"              "2nd iteration. Repeat";
[[[1 2]]]                                "{)f+"
[[[1 2]] [[1 2]]]                        "{)f+_";
[[[1 2]] [[2 1]]]                        "{)f+_1fm>";
[[[1 2] [2 1]]]                          "{)f+_1fm>|}";
[[[1 2] [2 1]] 3]                        "{)";
[[[1 2 3] [2 1 3]]]                      "{)f+"
[[[1 2 3] [2 1 3]] [[1 2 3] [2 1 3]]]    "{)f+_";
[[[1 2 3] [2 1 3]] [[3 1 2] [3 2 1]]]    "{)f+_1fm>";
[[[1 2 3] [2 1 3] [3 1 2] [3 2 1]]]      "{)f+_1fm>|}";
[[[1 2 3] [2 1 3] [3 1 2] [3 2 1]]]      "{)f+_1fm>|}/";

여기에서 온라인으로 사용해보십시오


답변

하스켈, 47 바이트

f 1=[[1]]
f n=(\x->map(++[n])x++map(n:)x)$f$n-1

답변

파이썬 2, 68

f=lambda n:[[1]]*(n<2)or[x*b+[n]+x*-b for b in[1,-1]for x in f(n-1)]

숫자 목록을 출력합니다.

재귀 솔루션. 의 경우 n==1출력 [[1]]. 그렇지 않으면 n모든 (n-1)순열 의 시작 또는 끝에 추가하십시오 . 앞에 추가하면 순열이 추가하는 것보다 사전 식으로 늦게 정렬되므로 순열은 정렬 된 상태로 유지됩니다.

“부울” 은 시작 또는 끝에 b넣을지 여부를 인코딩합니다 [n]. 실제로, 우리는 나머지리스트 x를 expression으로 옮깁니다 x*b+[n]+x*-b. 퍼팅 b으로 -1또는 1곱한 목록 이후, 음 (-)으로 사용 플립을 할 수 있습니다 -1빈 목록입니다.


답변

피 이스, 19

usCm,+dH+HdGr2hQ]]1

여기에서 온라인으로 사용해보십시오

이것은 stdin으로부터 입력을받는 완전한 프로그램입니다.

이것은 xnor의 솔루션과 비슷한 방식으로 작동하지만 순서가 약간 다른 값을 생성하므로 재정렬해야합니다. 각 수준에서 발생하는 것은 이전의 각 값 목록에 새 값이 끝과 시작 부분에 추가되고 각각 값이 2 튜플로 묶여 있고 목록으로 묶여 있다는 것입니다. 예를 들어 첫 번째 단계는 다음을 수행합니다.

[[1]]
[([1,2], [2,1])]

그런 다음이 튜플 목록이 압축 된 다음 가장 바깥 쪽 목록을 제거하기 위해 합산됩니다. 첫 번째 경우에는 목록에 하나의 값만 있기 때문에 위의 래핑되지 않은 값만 제공됩니다.

2-> 3을 보여주는 단계 :

([1,2], [2,1])
[([1,2,3],[3,1,2]),([2,1,3],[3,2,1])]
([1,2,3],[2,1,3],[3,1,2],[3,2,1])

답변

매스 매 티카, 57 54 49 바이트

f@1={{1}};f@n_:=#@n/@f[n-1]&/@Append~Join~Prepend

예:

f[4]

{{1, 2, 3, 4}, {2, 1, 3, 4}, {3, 1, 2, 4}, {3, 2, 1, 4}, {4, 1, 2, 3} , {4, 2, 1, 3}, {4, 3, 1, 2}, {4, 3, 2, 1}}


답변

J, 26 바이트

   0|:<:((,,.,~)1+#)@[&0,.@1:

   (0|:<:((,,.,~)1+#)@[&0,.@1:) 3
1 2 3
2 1 3
3 1 2
3 2 1

FUZxxl 덕분에 1 바이트 개선 .


답변

피스, 34 33 31 29

기본적으로 xnorPython 답변 번역 . 나는 여전히 Pyth를 좋아하지 않으므로 개선 제안을 환영합니다.

y정수 목록을 리턴 하는 함수 를 정의합니다 .

L?]]1<b2smm++*kdb*k_dy-b1,1_1

업데이트 : FryAmTheEggman 덕분에 2 바이트가 절약되었습니다 .

설명:

L                                  define a function y with argument b that returns
 ?*]]1<b2                          [[1]] if b < 2 else
         s                         sum(
          m                        map(lambda d:
           m                       map(lambda k:
            ++*kdb*k_d             k*d + [b] + k*-d
                      y-b1         , y(b - 1))
                          ,1_1)    , (1, -1))