Séquence de permutation en spirale

17

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 ne é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 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 .

Martin Ender
la source

Réponses:

6

Gelée, 11 10 octets

’ƽð²+ḷ‘Ḥ_

Une autre réponse de Jelly sur mon téléphone.

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

Essayez-le ici .

lirtosiast
la source
Des conseils pour bien démarrer avec Jelly? Je ne peux pas dire comment les fourches / crochets sont analysés.
Lynn
Apprenez d'abord APL ou J. Les chaînes sont en fait plus faciles que les trains car les fonctions ont toutes une arité fixe.
lirtosiast
Je vois. Ouais, j'ai de l'expérience J. Je suppose que je vais essayer de lire jelly.pyet de comprendre quelles chaînes sont prises en charge.
Lynn
2
Comment diable avez-vous tapé ça sur votre téléphone!? C'est plus impressionnant que le code lui-même!
DJMcMayhem
8

Japt, 20 19 16 octets

V=U¬c)²-V *2-U+2

Testez-le en ligne!

Sur la base de l'observation selon laquelle

F (N) = plafond (N ^ 0,5) * (plafond (N ^ 0,5) -1) - N + 2

Ou plutôt que

F (N) = le premier carré supérieur ou égal à N, moins sa racine carrée, moins N, plus 2.

Je ne sais pas si cette explication figure sur la page OEIS, car je ne l'ai pas encore consultée.

ETHproductions
la source
5

Julia, 28 octets

n->2((m=isqrt(n-1))^2+m+1)-n

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 2n -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

Alex A.
la source
4

CJam, 14 octets

qi_(mQ7Ybb2*\-

En utilisant l'approche d'Alex: 2*(m^2+m+1)-nm = isqrt(n-1).

Lynn
la source
2

ES7, 31 28 26 octets

n=>(m=--n**.5|0)*++m*2-~-n

J'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.

Neil
la source
n=>((m=--n**.5|0)+m*m)*2-n+1fonctionnerait, je pense.
ETHproductions
@ETHproductions Merci, je me demandais comment y mettre ça --n...
Neil
@ETHproductions Heh, j'ai réussi à raser 2 octets de votre réponse.
Neil
1

Pyth, 21 octets

K2-h+^.E@QKK^t.E@QKKQ

Essayez-le en ligne!

Rien d'extraordinaire. Même méthode que dans la réponse JAPT.

Denker
la source
1

MATL , 16 13 octets

qX^Y[tQ*Q2*G-

Basé sur la réponse CJam de Lynn .

Essayez-le en ligne! (Y[a été remplacé par enkfonction des changements de langue)

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

Cela utilise une approche différente de celle des autres réponses ( 16 octets ):

6Y3iQG2\+YLt!G=)

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

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

et le second trace le chemin modifié:

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

Pour trouver le n-ième nombre de la séquence, il suffit de trouver ndans la deuxième matrice et de choisir le nombre correspondant dans la première. Les matrices doivent être suffisamment grandes pour que cela napparaisse, et doivent avoir une taille impaire pour que l'origine (nombre 1) soit dans la même position dans les deux.

Essayez-le aussi en ligne ! (6Y3a été déplacé en fonction des changements de langue)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix
Luis Mendo
la source
0

Brachylog , 20 octets

-1$r$[I*I+I+1=*2-?=.

Cela utilise la même technique que pratiquement toutes les autres réponses.

Explication

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

Un fait moyennement intéressant à propos de cette réponse est qu'elle est plus facile et plus courte à utiliser =que les parenthèses.

Fatalize
la source