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é).
la source
(i<n/2||n%2)^i%2?i+1:n-i
.Python2,
10598 octets7 octets économisés grâce au commentaire de @Dennis
Version modifiée 58 octets
Je pensais déjà qu'il devrait être possible de le faire en monoplace, mais la logique était trop complexe pour moi. En voyant la réponse JavaScript de @ user81655 et la notation lambda dans @Dennis Python-answer, j'ai fait un nouvel essai.
La condition est égale à
Malheureusement, tous les efforts de transformation ne permettent d'économiser qu'un
seuloctet par rapport à la traduction directe(i<n/2or n%2)!=i%2
de la logique JavaScript.la source
int()
autour de l'entrée. Vous pouvez également mettre le corps de la boucle for sur la même ligne quefor...
.Python,
5149 octetsMerci à @xnor d'avoir joué au golf sur 2 octets!
Essayez-le sur Ideone .
Comment ça fonctionne
Si i est un nombre dans [0, ..., n - 1] , alors ~ i% n = - (i + 1)% n = - (i + 1) + n = (n - 1) - i , ce qui signifie qu'il mappe 0 à n - 1 , 1 à n - 2 et, en général, le j ème élément de gauche à j ème de droite.
Comme expliqué dans ma réponse Jelly , nous pouvons construire la sortie en jetant un coup d'œil à la valeur inférieure parmi i et ~ i% n , et choisir i s'il est pair et ~ i% n s'il est impair. Nous y parvenons comme suit.
Si le minimum est pair,
min(i,~i%n)%-2
donnera 0 , donc XOR le résultat avec i donnera i , et le calcul de son résidu modulo n retournera i .Si le minimum est impair,
min(i,~i%n)%-2
donnera -1 , donc XOR le résultat avec i donnera ~ i , donc l'expression entière sera évaluée à ~ i% n comme souhaité.la source
(i^min(i,n+~i)%-2)%n
.PHP,
7776515049 octetsUtilise le codage ISO 8859-1.
Assemblage de la première moitié du tableau comme ceci:
N+1-index
(9, 7, 5)1, 9, 3, 7, 5
En ce qui concerne la seconde moitié du tableau, les valeurs les plus externes s'additionnent
N+1
, ce qui signifie que vous pouvez obtenir la valeur droite correspondante d'N-[left value]
où la valeur gauche est déjà connue.Exécutez comme ceci (cela montre également la différence totale au carré) (
-d
ajouté pour l'esthétique uniquement):echo
~ß
pour générer un espace.la source
Python 2, 100
Je sais qu'il y a déjà une réponse en python, mais je pense que je l'ai peut-être fait différemment.
Et en plus pour tester le score total:
la source
def t(x,n):return sum((x[i]-x[i-1])**2for i in range(n))
utilise le bouclage implicite des indices négatifs et enregistre 4 octets. Je sais, ne faisait pas partie de la compétition. ;)CJam,
171514 octetsIl s'agit d'une fonction qui extrait un entier n de la pile et envoie en retour une permutation de [0… n-1] . Le code utilise la même approche que ma réponse Jelly .
Essayez-le en ligne!
Comment ça fonctionne
la source
LISP, 86 octets
Les entrées de la fonction permettent de choisir les valeurs de début (m) et de fin (n) de la séquence.
Pour tester la fonction selon les échantillons fournis, n est fixé à N et m à 1.
Voici le code pour tester la fonction:
Essayez-le sur Ideone !
la source
Julia, 39 octets
Cela imprime une permutation de 1: n . Une permutation de 0: n-1 ne coûte ni ne sauvegarde les octets:
Cette dernière version est un port direct de ma réponse Python .
la source
ES6, 77 octets
Les
i&1
échantillons les chiffres des extrêmes au milieu. Le lesi&2
ajoute au début ou à la fin du résultat par paires.la source
R,
11786 octetsmodifier la version longue du buggy remplacé avec une implémentation de l'algorithme Jelly de @Dennis
la source