Bisakah raja menangkap pion?

26

Diberikan input dari empat bilangan bulat x 1 , y 1 , x 2 , dan y 2 , menghasilkan apakah raja putih dalam catur (dengan koordinat ( x 1 , y 1 )) dapat menangkap pion hitam (dengan koordinat ( x 2 , y 2 )) dan tangkap jika pion bergerak untuk mempromosikan ke ratu secepat mungkin.

Koordinat dewan adalah sebagai berikut:

       first coordinate (x)
             12345678

           1 .#.#.#.#
           2 #.#.#.#.
           3 .#.#.#.#
  second   4 #.#.#.#.
coordinate 5 .#.#.#.#
    (y)    6 #.#.#.#.
           7 .#.#.#.#
           8 #.#.#.#.

Anggaplah putih untuk bergerak (giliran raja) dan kedua pemain bermain secara optimal (raja akan bergerak secepat mungkin untuk menangkap pion, dan pion akan bergerak secepat mungkin untuk mempromosikan). Koordinat input akan selalu berbeda, dan pion tidak akan pernah mulai dengan koordinat y dari 8.

Raja bergerak satu bujur sangkar ke arah mana saja setiap belokan (ia dapat bergerak secara diagonal), dan pion hanya dapat memindahkan satu ruang ke depan (mengurangi koordinat y-nya), kecuali jika itu pada posisi awalnya (dengan sistem koordinat kami, koordinat y dari 7), dalam hal ini dapat memindahkan dua ruang ke depan.

Input dapat diberikan sebagai string whitespace- / dipisahkan koma, array string / integer, atau empat fungsi / baris perintah / argumen dll. Koordinat dapat diberikan dalam urutan mana yang paling nyaman / golf (jadi, menerima input sebagai [y 2 , y 1 , x 1 , y 2 ] boleh saja asalkan konsisten). Outputnya harus berupa nilai true atau falsy .

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji kebenaran :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Kasus uji palsu :

6 4 3 2

8 8 1 7

3 4 3 2

Gagang pintu
sumber
Bisakah kita memilih urutan koordinat atau harus x1 y1 x2 y2?
Dennis
11
Saya menyarankan test case 1 8 1 7, di mana raja menangkap sebelum bidak dapat memindahkan dua ruang. Saya pikir semua jawaban sekarang salah. Situasi ini membuat masalahnya jauh lebih sulit.
xnor
1
@Neil karena konversi ke angka hanya membosankan dan tidak menambahkan apa pun
edc65
1
@Neil Sudah ada banyak posting di sini yang melibatkan notasi aljabar, dan saya ingin fokus pada tantangan yang sebenarnya.
Gagang pintu
2
@kaine Gadai itu tidak menimbulkan ancaman signifikan bagi raja kecuali jika raja tidak bisa menerimanya atau sebelum gerakan yang dipromosikannya. Raja tidak harus memeriksa karena selalu ada langkah yang sama baiknya.
Neil

Jawaban:

3

Jelly , 33 byte

‘»Ɠ_2<®
Ɠ©<7
:5+Ɠ>7$¤<1.4
Ɠ_ƓA2£Ŀ

Program ini membaca koordinat x2\nx1\ny2\ny1dari STDIN. Cobalah online!

Versi yang tidak bersaing

Sayangnya, juru bahasa Jelly memiliki bug ketika pertanyaan ini diposting. Bug yang dikatakan mencegahnya menerima lebih dari dua argumen baris perintah. Versi terbaru Jelly dapat menyelesaikan tugas yang diberikan dalam 23 byte .

⁶>7×5
_A+⁵>6$¤+¢’»⁶_2<⁵

Cobalah online!

Dennis
sumber
18

Python 2, 53 40

lambda x,y,p,q:y-2<q>=abs(x-p)+q/7+y/8*5

Raja memiliki koordinat (x, y)dan bidak (p, q).

Ada tiga kasus penting:

  1. Gadai berada di peringkat 7 dan raja di peringkat 8. Untuk menangkap pion, raja harus berada di file yang sama atau yang berdekatan.

    Hasil: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. Gadai berada di peringkat 7. Untuk menangkap gadai, raja harus berada dalam enam file.

    Hasil: q = 7 → |x - p| ≤ 6

  3. Gadai berada di peringkat yang lebih rendah. Untuk menangkap pion, raja harus dapat mencapai kotak promosi paling banyak satu langkah setelah pion.

    Hasil: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

Solusi saya hanyalah kondisi ini menurun. Semoga tidak ada kesalahan saat ini.

grc
sumber
2
Bagaimana kalau memotong absdengan max(y-1,x-p,p-x)?
xnor
Bukankah f(1,8,1,7)seharusnya Truekarena raja segera menangkap pion? Saya pikir ada kehalusan di mana gadai baris 7 tidak dapat diperlakukan sebagai baris 6 jika raja langsung menangkap.
xnor
@ xnor Saya pikir sudah diperbaiki sekarang (dengan cara golf yang buruk).
grc
1
Jika Anda membalikkan kondisi terakhir, Anda dapat menghapus ruang antara ordan -2.
xsot
@ xsot terima kasih atas tipnya. Saya telah mengubah pendekatan saya dan menurunkannya sekarang.
grc
2

Prolog, 48 42 byte

Kode:

p(X,Y,P,Q):-Y-2<Q,Q>=abs(X-P)+Q//7+Y//8*5.

Contoh:

p(1,8,1,7).
true

p(3,4,3,2).
false

Bukan tantangan yang buruk untuk Prolog dibandingkan dengan kebanyakan.

Sunting: Disimpan 6 byte dengan beralih ke rumus yang digunakan dalam jawaban Python 2 grc .
Sayangnya Prolog tidak dapat membuat perbandingan rantai karena python dapat dan pembagian integer adalah 1 byte lebih panjang dari divisi float.

Cobalah online di sini

Emigna
sumber
0

JavaScript (ES6), 52

(x,y,u,t,d=x>u?x-u:u-x)=>(d>=y?d:y-1)<=(d<2|t<7?t:6)

Saya berharap telah menyimpan byte yang tidak menggunakan Math.abs, Math.min, Math.max

Gadai di baris tujuh dapat lolos dengan memindahkan 2 spasi, jika dan hanya jika raja tidak berada di kolom dekat - itu sebabnya ada tanda centang dsebelum mengganti 7 dengan 6.

Test case untuk dijalankan di konsol:

;[f(5,3,3,2),f(6,1,1,7),f(3,3,3,2),f(1,8,1,7),f(6,4,3,2),f(8,8,1,7),f(3,4,3,2)]

Hasil: [true, true, true, true, false, false, false]

edc65
sumber
0

Ruby, 50 byte

def f(a,b,c,d)(a-c).abs<=(d==7?6-b/8*5:d)&&b-d<2;end

Argumennya adalah (raja x, raja y, gadai x, gadai y), semua bilangan bulat.

Tdk teratur
sumber