Rozważ permutację wartości całkowitych od 1
do N
. Np. Ten przykład dla N = 4
:
[1, 3, 4, 2]
Będziemy rozważać tę listę być cykliczne, takie, że 1
i 2
są traktowane jako sąsiadujące. Jedną wielkością, którą możemy obliczyć dla takiej listy, jest całkowita kwadratowa różnica sąsiednich wartości:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Twoim zadaniem jest znalezienie permutacji, która maksymalizuje tę ilość, biorąc pod uwagę dodatnią liczbę całkowitą N
. W przypadku N = 4
powyższego przykładu nie jest optymalny (w rzeczywistości jest minimalny). Możemy osiągnąć całkowitą kwadratową różnicę o 18
następującej permutacji (jak również kilku innych):
[1, 4, 2, 3]
Twój algorytm musi działać w czasie wielomianowym (z N
). W szczególności nie można po prostu obliczyć całkowitej kwadratowej różnicy wszystkich permutacji.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Dane wyjściowe mogą być w dowolnym dogodnym, jednoznacznym, płaskim formacie lub w postaci łańcucha. Możesz zwrócić listę z wartościami od 0
do N-1
zamiast 1
do N
.
Obowiązują standardowe zasady gry w golfa .
Dane testowe
Istnieje ładne analityczne rozwiązanie tego problemu. Np. Wszystkie prawidłowe rozwiązania N = 10
są równoważne z następującą listą (do cyklicznych przesunięć i cofnięć):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Nie chcę ujawniać zbyt wiele poza tym (chociaż prawdopodobnie wystarczy, aby wymyślić wzór), więc zamiast podawać więcej przykładów, możesz sprawdzić, czy wyniki mają następujące całkowite kwadratowe różnice dla danej 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
To jest pozycja OEIS A064842 (która również zawiera odniesienie do artykułu zawierającego rozwiązanie tego wyzwania, jeśli utkniesz).
(i<n/2||n%2)^i%2?i+1:n-i
.