コードゴルフ最高の順列


14

チャレンジ

整数n≥4が与えられた場合、2つの連続した整数が互いに隣接しないという性質を持つ整数[0、n-1]の順列を出力します。順列の値は、すべてのインデックスのpi合計です。abs(pi[i] - i)i

  • (1, 3, 0, 2) 価値がある 6
  • (0, 2, 4, 1, 3) 価値がある 6
  • (0, 2, 4, 1, 3, 5) 価値がある 6
  • (0, 2, 4, 1, 5, 3, 6) 価値がある 8

回答のスコア

回答のスコアは、順列の値の合計にn = 4 .. 14コードが使用するバイト数を加えたものです。スコアが低いほど優れています。コードは、これらのすべての値に対して有効な出力を提供する必要がありますn

マシン上で提出を完了できる必要があります。

同点の場合、関連するスコアをもたらした最後の編集の時間が決定者になります。

これは同じ問題ではありませんこの1

リンクされた質問への回答は、置換の価値を最適化する努力をしないため、この質問に対して競争力がありません。たとえば、ほとんどの回答で与えられn=10た順列[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]は、の値を与えます30。あなたはそれよりもはるかに良いことができます。

質問の順列部分では、全体として最適な値は最大で120。(@Laikoniに感謝します。)一方、前の質問に対するDennisの答えは222点です。(@ user202729に感謝します。)


4
@JoKingのすべての答えは、変更なしで移植できますが、このチャレンジではひどく悪いスコアになります。このチャレンジでコードを投稿することは、コードレビューからコードゴルフチャレンジにコードを投稿することと同等です。
スチューウィーグリフィン

2
スコア内で異なる量を混ぜることは実際に問題になる可能性があります。最適なアルゴリズムを使用した答えは、通常、どの言語にも移植できます。その場合、スコアリングは通常のコードゴルフに減少します。
アンス

4
最適値は[6,6,6,8,10,12,12,12,14,16,18]120のスコアです。興味深いことに、このパターンはA078706で見つけることができます。
ライコニ

3
[OK]を、それが異なるために開始しますA078706n=17のスコアを持つことができ、20
ライコニ

4
課題を明確かつ明確に理解できます。同意しない場合は、ここにコメントを残してください。
user202729

回答:


7

ゼリー36 34 33 32 31 30バイト、結果:120

-1バイトのデニスに感謝します!(この機能はチャレンジよりも後のものですが、暗黙的にJellyバグを修正することにより)

ðRḟISị“Ƥ¿‘Ʋœ?$;@µ2x5~4¦ṁ_4$Ä’

新機能:累積合計(Ä)。

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

1インデックスを使用します。

線形時間もかかります。


このC ++プログラムは、| i-p i | ≤幅(ここで、幅はすべてのためにハードコードされた定数である)0≤I <nは、およそ時間の複雑さO(幅2 ×2 2×幅 ×n)が(ちょうどであるO(n)の固定用):オンラインそれをお試しください!


どうやって?

  1. 問題を最適に解決しようとするC ++プログラムを作成します。
  2. パターンを観察します。最後の4つの要素を除くすべての要素のシーケンスは、

    0 2 4 1 3 5 7 9 6 8 10 12 14 11 13 15 17 19 16 18 20 22 24 21 23 25 ...
    
  3. シーケンスの増分差を計算します。

    2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2 2 2 -3 2 2
    

    期間5に注意してください。

  4. Jellyの実装:

    • n-4個の最初の要素は、上記のシーケンスから取得されます。O(n)
    • 最後の4つの要素については、24の可能性すべてをブルートフォースしますO(1)

      (注:32バイトバージョンから24の可能性すべてをブルートフォースすることはなくなりました)


ああ、あなたは私に別の接頭辞を付けて行った。鉱山はを開始し0 2 4 1 3 5 8 6、より大きな分岐係数を持ちますが、そのような単純なパターンはありません。
ピーターテイラー

7

CJam(60バイト+ 120 = 180スコア)

{_5/4*8e!961=7_)er<:A\,^e!{A\+}%{2ew::-:z1&!},{_$.-:z1b}$0=}

スコアリングが統合されたオンラインテストスイート

n = 24までの拡張子

解剖

