辞書順でソートされた順序で、先頭と末尾の順列のセットを生成します


14

次の手順で生成できる番号の順列となるように、長さの前付加シーケンスを定義します。n1, 2, ..., n

  • 番号から始め1ます。

  • 番号ごと2n列(いずれかの最初や最後に、この数場所、先頭に追加または追加して、シーケンスの名前の由来)。

たとえば、これは長さ4のprepend-appendシーケンスを生成する有効な方法です。

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

あなたの仕事は、入力としてnから3を取得するプログラムまたは関数を構築し、辞書式順序30で長さのすべての追加/追加シーケンスを印刷または返す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の前置/後置置換がありますn

コード内の言語で組み込みの並べ替え関数を使用することはできません。任意の言語でこれを行う最短のプログラムが勝ちます。


私は、出力形式の要件、特に文字への変換が好きではありませんa-u。数字のリストだけを出力できますか?
xnor

3
一部の人々は、受け入れられた回答がある場合、質問に回答しない傾向があるため、しばらくしてから回答を受け入れたい場合があります。
オプティマイザー

1
あなたは間違った答えを持っています..
オプティマイザー

2
FryAmTheEggmanは、あなたがあなたのものを編集する21分前に彼の答えを投稿しました。
ジョーZ.

2
@Optimizer私はそれが最も奇妙な方法だとは思いません-FryAmTheEggmanの答えは、あなたの答えが出る21分前に19バイト長でした。これが、最も早く投稿された最短回答になります。
ジョー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

Haskell、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

Python 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)順列の開始または終了に追加します。Prependingを使用すると、順列は辞書式に追加よりも遅くなるため、順列はソートされたままになります。

「ブール」b[n]、先頭に置くか末尾に置くかをエンコードします。実際にはx、式の残りのリストを移動しますx*b+[n]+x*-b。置くbとして、-1または1乗じたリストがあるため、否定することにより、使用フリップをすることができます-1空のリストです。


4

Pyth、19

usCm,+dH+HdGr2hQ]]1

こちらからオンラインでお試しください

これは、stdinから入力を受け取る完全なプログラムです。

これはxnorのソリューションと同様の方法で機能しますが、値の順序が少しずれているため、順序を変更する必要があります。各レベルで起こることは、値の以前の各リストの最後と最初に新しい値が追加され、これらがそれぞれリストで一緒にラップされる2タプルにラップされることです。たとえば、最初のステップはこれを行います:

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

次に、このタプルのリストが圧縮されます(そして、最も外側のリストを削除するために合計されます)。最初のケースでは、リストには値が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

Mathematica、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}}



1

Pyth、 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(ただし、関数を閉じることなく呼び出すことはできませんが、関数を作成するために必要なバイトのみをカウントする必要があるため、単に閉じ括弧を削除することができます)、そしてbリストをintに追加するときにpythがリストに自動的に変換するため、リストをラップする必要はありません。
FryAmTheEggman

2つめのマップを手動で行うことで、数バイトを節約する方法を思いつきました[1,-1]。特にロジックを単純化する場合は、バイトを保存して短いコードをハードコーディングできます。私が得るL?]]1<b2sCm,+db+bdytb
-FryAmTheEggman

@FryAmTheEggman実際にそれを自分の答えとして追加することもできます。それは最高です。
-PurkkaKoodari

OK、投稿する前にCJamを打ち負かしたかったのですが、zipトリックは投稿に値するほど面白いと思います。Pythとの幸運;)
FryAmTheEggman

1

Pure Bash、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

JavaScript(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);
    }
}

ああ、他の答えを見た後、最短の答えについてあなたが何を言っているかわかりました。
ブレットライアン

2
あなたの解決策は立派で、簡潔で、それ自体で十分に提示されていますが、あなたはそれが目前の問題の候補ではないということは正しいです。
ジョーZ.

1
@BrettRyan不要な空白を削除し、1文字の変数名を使用することで、コードを大幅に短縮できます。のfalseようなものに置き換えることもでき5<4ます。
ProgramFOX

1
みんなありがとう。これは、コードチャレンジに参加する最初の試みでした。プログラミングの課題を探していたのですが、ターゲットが最短のソリューションを取得することであることに気づきませんでした。:)私に参加させてくれてありがとう。
ブレットライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.