Défi
Étant donné un entier n ≥ 4 , émettez une permutation des nombres entiers [0, n-1] avec la propriété qu'aucun deux nombres entiers consécutifs ne sont côte à côte. La valeur d'une permutation pi
est la somme de abs(pi[i] - i)
pour tous les indices i
.
Exemples
(1, 3, 0, 2)
a de la valeur6
(0, 2, 4, 1, 3)
a de la valeur6
(0, 2, 4, 1, 3, 5)
a de la valeur6
(0, 2, 4, 1, 5, 3, 6)
a de la valeur8
Score de votre réponse
Le score de votre réponse est la somme des valeurs de vos permutations pour n = 4 .. 14
plus le nombre d'octets que prend votre code. Plus le score est bas, mieux c'est. Votre code doit fournir une sortie valide pour toutes ces valeurs de n
.
Vous devez pouvoir exécuter votre soumission jusqu'à son terme sur votre machine.
En cas d'égalité, l'heure du dernier montage qui a abouti au score correspondant sera décisive.
N'est-ce pas la même question que celle-ci ?
Les réponses à la question liée ne seront pas compétitives pour cette question car elles ne font aucun effort pour optimiser la valeur d'une permutation. Par exemple pour n=10
, la permutation [1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
donnée par la plupart des réponses donne une valeur de 30
. Vous pouvez faire bien mieux que ça.
Pour la partie permutation de la question, la valeur optimale globale est au maximum 120
. (Merci à @Laikoni.) Alors que la réponse de Dennis à la question précédente obtient 222 . (Merci à @ user202729.)
la source
[6,6,6,8,10,12,12,12,14,16,18]
pour un score de 120. Fait intéressant, ce modèle peut être trouvé dans A078706 .A078706
avecn=17
, ce qui peut avoir un score de20
.Réponses:
Gelée ,
363433323130 octets, résultat: 120Merci à Dennis pour -1 octet! (implicitement en corrigeant un bug Jelly, bien que la fonctionnalité soit postérieure au défi)
Nouvelle fonctionnalité: somme cumulée (
Ä
).Essayez-le en ligne!
Utilisez l'indexation 1.
Prend aussi du temps linéaire.
Ce programme C ++ génère la permutation lexicographiquement la plus petite, en supposant que | i - p i | ≤ largeur (où largeur est une constante codée en dur) pour tout 0 ≤ i <n , avec une complexité temporelle d'environ O (largeur 2 × 2 2 × largeur × n) (qui est juste O (n) pour une largeur fixe ): Essayez-le en ligne !
Comment?
Observez le motif. On note que la séquence de tous les éléments sauf les 4 derniers est un préfixe de
Calcule la différence incrémentielle de la séquence.
Notez la période 5.
L'implémentation de Jelly:
Pour les 4 derniers éléments,
forcez simplement les 24 possibilités. O (1) .(note: je ne force plus brutalement les 24 possibilités de la version 32 octets)
la source
0 2 4 1 3 5 8 6
et a un facteur de ramification plus important mais n'a pas un schéma aussi simple.CJam (60 octets + 120 = score 180)
Suite de tests en ligne avec notation intégrée
Extension jusqu'à n = 24
Dissection
la source
Haskell , 146 + 89 score + octets
Répète le motif [1,3,0,2], les derniers
mod i 4
éléments sont réglés à la main.Algorithme précédent (132 + 116):
Renforce le nombre correct de sauts de longueur ± 2 ou ± 3. Sélectionne le dernier qui contient les bons chiffres, semble fonctionner très bien et est beaucoup moins cher que la mise en œuvre du score. Tio vient de manquer de temps avant le dernier score, qui est de 18.
Essayez-le en ligne!
la source
Japt, 120 + 20 = 140
(Copier une de mes solutions de l'autre défi m'aurait valu 227)
Essayez-le ou utilisez cette version pour vérifier les scores. Les deux versions peuvent commencer à vous craquer vers 9 heures.
Explication
la source
Rubis , 120 points +
112106 9182 octetsEssayez-le en ligne!
La séquence est essentiellement
(a-2)+(a+2)%5
.Si n mod 5 n'est pas 0 ou 1, les 3 ou 4 derniers éléments sont différents.
C'est encore à moitié codé en dur, trouve toujours la meilleure solution, peut-être pourrait-on jouer un peu plus au golf, mais je n'ai plus d'idées.
la source
JavaScript (Node.js) , 148 score +
10973 octetsEssayez-le en ligne! Explication:
l
garde la trace du dernier nombre généré etm
garde la trace du numéro suivant de la parité opposée àl
; une foisl
dépassém+2
les variables sont échangées. Un ajustement est effectué au début de la séquence afin que les séquences dont les longueurs ne sont pas des multiples de 5 ne manquent aucun nombre, et un autre ajustement est effectué pourn=4
.la source