Considérons une permutation des valeurs entières de 1
à N
. Par exemple, cet exemple pour N = 4
:
[1, 3, 4, 2]
Nous considérerons cette liste comme cyclique, de sorte que 1
et 2
seront traités comme adjacents. Une quantité que nous pouvons calculer pour une telle liste est la différence quadratique totale des valeurs adjacentes:
(1-3)² + (3-4)² + (4-2)² + (2-1)² = 10
Votre tâche consiste à trouver une permutation qui maximise cette quantité, étant donné un entier positif N
. Dans le cas de N = 4
l'exemple ci-dessus, ce n'est pas optimal (en fait, c'est minime). Nous pouvons obtenir une différence quadratique totale de 18
avec la permutation suivante (ainsi que plusieurs autres):
[1, 4, 2, 3]
Votre algorithme doit s'exécuter en temps polynomial (of N
). En particulier, vous ne pouvez pas simplement calculer la différence quadratique totale de toutes les permutations.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
La sortie peut être dans n'importe quel format de liste plate ou de chaîne pratique et sans ambiguïté. Vous pouvez choisir de renvoyer une liste avec des valeurs de 0
à N-1
au lieu de 1
à N
.
Les règles de code-golf standard s'appliquent.
Données de test
Il existe une bonne solution analytique pour ce problème. Par exemple, toutes les solutions valides pour N = 10
sont équivalentes à la liste suivante (jusqu'aux décalages cycliques et inversions):
[7, 5, 6, 4, 8, 2, 10, 1, 9, 3]
Je ne veux pas en révéler trop au-delà (bien que cela soit probablement suffisant pour comprendre le modèle), donc au lieu de donner plus d'exemples, vous pouvez vérifier que vos résultats ont les différences quadratiques totales suivantes pour une donnée 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
Il s'agit de l'entrée OEIS A064842 (qui contient également une référence à un document avec une solution à ce défi si vous êtes bloqué).
(i<n/2||n%2)^i%2?i+1:n-i
.