Rozważ permutację wartości całkowitych od 1do N. Np. Ten przykład dla N = 4:
[1, 3, 4, 2]
Będziemy rozważać tę listę być cykliczne, takie, że 1i 2są 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 = 4powyższego przykładu nie jest optymalny (w rzeczywistości jest minimalny). Możemy osiągnąć całkowitą kwadratową różnicę o 18nastę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 0do N-1zamiast 1do N.
Obowiązują standardowe zasady gry w golfa .
Dane testowe
Istnieje ładne analityczne rozwiązanie tego problemu. Np. Wszystkie prawidłowe rozwiązania N = 10są 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.