Golf program atau fungsi yang memberikan lokasi rusa kutub yang dimulai pada persegi pada terbatas papan catur yang bernomor dalam spiral persegi anti-searah jarum jam, dimana rusa kutub selalu kunjungan bernomor terendah persegi dia bisa mencapai bahwa dia belum belum dikunjungi.
Inspirasi: The Trapped Knight dan OEIS A316667 .
Sunting: Urutan ini sekarang di OEIS sebagai A323763 .
Kode dapat menghasilkan lokasi ke- , lokasi ke - pertama , atau menghasilkan urutan tanpa input.
Jangan ragu untuk memberikan lokasinya setelah (atau sampai) melompat, tetapi jika demikian tolong sebutkan ini dengan jelas dalam jawaban Anda dan pastikan bahwa input menghasilkan (atau jika sesuai).1
[1]
Ini adalah kode-golf , jadi tujuannya adalah untuk menghasilkan kode kerja dalam sesedikit mungkin byte dalam bahasa yang Anda pilih.
Catatan: rusa kutub menjadi terperangkap (seperti ksatria di lokasi , persegi , dan unta melakukannya di , square ) di lokasi di bujur sangkar . Perilaku kode Anda mungkin tidak ditentukan untuk lebih besar dari ini. (Berkat Deadcode untuk kode C ++ yang menemukan ini!)
Detail
Papan terlihat seperti di bawah ini, dan berlanjut tanpa batas:
101 100 99 98 97 96 95 94 93 92 91
102 65 64 63 62 61 60 59 58 57 90
103 66 37 36 35 34 33 32 31 56 89
104 67 38 17 16 15 14 13 30 55 88
105 68 39 18 5 4 3 12 29 54 87
106 69 40 19 6 1 2 11 28 53 86
107 70 41 20 7 8 9 10 27 52 85
108 71 42 21 22 23 24 25 26 51 84
109 72 43 44 45 46 47 48 49 50 83
110 73 74 75 76 77 78 79 80 81 82
111 112 113 114 115 116 117 118 119 120 121
Sebuah rusa kutub adalah "gnu" peri catur piece - catur sepotong non-standar yang bisa bergerak baik sebagai ksatria (a -leaper) dan sebagai unta (a -leaper).
Karena itu ia dapat pindah ke salah satu lokasi ini dari lokasi awalnya yaitu :
. . . . . . . . . . .
. . . . 35 . 33 . . . .
. . . . 16 . 14 . . . .
. . 39 18 . . . 12 29 . .
. . . . . (1) . . . . .
. . 41 20 . . . 10 27 . .
. . . . 22 . 24 . . . .
. . . . 45 . 47 . . . .
. . . . . . . . . . .
Yang terendah adalah dan dia belum mengunjungi alun-alun itu, jadi adalah istilah kedua dalam urutan.
Selanjutnya dia bisa pindah dari ke salah satu lokasi ini:
. . . . . . . . . . .
. . . . . . 14 . 30 . .
. . . . . . 3 . 29 . .
. . . . 6 1 . . . 53 86
. . . . . . . (10) . . .
. . . . 22 23 . . . 51 84
. . . . . . 47 . 49 . .
. . . . . . 78 . 80 . .
. . . . . . . . . . .
Namun, dia sudah mengunjungi kotak sehingga lokasi ketiganya adalah kotak , terendah yang belum dia kunjungi.
syarat pertama dari jalur rusa kutub adalah:
1, 10, 3, 6, 9, 4, 7, 2, 5, 8, 11, 14, 18, 15, 12, 16, 19, 22, 41, 17, 33, 30, 34, 13, 27, 23, 20, 24, 44, 40, 21, 39, 36, 60, 31, 53, 26, 46, 25, 28, 32, 29, 51, 47, 75, 42, 45, 71, 74, 70, 38, 35, 59, 56, 86, 50, 78, 49, 52, 80, 83, 79, 115, 73, 107, 67, 64, 68, 37, 61, 93, 55, 58, 54, 84, 48, 76, 43, 69, 103, 63, 66, 62, 94, 57, 87, 125, 82, 118, 77, 113, 72, 106, 148, 65, 97, 137, 91, 129, 85
lompatan pertama adalah gerakan ksatria sehingga syarat pertama bertepatan dengan A316667 .
Jawaban:
JavaScript (Node.js) ,
191 ... 166164 byteDisimpan 2 byte berkat @grimy .
Mengembalikan istilah ke-N .
Cobalah online! atau Lihat versi yang diformat
Bagaimana?
Indeks spiral
Untuk mengkonversi koordinat(x,y) ke dalam indeks spiral I , pertama-tama kita menghitung layer L dengan:
Pemberian yang mana:
Kami kemudian menghitung posisiP di layer dengan:
Pemberian yang mana:
Indeks akhirI diberikan oleh:
NB: Formula di atas menghasilkan spiral berindeks 0.
Dalam kode JS, kami sebenarnya menghitung4L2 segera dengan:
Dan kemudian kurangiP dengan:
Bergerak dari rusa kutub
Mengingat posisi saat ini(x,y) , 16 kuadrat target yang mungkin dari rusa kutub diuji dalam urutan berikut:
Kami berjalan melalui mereka dengan menerapkan 16 pasang nilai yang ditandatangani(dx,dy) . Setiap pasangan dikodekan sebagai karakter ASCII tunggal.
Kami melacak nilai minimum yang dijumpai dim dan koordinat sel yang sesuai di (H,V) .
Setelah kandidat terbaik ditemukan, kami menandainya sebagai dikunjungi dengan menetapkan bendera pada objekg , yang juga merupakan fungsi rekursif utama kami.
sumber
Buffer
untuk memaksa setiap karakter untuk ditafsirkan sebagai satu byte?Buffer
konstruktor masih menerima string. Jadi, ya, ini adalah cara yang agak murah untuk mengubahnya ke daftar byte - yang bertentangan[..."string"].map(c=>do_something_with(c.charCodeAt()))
.Kelapa ,
337276 byteMengembalikan nilai generator. Mungkin bisa bermain golf lebih banyak. (Terutama urutan perbedaan tupel.) Algoritma spiral diambil dari jawaban math.se ini .
Cobalah online!
sumber
for a,b in (
->for a,b in(
(mungkin Anda juga bisa bermain golf delta tuple tuple)q
dan zip lebih pendek untuk tupel: 306 byte mungkin masih bisa golf tentu saja0.5
->.5
untuk byte simpan lain;A**2
->A*A
untuk satu lagi.05AB1E ,
7765585752 byte-6 byte terima kasih kepada @Arnauld dengan menggunakan port dari formulanya.
Output yang pertaman + 1 nilai sebagai daftar (desimal).
Cobalah online (catatan
ï
kaki menghapus.0
untuk membuat output lebih kompak, tetapi jangan ragu untuk menghapusnya untuk melihat hasil yang sebenarnya).Penjelasan kode:
Penjelasan umum:
Kami menyimpan semua hasil (dan oleh karena itu nilai yang sudah kami temui) dix , y -Koordinasikan dalam variabel
global_array
, yang awalnya dimulai sebagai[1]
.Kami menahan arus
X
, yang awalnya[0,0]
.Daftar koordinat yang bisa kita jangkau berdasarkan saat inix , y -koordinat adalah:
Daftar yang saya sebutkan dalam penjelasan kode di atas menyimpan nilai-nilai ini yang dapat kita lompati, setelahnya saat inix , y (disimpan dalam variabel
X
) ditambahkan.Maka itu akan menghitung nilai-nilai spiral berdasarkan inix , y -Koordinasi. Itu melakukan ini dengan menggunakan rumus berikut untuk diberikanx , y -koordinat:
Yang merupakan rumus yang sama yang digunakan @Arnauld dalam jawabannya , tetapi ditulis secara berbeda untuk memanfaatkan bawaan 05AB1E untuk double, square, -1, +1, dll.
(Jika Anda ingin melihat bagian spiral dari kode ini dalam aksi: Cobalah secara online .)
Setelah kita mendapatkan semua nilai yang bisa kita raih untuk diberikanx , y -koordinasikan, kami menghapus semua nilai yang sudah ada dalam x , y -Koordinasikan minimum ini.
global_array
, dan kami kemudian mendapatkan minimum dari nilai (yang tersisa).Minimum ini kemudian ditambahkan ke
global_array
, dan variabelX
diganti denganSetelah kami mengulang
input
jumlah kali, program akan menampilkan iniglobal_array
sebagai hasilnya.sumber