Considera una permutazione dei valori interi da 1
a N
. Ad esempio questo esempio per N = 4
:
[1, 3, 4, 2]
Noi considereremo questo elenco per essere ciclico, in modo tale che 1
e 2
sono trattati come adiacente. Una quantità che possiamo calcolare per tale elenco è la differenza quadrata totale dei valori adiacenti:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Il tuo compito è trovare una permutazione che massimizzi questa quantità, dato un numero intero positivo N
. Nel caso dell'esempio N = 4
precedente non è ottimale (in realtà, è minimo). Possiamo ottenere una differenza al quadrato totale 18
con la seguente permutazione (così come molte altre):
[1, 4, 2, 3]
L'algoritmo deve essere eseguito in un tempo polinomiale (di N
). In particolare, non puoi semplicemente calcolare la differenza quadrata totale di tutte le permutazioni.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
L'output può essere in qualsiasi elenco o formato stringa conveniente, inequivocabile. È possibile scegliere di restituire un elenco con valori da 0
a N-1
anziché 1
a N
.
Si applicano le regole standard del code-golf .
Dati di test
Esiste una buona soluzione analitica per questo problema. Ad esempio, tutte le soluzioni valide N = 10
sono equivalenti al seguente elenco (fino a turni e inversioni cicliche):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Non voglio rivelare troppo oltre (anche se probabilmente è abbastanza per capire il modello), quindi invece di dare altri esempi, puoi verificare che i tuoi risultati abbiano le seguenti differenze al quadrato totali per un dato 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
Questa è la voce OEIS A064842 (che contiene anche un riferimento a un documento con una soluzione a questa sfida se sei bloccato).
(i<n/2||n%2)^i%2?i+1:n-i
.