다음 절차에 의해 생성 될 수있는 숫자의 순열이되도록 접두사 추가 길이 n
를 정의하십시오 1, 2, ..., n
.
-
숫자로 시작하십시오
1
. -
에서
2
~ 까지의 각 숫자에n
대해이 숫자를 순서의 시작 또는 끝에 배치하십시오 ( 따라서 순서 이름을 추가 하거나 추가 하십시오).
예를 들어, 이것은 길이가 4 인 접두사 추가 시퀀스를 생성하는 올바른 방법입니다.
1
21 [beginning]
213 [end]
2134 [end]
당신의 작업은 숫자를 취할 것입니다 프로그램이나 기능을 구축하는 것입니다 n
에서 3
에 30
입력으로, 그리고 인쇄하거나 길이의 모든 앞에 추가-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
기본적으로 xnor 의 Python 답변 번역 . 나는 여전히 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))