Mathematica, 63 55 Bytes
f=If[#5<1,#+#4,f[#+#2,#3-1,#2,#5-1,#2-1-#4]]&;g=1~f~##&
Dies definiert eine Funktion, gdie wie aufgerufen werden kann
g[5, 5, 1, 3]
Ich benutze einen rekursiven Ansatz. Es werden bis zu 2 (N + M) Iterationen verwendet, je nachdem, wie weit unten in der Spirale das Ergebnis gefunden wird. Es verarbeitet alle Eingaben (bis zu g[10^6,10^6,5^5-1,5^5], was die meisten Iterationen erfordert) innerhalb weniger Sekunden, aber für größere Eingaben müssen Sie das Standard-Iterationslimit wie erhöhen
$IterationLimit = 10000000;
Wenn kdie Startnummer der Spirale ist, überprüfe ich im Grunde, ob der jIndex ist. 0In diesem Fall kann ich einfach zurückkehren k + i. Ansonsten werfe ich die oberste Reihe weg, drehe die Spirale um 90 Grad (gegen den Uhrzeigersinn), erhöhe sie kentsprechend und schaue stattdessen auf die verbleibende Spirale. Wir können mit der folgenden Zuordnung von Parametern zur nächsten Spirale übergehen:
- 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
Dies setzt voraus, dass M die Breite und N die Höhe ist.