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 n
elemento 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 código de golf .
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 .
fuente
jelly.py
y descubrir qué cadenas son compatibles.Japt,
201916 bytes¡Pruébelo en línea!
Basado en la observación de que
O, más bien, que
No sé si esta explicación está en la página OEIS, ya que aún no la he visto.
fuente
Julia, 28 bytes
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 2 ≤ n -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
fuente
CJam, 14 bytes
Usando el enfoque de Alex:
2*(m^2+m+1)-n
dóndem = isqrt(n-1)
.fuente
ES7,
312826 bytesDescubrí 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.
fuente
n=>((m=--n**.5|0)+m*m)*2-n+1
funcionaría, creo.--n
allí ...Pyth, 21 bytes
Pruébalo en línea!
No pasa nada lujoso. El mismo método que en la respuesta JAPT.
fuente
MATL ,
1613 bytesBasado en la respuesta de Lynn CJam .
Pruébalo en línea! (
Y[
ha sido reemplazado por dek
acuerdo con los cambios en el idioma)Esto utiliza un enfoque diferente que otras respuestas ( 16 bytes ):
Genera explícitamente las dos matrices en espiral (en realidad, versiones invertidas verticalmente de ellas, pero eso no afecta la salida). El primero es
y el segundo traza la ruta modificada:
Para encontrar el
n
enésimo número de la secuencia es suficiente encontrarn
en la segunda matriz y elegir el número correspondiente en la primera. Las matrices deben ser lo suficientemente grandes para quen
aparezca, y deben tener un tamaño impar para que el origen (número1
) esté en la misma posición en ambos.¡Pruébalo en línea también! (
6Y3
se ha movido según los cambios en el idioma)fuente
Brachylog , 20 bytes
Esto usa la misma técnica que casi todas las demás respuestas.
Explicación
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.fuente