Mathematica, 63 55 bytes
f=If[#5<1,#+#4,f[#+#2,#3-1,#2,#5-1,#2-1-#4]]&;g=1~f~##&
Esto define una función g
que se puede llamar como
g[5, 5, 1, 3]
Estoy 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 como
$IterationLimit = 10000000;
Básicamente, si k
es el número inicial de la espiral, estoy verificando si el j
índice es 0
en cuyo caso puedo regresar k + i
. De lo contrario, tiro la fila superior, gire la espiral 90 grados (en sentido antihorario), incremente en k
consecuencia y en su lugar mire la espiral restante. Podemos pasar a la siguiente espiral con la siguiente asignación de parámetros:
- k n + 1 = k n + m n
- M n + 1 = N n - 1
- N n + 1 = M n
- i n + 1 = j n - 1
- j n + 1 = n m - i n - 1
Esto supone que M es el ancho y N es la altura.