Di kerajaan yang jauh, seorang ratu catur berjalan-jalan setiap hari melintasi jalan spiral, dinomori dari 1 hingga n
, tidak peduli untuk mengikuti spiral itu sendiri, tetapi hanya membuat gerakan ratu seperti yang ia lakukan di papan catur. Sang ratu dicintai oleh rakyatnya, dan mereka membuat catatan setiap kotak yang dia kunjungi di jalannya. Mengingat bahwa sang ratu dapat memulai perjalanannya di alun-alun mana saja dan mengakhirinya di alun-alun mana saja, apa jalan ratu terpendek yang bisa dia ambil?
Tantangan
Diberikan spiral bilangan bulat pada kotak persegi panjang, tulis fungsi yang mengembalikan salah satu jalur terpendek yang mungkin (dihitung berdasarkan jumlah sel yang ditempuh) antara dua angka pada grid spiral ini menggunakan gerakan ratu catur.
Misalnya, dari 16
ke 25
:
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
Beberapa jalur yang mungkin termasuk 16, 4, 2, 10, 25
dan 16, 5, 1, 9, 25
.
Aturan
- Input akan berupa dua bilangan bulat positif.
- Outputnya akan berupa jalur bilangan bulat (termasuk kedua titik akhir) melintasi spiral hanya menggunakan gerakan ortogonal dan diagonal.
- Panjang jalan dihitung oleh jumlah sel yang ditempuh.
- Jawaban Anda mungkin sebuah program atau fungsi.
- Ini adalah kode golf, sehingga jumlah byte terkecil menang.
Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!
Uji kasus
>>> queen_spiral(4, 5)
4, 5
>>> queen_spiral(13, 20)
13, 3, 1, 7, 20
>>> queen_spiral(14, 14)
14
>>> queen_spiral(10, 3)
10, 11, 3
>>> queen_spiral(16, 25)
16, 4, 2, 10, 25
>>> queen_spiral(80, 1)
80, 48, 24, 8, 1
sumber
Jawaban:
APL (Dyalog Unicode) ,
5957 byte SBCSCobalah online!
-2 byte terima kasih kepada @ngn.
Fungsi anonim yang menerima dua titik akhir sebagai argumen kiri dan kanan.
Tidak dikelompokkan & cara kerjanya
Sang ratu bergerak secara diagonal terlebih dahulu, sehingga cukup untuk melakukan pra-perhitungan koordinat setiap angka hingga
max(start,end)
.Algoritma penghasil koordinat terinspirasi dari beberapa jawaban pada tantangan terkait , tetapi sedikit berbeda dari salah satu jawaban yang ada:
r=1 2 3 4 5 6 7 8 9 10
n=1 1 2 2 3 3 4 4 5 5
r
olehn
.1 2 3 3 4 4 5 5 5 6 6 6 7 7 7 7 8 8 8 8 9 9 9 9 9 10 10 10 10 10
Kemudian, setelah vektor koordinat
v
siap, kita dapat dengan mudah mengkonversi antara indeks spiral dan koordinat menggunakanv[i]
danv⍳coord
(menemukan indeks pertamacoord
inv
).sumber
(⍵⊃v)-⍺⊃v
->⊃⍵⍺-.⊃⊂
(⍺⌷v)
->v[⍺]
Mathematica
615530 byteIni membangun kisi angka, mengubahnya menjadi grafik, dan kemudian menemukan jalur terpendek antara dua angka yang dimasukkan.
Tidak disatukan
numberSpiral
adalah dari Mathworld Prime Spiral . Ini menciptakan n oleh n Ulam Spiral (tanpa menyoroti bilangan prima).findPath
mengubah grid angka menjadi grafik. Tepi adalah gerakan ratu yang valid pada kisi angka.Contohnya
{4,5}
{13,3,1,7,22}
{16,4,1,9,25}
Jalur terpendek dari 80 ke 1 berisi 5, bukan 6, simpul.
{80, 48, 24, 8, 1}
Golf
sumber
Scala (830 bytes)
Membangun spiral dalam array 2D persegi menggunakan empat fungsi rekursif yang saling menguntungkan. Pencarian rekursif lain untuk membangun daftar jalur.
Tidak disatukan
sumber
Ruby,
262218216 byteIni adalah port jawaban Python saya . Saran bermain golf diterima.
Edit: 45 byte berkat Yordania dan saran mereka
d=[0]*n=m*m;*e=c=0;*t=a
,.rect
,0<=>x
danx,y=(e[a]-g=e[b]).rect; t<<d[(g.real+x)*m+g.imag+y]
. Byte lain dari(x+y*1i)
ke(x+y.i)
.Tidak Disatukan:
sumber
q=
dari jawaban Anda karena Anda tidak menghitung byte-nya.c=0;e=[c];t=[a]
dapat disingkat menjadi*e=c=0;*t=a
. Anda dapat menggantiz=e[a]-e[b];x,y=z.real,z.imag
denganx,y=(e[a]-e[b]).rect
danx+=x<0?1:x>0?-1:0
denganx+=0<=>x
(sama untuky
). Saya pikir itu akan turun ke 229 byte.d
dengand=[0]*m*m
, lalu gantid[c.real][c.imag]
dengand[c.real*m+c.imag]
dand[e[b].real+x][e[b].imag+y]
dengand[(e[b].real+x)*m+e[b].imag+y]
.t<<d[(e[b].real+x)*m+e[b].imag+y]
dapat disingkat menjadiu,v=e[b].rect;t<<d[(u+x)*m+v+y]
.d=[0]*m*m
ked=[0]*n=m*m
dan(m*m).times
ken.times
. Itu 219.x,y=(e[a]-e[b]).rect
kex,y=(e[a]-g=e[b]).rect
, menghapusu,v=e[b].rect
dan mengubaht<<d[(u+x)*m+v+y]
ket<<d[(g.real+x)*g.imag+v+y]
(pada dasarnya mengembalikan saya kedua-untuk-terakhir komentar).Python 3, 316 byte
Jawaban ini melihat koordinat dari
a
danb
pada spiral (menggunakan bilangan kompleks) dan menambahkan gerakan diagonal terlebih dahulu, kemudian bergerak ortogonal.Tidak Disatukan:
sumber