사전 순으로 정렬 된 일련의 사전-첨부 순열을 생성


14

다음 절차에 의해 생성 될 수있는 숫자의 순열이되도록 접두사 추가 길이 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있습니다.

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


나는 출력 형식 요구 사항, 특히 문자로 변환하는 팬이 아닙니다 a-u. 숫자 목록 만 출력 할 수 있습니까?
xnor

3
어떤 사람들은 대답이 받아 들여질 경우 어떤 질문에 대답하지 않는 경향이 있기 때문에 얼마 후에 대답을 받아들이고 싶을 수도 있습니다.
Optimizer

1
그래서 당신은 오답을 잘못 받아 들였습니다 ..
Optimizer

2
FryAmTheEggman은 21 분 전에 자신의 답변을 게시했습니다.
Joe Z.

2
@Optimizer 나는 그것이 가장 이상한 방법이라고 생각하지 않습니다-FryAmTheEggman의 대답은 21 분 전에 19 바이트였습니다. 그것은 가장 빨리 게시되는 가장 짧은 답변입니다.
Joe Z.

답변:


10

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>|}/";

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


6

하스켈, 47 바이트

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

1
목록 이해로 전환하면 몇 바이트가 절약됩니다 f n=[[n:x,x++[n]]|x<-f$n-1]>>=id(code-golfers concat 함수 사용 >>=id).
nimi

1
@nimi하지만 잘못된 순서로 r
자랑스런 Haskeller

@ proudhaskeller : 오, 사랑하는, 충분히 사양을 읽지 않았다. 나는 그것을 고치려고 노력했고 @alephalpha의 버전과 동일한 길이의 4 가지 약간 다른 방법을 찾았으므로 개선을 제공 할 수 없습니다. f n=[x++[n]|x<-f$n-1]++[n:x|x<-f$n-1], f n=map(++[n])(f$n-1)++[n:x|x<-f$n-1], f n=map(++[n])(f$n-1)++map(n:)(f$n-1),f n=(++[n])#n++(n:)#n;p#i=map p$f$i-1
nimi

5

파이썬 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빈 목록입니다.


4

피 이스, 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])

2

매스 매 티카, 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}}


2

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 바이트 개선 .


대체 ,.하기위한 ,"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))

일부 pyth 물건 : -b1될 수 있습니다 tb, [1_1)할 수 있습니다 ,1_1(그러나 닫지 않고 호출 할 수는 없지만 함수를 만드는 데 필요한 바이트 수만 계산하면 닫는 대괄호를 삭제할 수 있습니다) bpyth는 목록을 int에 추가 할 때 자동으로 목록으로 변환하므로 목록 을 줄 바꿈 할 필요가 없습니다 .
FryAmTheEggman

두 번째 맵을 수동으로 수행하여 몇 바이트를 절약하는 방법을 생각해 냈습니다 [1,-1]. 특히 논리를 단순화 할 때 짧은 것을 하드 코딩하기 위해 바이트를 절약 할 수 있습니다. 나는 얻는다L?]]1<b2sCm,+db+bdytb
FryAmTheEggman

@FryAmTheEggman 실제로 자신의 답변으로 추가하고 싶을 수도 있습니다. 정말 대단합니다.
PurkkaKoodari

좋아, 게시하기 전에 CJam을 이길려고했지만 지퍼 트릭이 게시할만한 가치가 있다고 생각합니다. Pyth와 함께 행운을 빌어 요;)
FryAmTheEggman

1

순수한 배쉬, 103

내가 기대했던 것보다 길다 :

a=1..1
for i in {2..9} {a..u};{
((++c<$1))||break
a={${a// /,}}
a=`eval echo $a$i $i$a`
}
echo ${a%%.*}

1

자바 스크립트 (ES6) 73 80

@Optimizer의 멋진 솔루션의 JavaScript 구현.

재귀 적 (73) :

R=(n,i=1,r=[[1]])=>++i>n?r:r.map(e=>r.push([i,...e])+e.push(i))&&R(n,i,r)

반복 (74) :

F=n=>(i=>{for(r=[[1]];++i<=n;)r.map(e=>r.push([i,...e])+e.push(i))})(1)||r

Firefox / FireBug 콘솔에서 테스트

R(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]]


0

내 Java 솔루션 :

public static void main(String[] args) {
    listPrependAppend(4);
}

private static void listPrependAppend(int n) {
    int total = (int) Math.pow(2, n - 1);
    int ps;
    boolean append;
    String sequence;
    String pattern;

    for (int num = 0; num < total; num++) {
        sequence = "";
        pattern = "";
        append = false;
        ps = num;
        for (int pos = 1; pos < n + 1; pos++) {
            sequence = append ? (pos + sequence) : (sequence + pos);
            append = (ps & 0x01) == 0x01;
            ps = ps >> 1;
            if (pos < n) {
                pattern += append ? "L" : "R";
            }
        }
        System.out.format("%s\t[%s]%n", sequence, pattern);
    }
}

오 Fark, 이제 다른 답변을 본 후 가장 짧은 답변에 대한 의미를 알 수 있습니다.
Brett Ryan

2
귀하의 솔루션은 적절하고 간결하며 잘 표현되어 있지만 현재로서는 문제의 후보가 아니라는 것이 맞습니다.
Joe Z.

1
@BrettRyan 불필요한 공백을 제거하고 하나의 문자 변수 이름을 사용하여 코드를 훨씬 짧게 만들 수 있습니다. false같은 것으로 바꿀 수도 있습니다 5<4.
ProgramFOX

1
고마워 코드 챌린지에 참여하려는 첫 시도였습니다. 나는 단지 몇 가지 프로그래밍 문제를 찾고 있었고 가장 짧은 솔루션을 얻는 것이 목표라는 것을 몰랐습니다. :) 참여해 주셔서 감사합니다.
Brett Ryan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.