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 .

Martin Ender
fuente

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

lirtosiast
fuente
¿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.

ETHproducciones
fuente
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

Alex A.
fuente
4

CJam, 14 bytes

qi_(mQ7Ybb2*\-

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

Lynn
fuente
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.

Neil
fuente
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

Pyth, 21 bytes

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

Pruébalo en línea!

No pasa nada lujoso. El mismo método que en la respuesta JAPT.

Denker
fuente
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
Luis Mendo
fuente
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.

Fatalizar
fuente