2つの連続した整数が隣接しない順列を与える


18

チャレンジ

整数n≥4の場合、2つの連続する整数(絶対差1の整数)が互いに隣接しないという性質を持つ整数[0、n-1]の順列を出力します。

  • 4[1、3、0、2]
  • 5[0、2、4、1、3]
  • 6[0、2、4、1、3、5]
  • 7[0、2、4、1、5、3、6]

代わりに1インデックスを使用できます([0、n-1]の代わりに整数[1、n]を使用)。

コードはnの多項式時間で実行する必要があるため、すべての順列を試して、それぞれをテストすることはできません。


「順列を出力する」と言うとき、それはリストとしての意味ですか?または、順列マッピング自体を実装する関数を作成できますか?
xnor

@xnor人間が読める形式で出力する必要があります。正確にはどうでもいい。
アヌーシュ

思い[[1,3],[0,2]]許容出力形式も?
シャギー

@Shaggyそれは素晴らしいことではありません。1,3,0,2を意味しますか?
アヌーシュ

回答:


31

ゼリー3 2バイト

ḂÞ

[1、...、n]の整数をLSBでソートします。

オンラインでお試しください!


うわー!すごい。
アヌーシュ

2
「LSBで並べ替え」とは、1つおきに先頭に移動することを意味しますが、ゼリーの定義では、各半分の数字が元の順序のままである必要がありますか?そうでない場合、100(4)は101(5)の隣にある可能性がありますが、それでも「LSBでソート」されます。コードに問題はありませんが、説明コメントは完全ではありませんか?
WGroleau

1
@WGroleauはい、Þ安定したソートです。Python sorted関数を使用して実装されているため、安定していることが保証されています
user202729

3
アルゴリズムは、その賢さの点で、小さいサイズよりも印象的です。また、ビット順序を逆にしたり、ソートしたり、逆にしたりすることもできます。
WGroleau

4
65536個の異なる2バイトのJellyプログラムしか存在できません。それらの多くがppcgの課題に対する答えであることが判明したのは驚くべきことです。
アヌーシュ




6

Haskell、22バイト

fは、適切に順序付けられたリストを返すnの関数です。1-indexingオプションを使用しています。

f n=[2,4..n]++[1,3..n]

6

オクターブ、17バイト

@(x)[2:2:x,1:2:x]

オンラインでお試しください!

これは他の多くと同じアプローチを使用します。2つのベクトルを連結します。1つは包含範囲2 ... xのすべての偶数、1 ... xは包含範囲のすべての奇数です。構文はかなり明白なはずなので、それについては説明しません。


1
32隣同士ではないf(4)ですか?
パジョン

おっと...修正されました。同じバイト数。:-)
Stewie Griffin

5

JavaScript(ES6)、40バイト

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

編集:@Arnauldのおかげで1バイト保存されました。


5

ガイア、2バイト

r∫

オンラインでお試しください!

この単純(安定した)は、の範囲の整数ORTS [1、入力]をそれらのPAによりr個の ITY。


Jellyと同じコメント:アルゴリズムまたは言語の定義は、2つの半分がそれぞれ元の順序のままであることを保証しますか?
WGroleau

@WGroleauはい、ガイアでは、ソートメタ演算子は安定しています。
Mr Xcoder

5

R39 36 35バイト

function(x)c(seq(2,x,2),seq(1,x,2))

オンラインでお試しください!


奇数には末尾のNAがあります。
JayCe


妻のせい。修正する前に自転車に乗らなければなりませんでした。しかし、あなたもいくつかのバイトを削った。
-ngm

ええ、バイトを追加するように頼むのが悪く感じたので、いくつかを削除する方法を見つけなければなりませんでした...それはうまくいきました。
JayCe



4

Japt、4バイト

また、置き換えることができますuv異なる順序を取得します。

õ ñu

それを試してみてください

または、2つの配列の配列を出力できる場合:

õ ó

それを試してみてください


技術的には、2番目のものはコンマで区切られた数値のリストを出力します;-) 4残念ながら両方とも失敗します。またはに変更uして、最初の問題を修正できます。voõ
-ETHproductions

3

Mathematica、50-> 47-> 42バイト

p = Join[Range[2, #, 2], Range[1, #, 2]] &

オンラインでお試しください!

Flatten []の代わりに使用される2つの最適化の潜在的なJoin []を指摘し、純粋な関数を使用してくれたuser202729に感謝します。

2つの発言を追加したいと思います。

1)OPで要求されたn> = 4で、連続した下降または上昇のない特定の順列を構築するのはかなり簡単です。

2つの連続したリストで構成されます。

偶数nの場合:
list1 =(2,4、...、n / 2)
list2 =(1,3、...、n / 2-1)

奇数nの場合:
list1 =(2,4、...、Floor [n / 2])
list2 =(1,3、...、Floor [n / 2])

この「アルゴリズム」については、1つの決定(n偶数または奇数)を行う必要があり、残りはn個の数字を書き留めるだけです。

可能なMathematicaソリューションが上部に提供されています。

2)関連する質問は、nの関数としてそのようなパーミュレーションがいくつ存在するかです。

Mathematica、124バイト

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

オンラインでお試しください!