{
  _5/4*        e# Work out how much of the hard-coded prefix to use
  8e!961=7_)er e# Prefix [0 2 4 1 3 5 8 6]
               e# I identified this by brute forcing up to n=10 and looking for patterns
               e# I then used the identified prefix [0 2 4 1] to brute-force further
  <:A          e# Take the desired prefix of the hard-coded array, and store a copy in A
  \,^e!        e# Generate all permutations of the values in [0 .. n-1] which aren't in A
  {A\+}%       e# Prepend A to each of them
  {            e# Filter...
    2ew::-     e#   Take each difference of two consecutive elements
    :z         e#   Find their absolute values
    1&         e#   Test whether 1 is among those absolute values
    !          e#   Reject if it is
  },
  {            e# Sort by...
    _$.-       e#   Take pairwise differences of permutation with the identity
    :z         e#   Absolute values
    1b         e#   Add them (by interpreting in base 1)
  }$
  0=           e# Take the first
}

非常に印象的!私はあなたがそれをどうやってやったかを発見するのを楽しみにしています。
アヌーシュ

最大24まで最適ですか?
アヌーシュ

@Anushおそらく私のプログラムによると。
user202729

@アヌーシュ、私はそれを証明していませんが、可能性が高いと信じています。
ピーターテイラー

あなたのアルゴリズムにはさらに興味があります!
アヌーシュ

6

Haskell、146 + 89スコア+バイト

f i|k<-mod i 4=scanl(+)1$take(i-2-k)(cycle[2,-3,2,3])++[[2],[2,2],[5,-3,2],[5,-3,2,2]]!!k

パターン[1,3,0,2]を繰り返し、最後のmod i 4要素は手動で調整されます。

以前のアルゴリズム(132 + 116):

f i=last$filter(\a->all(`elem`a)[0..i-1]).(!!(i-1)).iterate((\l->map((:l).(+head l))[-3,2,-2,3])=<<)$pure<$>[i-3..i]

長さ±2または±3の正しいジャンプ数をブルートフォースします。正しい数値が含まれている最後の1つを選択し、正常に機能するようで、スコアを実装するよりもはるかに安価です。Tioは最後のスコア(18)の前に時間切れになりました。

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


2

Japt、120 + 20 = 140

(他の課題から私のソリューションの1つをコピーすると、227点が得られます)

o á k_äa d¥1ÃñxÈaYÃg

それを試すか、このバージョンを使用してスコアを確認してください。どちらのバージョンも、9頃ごろごろになるかもしれません。


説明

o                        :Range [0,input)
  á                      :All permutations
    k_      Ã            :Remove sub-arrays that return true
      äa                 :  Get the consecutive absolute differnces
         d¥1             :  Do any equal 1?
               È  Ã      :Pass the integers in each remaining sub-array through a function
                aY       :  Get the absolute difference with the integer's index
              x          :Reduce by addition
             ñ           :Sort the main array by those values
                   ñ     :Return the first sub-array

9
あなたのマシンで提出物を最後まで実行できる必要があります。」質問が投稿されてから2時間で14要素の87E9順列を真剣に処理できましたか?
ピーターテイラー

3
また、JaptはJavascriptに基づいていることを考慮してください。実際に87E9の順列を処理できますか?この質問は、Javascript配列の長さは最大で4E9であると言っています。Japtには関数などが生成されますか?\
user202729

2

ルビー、120スコア+ 112106 91 82バイト

->n{(0...n).map{|a|a+(a+2)%5-([[],[],[0,4,3],[-1,4,4,4],[1,1,6,1]][n%5][a-n]||2)}}

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

シーケンスは基本的に(a-2)+(a+2)%5です。

n mod 5が0または1でない場合、最後の3または4つの要素は異なります。

これはまだ半分ハードコーディングされており、常に最良の解決策を見つけます。おそらくもう少しゴルフができるかもしれませんが、私はアイデアを使い果たしました。


1

JavaScript(Node.js)、148スコア+ 109 73バイト

n=>[...Array(n)].map(_=>l=!m|l>n%5+2&&l>m+2?[+m,m=l+2][0]:l+2,m=n>4,l=~m)

オンラインでお試しください!説明:l最後に生成された番号mを追跡し、反対のパリティの次の番号を追跡しlます; 一度変数lを超えるm+2と交換されます。シーケンスの開始時に調整が行われ、長さが5の倍数ではないシーケンスが番号を逃さないようにし、別の調整が行われn=4ます。

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