Pencarian urutan nomor "Siput"

8

Anda diberi bilangan bulat Ndan M, 1 <= N,M <= 10^6dan indeks idan j. Tugas Anda adalah menemukan bilangan bulat di posisi [i][j]. Urutannya terlihat seperti ini (untuk N=M=5, i=1, j=3hasilnya 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!

pengguna32839
sumber
Sangat terkait erat.
Martin Ender
Dan juga ini.
Martin Ender
1
Anda mungkin ingin mengklarifikasi apakah M adalah lebar atau tinggi.
Martin Ender
@ MartinBüttner: Saya pikir N sesuai dengan i dan M to j. Maka Anda hanya perlu menentukan, bahwa siput mulai i=j=0dan terus ke j=0arah.
M.Herzkamp
6
Apakah kode kami harus diisi dalam jumlah waktu yang wajar dengan jumlah memori yang masuk akal untuk batas yang diberikan? Saya pasti bisa menulis kode yang valid untuk parameter-parameter itu, yang hanya menghasilkan spiral dan mencari nilainya, tetapi saya sebenarnya tidak memiliki memori 4 TB di sekitar.
Martin Ender

Jawaban:

6

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.

Martin Ender
sumber
51 byte:If[#5<1,#+#4,#0[#+#2,#3-1,#2,#5-1,#2-1-#4]]&[1,##]&
LegionMammal978
3

Pyth, 25 byte

D(GHYZ)R?+G(tHGtZt-GY)ZhY

Ini mendefinisikan suatu fungsi (,. Contoh penggunaan:

D(GHYZ)R?+G(tHGtZt-GY)ZhY(5 5 1 3

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.

isaacg
sumber
1

Haskell, 44

z j i m n|j==0=i+1|0<1=z(n-i-1)(j-1)n(m-1)+n

ini menggunakan pendekatan rekursif biasa

haskeller bangga
sumber