整数値の順列を検討1
するがN
。たとえば、次の例N = 4
:
[1, 3, 4, 2]
このリストは循環的である1
と見なし、そのように、および2
隣接として扱われます。そのようなリストについて計算できる1つの量は、隣接する値の差の2乗の合計です。
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
あなたの仕事は、正の整数を与えられて、この量を最大にする順列を見つけることN
です。N = 4
上記の例の場合、最適ではありません(実際、最小限です)。18
次の順列(および他のいくつかの順列)の合計平方差を達成できます。
[1, 4, 2, 3]
アルゴリズムは(のN
)多項式時間で実行する必要があります。特に、すべての順列の差の合計を単純に計算することはできません。
プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。
出力は、任意の便利で明確なフラットリストまたは文字列形式にすることができます。0
toのN-1
代わりに1
toの値を持つリストを返すことを選択できますN
。
標準のコードゴルフ規則が適用されます。
テストデータ
この問題に対する優れた分析ソリューションがあります。たとえば、すべての有効なソリューションN = 10
は次のリストと同等です(巡回シフトおよび反転まで)。
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
私は(それがパターンを把握する、おそらく十分ですが)それを超えてあまりにも明らかにし、その代わりに任意のより多くの例を与える、あなたは結果が与えられたため、次の総乗違いがあることを確認することができますしたくありませんN
。
N Total squared difference
1 0
2 2
3 6
4 18
5 36
6 66
7 106
8 162
9 232
10 322
33 11936
100 333202
333 12308236
1000 333332002
これはOEISエントリA064842です(立ち往生している場合、この課題に対する解決策を含む論文への参照も含まれています)。
(i<n/2||n%2)^i%2?i+1:n-i
。