Anda diberi bilangan bulat N
dan M
, 1 <= N,M <= 10^6
dan indeks i
dan j
. Tugas Anda adalah menemukan bilangan bulat di posisi [i][j]
. Urutannya terlihat seperti ini (untuk N=M=5, i=1, j=3
hasilnya 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
Kode terpendek menang. Semoga berhasil!
i=j=0
dan terus kej=0
arah.Jawaban:
Mathematica,
6355 byteIni mendefinisikan fungsi
g
yang bisa disebut sepertiSaya 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 sepertiPada dasarnya, jika
k
angka awal dari spiral, saya memeriksa apakahj
indeksnya0
dalam hal ini saya bisa kembalik + i
. Kalau tidak, saya membuang baris paling atas, memutar spiral sebesar 90 derajat (berlawanan arah jarum jam), kenaikank
sesuai, dan melihat spiral yang tersisa sebagai gantinya. Kita dapat pindah ke spiral berikutnya dengan pemetaan parameter berikut:Ini mengasumsikan bahwa M adalah lebar dan N adalah tinggi.
sumber
If[#5<1,#+#4,#0[#+#2,#3-1,#2,#5-1,#2-1-#4]]&[1,##]&
Pyth, 25 byte
Ini mendefinisikan suatu fungsi
(
,. Contoh penggunaan:cetakan
23
.Ini secara algoritmik identik dengan jawaban Mathematica oleh Martin Büttner, meskipun dikembangkan secara independen. Sejauh yang saya tahu, itu satu-satunya cara yang baik untuk melakukannya.
Perhatikan bahwa Pyth tidak dapat menangani rentang input penuh pada mesin saya, itu akan meluap tumpukan dan mati dengan segfault pada input besar.
sumber
Haskell, 44
ini menggunakan pendekatan rekursif biasa
sumber