例:

a[#] & /@ Range[4, 12]

{2、14、90、646、5242、47622、479306、5296790、63779034}

そのような順列の数を数えることは標準的な問題です。

n = 4の場合、2は{{2,4,1,3}、{3,1,4,2}}です。

n = 5の場合、14があります:{{1,3,5,2,4}、{1,4,2,5,3}、{2,4,1,3,5}、{2,4、 1,5,3}、{2,5,3,1,4}、{3,1,4,2,5}、{3,1,5,2,4}、{3,5,1、 4,2}、{3,5,2,4,1}、{4,1,3,5,2}、{4,2,5,1,3}、{4,2,5,3、 1}、{5、2、4、1、3}、{5、3、1、4、2}}

これらの順列の数a(n)は急速に増加します:2、14、90、646、5242、47622、479306、5296790、63779034、...

nが大きい場合、比率a(n)/ n!限界1 / e ^ 2 = 0.135335に近づいているようです。厳密な証拠はありませんが、数値的証拠からの推測にすぎません。オンラインでプログラムを実行して、これをテストできます。

上記のプログラム(下記の参照に基づいて)は、これらの数値を計算します。

OEIS:A002464の関連するシーケンスで詳細を確認できます。Hertzsprungの問題:n X nボード上にn個の非攻撃キングを配置する方法。各行と列に1つずつ。また、連続した上昇または下降を伴わない長さnの順列の数。


@ Stewie Griffin私がここに新しいので、あなたが何を意味するかについてより詳細に説明してください。最初の発言では、多項式時間で問題を解決するアルゴリズムとコードを提供しました。したがって、それは課題の解決策と見なされるべきです。2番目の部分は、興味深い問題を拡張します。したがって、コメントと見なす必要があります。
ヴォルフガングヒンツ博士

Mathematicaコードが最上位になるように、投稿をわずかに変更する自由を取りました。code-golfチャレンジでは、実際のコードを提供する必要があります(最短)。私がそれをフォーマットした方法は、おそらくあなたが意図したとおりのMathematicaの回答になりますが、その下にも元の説明があります。何かが足りないと感じたり、最初の回答を間違って編集した場合は、自分でもう一度編集してください。PPCGへようこそ!:)
ケビンクルーイッセン

@ Kevin Cruijssen温かい歓迎と私の素朴な投稿の編集に感謝します。2番目の発言用にMathematicaプログラムを追加しました。これはおそらく、アルテではありません。何よりも、「オンラインで試す」リンクを作成する方法がわかりません。
ヴォルフガングヒンツ博士

を使用して、任意のリンクを作成できます[some text](the_link)。特に「オンラインで試す」リンクに関しては、独自の@DennisがホストしているWebサイトhttps://tio.run/には、あらゆる種類のプログラミング言語へのリンクが含まれています。Wolfram言語(Mathematica)もその1つです。上部の[再生]ボタンをクリックしてコードを実行するか、ハイパーリンクボタンをクリックして[オンラインで試す]をコピーします。(マークアップ)リンク。また、1つまたは複数のテストケースを(かなり)印刷するためのオプションのヘッダー/フッターを使用して、コードを実際の「コード」(送信)に分割できます。
ケビンクルーッセン

私のやや鈍いコメント、そしてその後の返信の欠如をおApびします!回答はレビューキューに表示されましたが、フォーマットが原因でコードに気付きませんでした。新規ユーザーが実際の回答を提供せずに「興味深い観測」を課題に投稿することは珍しくありません。誠実に行われていますが、サイトの目的ではありません。これはそんな答えだと思いました。コメントに返信する必要がありましたが、急いで新しいコメントを書くことができなかったため、代わりに古いコメントを削除しました。おApび!そして、サイトへようこそ!どうぞよろしくお願いします!:)
スチューイーグリフィン



2

空白、161バイト

コメントなしの公式投稿は次のとおり です。オンラインで試してみてください!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



オンラインでお試しください!

プログラムがエラーなしで実行されるように数バイトを犠牲にしました。約7-8バイトを失う可能性があると信じていますが、それでも正しく出力されますが、エラーメッセージも出力しますが、誰もそれを望んでいません。

フルバイトの説明:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

ゴルフにいくつかのこと:バイトを保存するpush_0, read_STDIN_as_int, push_0, retrieveことができpush_0, duplicate_0, read_STDIN_as_int, retrieveます。また、最初のラベルはのNSSN代わりに空のラベルにすることができますNSSSN(そして、2番目のラベルはNSSSN; third NSSTN;およびfourにすることができますNSSSSN)。これにより、8バイトも節約できます。また、Jump_to_third_labelそのSet_third_labelすぐ下にすでにあるので、最初のものを削除できます。合計:140バイト。(またはコメント付き:オンラインで試してください。)NNNexit を削除する場合は-3バイト。
ケビンクルーイッセン


1

Gol> <>、14バイト

FL:2%Z}:3=?$|B

オンラインでお試しください!

完全なプログラムの例と仕組み

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

Java 8、56バイト

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

@NeilのJavaScript(ES6)回答のポート。

オンラインでお試しください。


古い66バイトの答え:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

オンラインでお試しください。

説明:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.