Secuencia de permutación en espiral


17

Podemos enrollar los números naturales en una espiral rectangular:

 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

Pero ahora que los tenemos en una cuadrícula rectangular, podemos desenrollar la espiral en un orden diferente, por ejemplo, en sentido horario, comenzando hacia el norte:

 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 secuencia resultante es claramente una permutación de los números naturales:

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, ...

Su tarea es calcular esta secuencia. ( OEIS A020703 , pero advertencia de spoiler: contiene otra definición interesante y varias fórmulas que es posible que desee descubrir usted mismo).

Dato curioso: las 8 posibles órdenes de desenrollado tienen su propia entrada OEIS.

El reto

Dado un número entero positivo n, devuelve el nelemento th de la secuencia anterior.

Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out).

Aplican reglas estándar de .

Casos de prueba

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

Para obtener una lista completa hasta e incluyendo n = 11131 ver el archivo b en OEIS .

Respuestas:


6

Jalea, 11 10 bytes

’ƽð²+ḷ‘Ḥ_

Otra respuesta de Jelly en mi teléfono.

’ƽð²+ḷ‘Ḥ_   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.

Pruébalo aquí .


¿Algún consejo para comenzar con Jelly? No puedo decir cómo se analizan los tenedores / ganchos.
Lynn

Aprenda APL o J primero. Las cadenas son en realidad más fáciles que los trenes porque todas las funciones tienen aridad fija.
lirtosiast

Veo. Sí, tengo experiencia J. Supongo que intentaré leer jelly.pyy descubrir qué cadenas son compatibles.
Lynn

2
¿Cómo diablos escribiste eso en tu teléfono? ¡Eso es más impresionante que el código en sí!
DJMcMayhem

8

Japt, 20 19 16 bytes

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

¡Pruébelo en línea!

Basado en la observación de que

F (N) = ceil (N ^ .5) * (ceil (N ^ .5) -1) - N + 2

O, más bien, que

F (N) = el primer cuadrado mayor o igual a N, menos su raíz cuadrada, menos N, más 2.

No sé si esta explicación está en la página OEIS, ya que aún no la he visto.


5

Julia, 28 bytes

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

Esta es una función lambda que acepta un entero y devuelve un entero. Para llamarlo, asígnelo a una variable.

Definimos que m es el número entero más grande de modo que m 2n -1, es decir, la raíz cuadrada entera de n -1 ( isqrt). Entonces podemos simplificar la expresión OEIS 2 ( m + 1) m - n + 2 a simplemente 2 ( m 2 + m + 1) - n .

Pruébalo en línea


4

CJam, 14 bytes

qi_(mQ7Ybb2*\-

Usando el enfoque de Alex: 2*(m^2+m+1)-ndónde m = isqrt(n-1).


2

ES7, 31 28 26 bytes

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

Descubrí independientemente la fórmula de Alex, pero no puedo probarla porque no estaba cerca de una computadora en ese momento.

Editar: Guardado 3 bytes en parte gracias a @ETHproductions. Guardado otros 2 bytes.


n=>((m=--n**.5|0)+m*m)*2-n+1funcionaría, creo.
ETHproductions

@ETHproductions Gracias, me preguntaba cómo conseguir eso --nallí ...
Neil

@ETHproductions Heh, logré eliminar 2 bytes de tu respuesta.
Neil


1

MATL , 16 13 bytes

qX^Y[tQ*Q2*G-

Basado en la respuesta de Lynn CJam .

Pruébalo en línea! (Y[ha sido reemplazado por dekacuerdo con los cambios en el idioma)

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

Esto utiliza un enfoque diferente que otras respuestas ( 16 bytes ):

6Y3iQG2\+YLt!G=)

Genera explícitamente las dos matrices en espiral (en realidad, versiones invertidas verticalmente de ellas, pero eso no afecta la salida). El primero es

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

y el segundo traza la ruta modificada:

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

Para encontrar el nenésimo número de la secuencia es suficiente encontrar nen la segunda matriz y elegir el número correspondiente en la primera. Las matrices deben ser lo suficientemente grandes para que naparezca, y deben tener un tamaño impar para que el origen (número 1) esté en la misma posición en ambos.

¡Pruébalo en línea también! (6Y3se ha movido según los cambios en el idioma)

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

0

Brachylog , 20 bytes

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

Esto usa la misma técnica que casi todas las demás respuestas.

Explicación

-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 hecho medio interesante acerca de esta respuesta es que es más fácil y más corto de usar en =lugar de paréntesis.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.