Dengan dua posisi berbeda pada papan catur dan jenis keping, outputkan jumlah gerakan minimum yang diperlukan untuk keping itu untuk berpindah dari satu posisi ke posisi lain.
Aturan
Bagian yang diberikan bisa berupa Raja, Ratu, Benteng, Ksatria dan Uskup. (Input ini dapat diambil sebagai 5 karakter unik)
2 posisi dapat diambil dalam format apa pun yang nyaman,
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
Jika potongan tidak dapat mencapai di sana, output apa pun selain bilangan bulat positif.
Contohnya
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Jawaban:
JavaScript (Node.js) ,
183180179 byteCobalah online!
Begitu lama untuk kasus tepi, terima kasih Arnauld untuk memeriksa. Tes ksatria
sumber
max
dengan ternary.APL (Dyalog Classic) ,
117107105103989795928987 byteCobalah online!
arg kiri adalah tipe piece: 0 = raja, 1 = ratu, 2 = benteng, 3 = ksatria, 4 = uskup; arg kanan adalah matriks 2x2 dari coords, setiap baris mewakili suatu posisi; mengembalikan 0 untuk tidak terjangkau
|-⌿⍵
menghitung pasangan [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
memilih ekspresi dari daftar "..."; jika suatu fungsi, itu diterapkan ke|-⌿⍵
; jika itu sebuah nilai (ini hanya terjadi untuk seorang ksatria),⊣
pastikan untuk mengembalikannya|-⌿⍵
raja: maks (
⌈/
) dari abs ∆-sratu: hapus angka nol (
~∘0
) dan hitung (≢
) unik (∪
)benteng: jumlah (
+/
) dari signa (monadik×
; 0 untuk 0, 1 untuk positif)ksatria:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- mulai dengan posisi awal dan hitung generasi knight bergerak secara rekursif sampai posisi akhir ada di set; kembalikan kedalaman rekursiuskup: apakah paritas kedua ∆-s sama? (
2=.|⊢
, setara dengan=/2|⊢
), gandakan hasil boolean (0 atau 1) dengan count-unique (≢∘∪
)sumber
⍎⍺⊃
. Sangat pintar.Java (JDK) , 229 byte
Cobalah online!
Penjelasan
Kode:
Kredit
sumber
Arang , 108 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Daftarkan semua 64 kotak papan ke dalam variabel daftar kosong yang telah ditentukan.
Buat daftar daftar yang entri pertamanya adalah daftar yang berisi posisi awal.
Ulangi sampai entri terakhir dari daftar berisi posisi akhir.
Saring semua posisi papan yang merupakan langkah ksatria menjauh dari entri mana pun di entri terakhir daftar daftar dan dorong daftar itu ke daftar daftar. Ini termasuk posisi yang sebelumnya dikunjungi tetapi kami tidak tertarik pada mereka, jadi kami berakhir dengan pencarian papan pertama untuk posisi akhir.
Hitung perbedaan koordinat absolut antara posisi awal dan akhir.
Pilih berdasarkan pada bagian input.
Jika itu raja maka cetak perbedaan koordinat absolut maksimum.
Jika itu ratu, cetak 2 kecuali dua perbedaannya sama atau satu nol.
Jika rook maka cetak 2 kecuali salah satu perbedaannya adalah nol.
Jika itu adalah seorang uskup maka cetaklah 0 jika kuadratnya berseberangan, jika tidak cetaklah 2 kecuali kedua perbedaannya sama.
Jika itu seorang ksatria maka cetak jumlah loop yang diambil untuk menemukan posisi ujung.
sumber
Japt , 67 byte
Cobalah online!
Itu pengalaman yang cukup. Saya mengambil banyak inspirasi dari Jawaban APL yang sangat baik . Saya menduga ada banyak golf masih mungkin terutama dalam kode Knight.
Posisi adalah input pertama, dalam formulir
[[x1,x2],[y1,y2]]
. Seharusnya berfungsi dengan baik[[y1,y2],[x1,x2]]
juga. Pilihan piece adalah input kedua, dengan 0 = raja, 1 = ratu, 2 = ksatria, 3 = benteng, 4 = uskup. Perhatikan bahwa Knight dan Rook ditukar dibandingkan dengan jawaban APL.Penjelasan:
sumber
á
bekerja lebih singkat[[1,2][2,1]]
.á
, bagus!U
tersirat setelahnya@
, sehingga Anda dapat menyimpan dua byte di fungsi knight. Anda juga dapat memulainya dengan@=ã ü;
menyimpan yang lain. (ã
Triknya juga pintar :-))