Mathematica, 63 55 byte
f=If[#5<1,#+#4,f[#+#2,#3-1,#2,#5-1,#2-1-#4]]&;g=1~f~##&
Ini mendefinisikan fungsi gyang bisa disebut seperti
g[5, 5, 1, 3]
Saya menggunakan pendekatan rekursif. Ia menggunakan hingga 2 (N + M) iterasi, tergantung pada seberapa jauh spiral ditemukan. Itu menangani semua input (hingga g[10^6,10^6,5^5-1,5^5], yang membutuhkan iterasi paling banyak) dalam beberapa detik, tetapi untuk input yang lebih besar, Anda harus meningkatkan batas iterasi default seperti
$IterationLimit = 10000000;
Pada dasarnya, jika kangka awal dari spiral, saya memeriksa apakahj indeksnya 0dalam hal ini saya bisa kembali k + i. Kalau tidak, saya membuang baris paling atas, memutar spiral sebesar 90 derajat (berlawanan arah jarum jam), kenaikan ksesuai, dan melihat spiral yang tersisa sebagai gantinya. Kita dapat pindah ke spiral berikutnya dengan pemetaan parameter berikut:
- k n + 1 = k n + m n
- M. n + 1 = N n - 1
- N n + 1 = M n
- saya n + 1 = j n - 1
- j n + 1 = n m - i n - 1
Ini mengasumsikan bahwa M adalah lebar dan N adalah tinggi.