Dan tamsayı değerlerinin bir permütasyon düşünün 1
için N
. Örneğin bu örnek N = 4
:
[1, 3, 4, 2]
Bu listeyi döngüsel olarak değerlendireceğiz, öyle ki 1
ve 2
bitişik olarak ele alınacaktır . Böyle bir liste için hesaplayabileceğimiz bir miktar, bitişik değerlerin toplam kare farkıdır:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Göreviniz, pozitif bir tam sayı verildiğinde, bu miktarı en üst düzeye çıkaran bir permütasyon bulmaktır N
. N = 4
Yukarıdaki örnek durumunda, optimal değildir (aslında, minimaldir). 18
Aşağıdaki permütasyon ile (ve diğerleri ile) tam bir kare farkı elde edebiliriz :
[1, 4, 2, 3]
Algoritmanız polinom zamanında (/ N
) çalıştırılmalıdır . Özellikle, tüm permütasyonların toplam kare farkını hesaplayamazsınız.
STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.
Çıktı herhangi bir uygun, açık, düz liste veya dize biçiminde olabilir. Sen değerlerle listesini döndürür seçebilir 0
için N-1
yerine 1
göre N
.
Standart kod golf kuralları geçerlidir.
Test verisi
Bu sorun için güzel bir analitik çözüm var. Örneğin, için geçerli tüm çözümler N = 10
aşağıdaki listeye eşdeğerdir (döngüsel kaymalara ve geri dönüşe kadar):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Bunun ötesinde çok fazla açıklamak istemiyorum (muhtemelen deseni bulmak için yeterli olsa da), bu yüzden daha fazla örnek vermek yerine, sonuçlarınızın belirli bir toplam için aşağıdaki toplam kare farklarına sahip olup olmadığını kontrol edebilirsiniz 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
Bu OEIS girişi A064842'dir (ayrıca sıkışmışsanız bu soruna bir çözüm içeren bir kağıda başvuru içerir).
(i<n/2||n%2)^i%2?i+1:n-i
.