Nous pouvons enrouler les nombres naturels dans une spirale rectangulaire:
17--16--15--14--13
| |
18 5---4---3 12
| | | |
19 6 1---2 11
| | |
20 7---8---9--10
|
21--22--23--24--25
Mais maintenant que nous les avons sur une grille rectangulaire, nous pouvons dérouler la spirale dans un ordre différent, par exemple dans le sens horaire, en commençant vers le nord:
17 16--15--14--13
| | |
18 5 4---3 12
| | | | |
19 6 1 2 11
| | | |
20 7---8---9 10
| |
21--22--23--24--25
La séquence résultante est clairement une permutation des nombres naturels:
1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...
Votre tâche consiste à calculer cette séquence. ( OEIS A020703 , mais avertissement de spoiler: il contient une autre définition intéressante et plusieurs formules que vous voudrez peut-être comprendre vous-même.)
Fait amusant: les 8 commandes de déroulement possibles ont leur propre entrée OEIS.
Le défi
Étant donné un entier positif n
, retournez le n
e élément de la séquence ci-dessus.
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).
Les règles de code-golf standard s'appliquent.
Cas de test
1 1
2 4
3 3
4 2
5 9
6 8
7 7
8 6
9 5
100 82
111 111
633 669
1000 986
5000 4942
9802 10000
10000 9802
Pour une liste complète jusqu'à et y compris n = 11131
voir le fichier b sur OEIS .
la source
jelly.py
et de comprendre quelles chaînes sont prises en charge.Japt,
201916 octetsTestez-le en ligne!
Sur la base de l'observation selon laquelle
Ou plutôt que
Je ne sais pas si cette explication figure sur la page OEIS, car je ne l'ai pas encore consultée.
la source
Julia, 28 octets
Il s'agit d'une fonction lambda qui accepte un entier et renvoie un entier. Pour l'appeler, affectez-le à une variable.
Nous définissons m comme étant le plus grand entier tel que m 2 ≤ n -1, c'est-à-dire la racine carrée entière de n -1 (
isqrt
). On peut alors simplifier l'expression OEIS 2 ( m + 1) m - n + 2 jusqu'à simplement 2 ( m 2 + m + 1) - n .Essayez-le en ligne
la source
CJam, 14 octets
En utilisant l'approche d'Alex:
2*(m^2+m+1)-n
oùm = isqrt(n-1)
.la source
ES7,
312826 octetsJ'avais découvert indépendamment la formule d'Alex mais je ne peux pas le prouver parce que je n'étais pas près d'un ordinateur à l'époque.
Edit: enregistré 3 octets en partie grâce à @ETHproductions. Enregistré 2 octets supplémentaires.
la source
n=>((m=--n**.5|0)+m*m)*2-n+1
fonctionnerait, je pense.--n
...Pyth, 21 octets
Essayez-le en ligne!
Rien d'extraordinaire. Même méthode que dans la réponse JAPT.
la source
MATL ,
1613 octetsBasé sur la réponse CJam de Lynn .
Essayez-le en ligne! (
Y[
a été remplacé par enk
fonction des changements de langue)Cela utilise une approche différente de celle des autres réponses ( 16 octets ):
Il génère explicitement les deux matrices spirales (en fait, des versions inversées verticalement, mais cela n'affecte pas la sortie). Le premier est
et le second trace le chemin modifié:
Pour trouver le
n
-ième nombre de la séquence, il suffit de trouvern
dans la deuxième matrice et de choisir le nombre correspondant dans la première. Les matrices doivent être suffisamment grandes pour que celan
apparaisse, et doivent avoir une taille impaire pour que l'origine (nombre1
) soit dans la même position dans les deux.Essayez-le aussi en ligne ! (
6Y3
a été déplacé en fonction des changements de langue)la source
Brachylog , 20 octets
Cela utilise la même technique que pratiquement toutes les autres réponses.
Explication
Un fait moyennement intéressant à propos de cette réponse est qu'elle est plus facile et plus courte à utiliser
=
que les parenthèses.la source