Te dan enteros N
y M
, 1 <= N,M <= 10^6
e índices i
y j
. Su trabajo es encontrar el número entero en la posición [i][j]
. La secuencia se ve así (para N=M=5, i=1, j=3
el resultado es 23
):
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
El código más corto gana. ¡Buena suerte!
i=j=0
y continúa enj=0
dirección.Respuestas:
Mathematica,
6355 bytesEsto define una función
g
que se puede llamar comoEstoy usando un enfoque recursivo. Utiliza hasta 2 iteraciones (N + M) , dependiendo de qué tan abajo de la espiral se encuentre el resultado. Maneja todas las entradas (hasta
g[10^6,10^6,5^5-1,5^5]
, lo que requiere la mayoría de las iteraciones) en unos pocos segundos, pero para entradas más grandes, deberá aumentar el límite de iteración predeterminado comoBásicamente, si
k
es el número inicial de la espiral, estoy verificando si elj
índice es0
en cuyo caso puedo regresark + i
. De lo contrario, tiro la fila superior, gire la espiral 90 grados (en sentido antihorario), incremente enk
consecuencia y en su lugar mire la espiral restante. Podemos pasar a la siguiente espiral con la siguiente asignación de parámetros:Esto supone que M es el ancho y N es la altura.
fuente
If[#5<1,#+#4,#0[#+#2,#3-1,#2,#5-1,#2-1-#4]]&[1,##]&
Pyth, 25 bytes
Esto define una función
(
,. Ejemplo de uso:impresiones
23
.Esto es algorítmicamente idéntico a la respuesta de Mathematica de Martin Büttner, aunque se desarrolló de forma independiente. Por lo que puedo decir, esa es la única buena manera de hacerlo.
Tenga en cuenta que Pyth no puede manejar el rango de entrada completo en mi máquina, desbordará la pila y morirá con un segfault en entradas grandes.
fuente
Haskell, 44
esto usa el enfoque recursivo regular
fuente