Checker Checker

10

Tujuan dari tantangan ini adalah untuk menentukan apakah suatu langkah adalah langkah Bahasa Inggris yang legal .

Tantangan ini akan menggunakan papan 8x8. Sepotong tergerak harus diperlakukan sebagai seorang pria (bukan raja) yang hanya bisa bergerak maju secara diagonal. Papan akan memiliki 0 atau lebih potongan hitam dan 1 atau lebih potongan putih. Satu potong putih saat ini akan bergerak. Potongan putih dapat "melompati" satu potongan hitam secara diagonal di depannya jika kotak tepat di belakangnya kosong. Dimungkinkan untuk mengambil lompatan lebih jauh dari posisi itu jika ada potongan hitam lain di kedua arah secara diagonal di depannya. Menangkap adalah wajib, jadi ilegal untuk tidak melakukan lompatan yang tersedia. Namun, tidak wajib untuk mengambil jalur yang memaksimalkan jumlah lompatan. Pada dasarnya, ini berarti bahwa jika Anda melakukan lompatan dan ada kemungkinan lompatan lain dari posisi akhir maka gerakan itu ilegal. Posisi potong menggunakan skema penomoran berikut:

Penomoran kotak-kotak


Aturan

Input:

  • Daftar angka yang mewakili potongan hitam.

  • Daftar angka yang mewakili potongan putih.

  • Posisi awal untuk bagian putih

  • Posisi akhir untuk bagian putih

Keluaran:

  • Nilai kebenaran jika gerakan itu valid, jika tidak nilai falsey


Anda dapat menganggap sepotong putih akan selalu menempati posisi awal.

Jika mudah, Anda dapat mengasumsikan bahwa keping putih pertama dalam daftar keping putih akan berisi posisi awal alih-alih menerima input 3.

Aturan golf kode standar. Bytes paling sedikit menang.


Uji Kasus

Untuk menggambarkan, O adalah posisi awal, X adalah posisi akhir, B adalah potongan hitam, dan W adalah potongan putih

Black pieces: []
White pieces: [5]
Move: (5, 1)
Output: True

Single move no jump
 X _ _ _
O _ _ _ 

B: [6]
W: [9]
M: (9, 2)
O: True

Single jump
 _ X _ _
_ B _ _ 
 O _ _ _

B: [2, 6]
M: (9, 2)
O: False

Illegal ending position on top of black piece
 _ X _ _
_ B _ _ 
 O _ _ _

B: [7, 14]
W: [17]
M: (17, 3)
O: True

Double jump
 _ _ X _
_ _ B _ 
 _ _ _ _
_ B _ _ 
 O _ _ _

B: [7, 14]
M: (17, 10)
O: False

Illegal jump, must take the next jump as well
 _ _ _ _
_ _ B _ 
 _ X _ _
_ B _ _ 
 O _ _ _

B: [4]
W: [8]
M: (8, 3)
O: False

Illegal jump across the board
 _ _ _ X
B _ _ _ 
 O _ _ _


B: [6, 7]
W: [6]
M: (10, 1)
O: True

Split decision p1
 X _ _ _
_ B B _ 
 _ O _ _

B: [6, 7]
M: (10, 3)
O: True

Split decision p2
 _ _ X _
_ B B _ 
 _ O _ _


B: [2]
W: [1]
M: (1, 3)
O: False

Sideways Jump
 O B X _

B: [6]
W: [1]
M: (1, 10)
O: False

Backwards Jump
 O _ _ _
_ B _ _ 
 _ X _ _

B: [6]
W: [9, 2]
M: (9, 2)
O: False

Illegal ending position on top of white piece
 _ X _ _
_ B _ _ 
 O _ _ _

B: []
W: [9, 6]
M: (9, 2)
O: False

Illegal jump over white piece
 _ X _ _
_ W _ _ 
 O _ _ _

B: [8, 15, 23, 24]
W: [27]
M: (27, 4)
O: True


Split decision long path
 _ _ _ X
_ _ _ B 
 _ _ _ _
_ _ B _ 
 _ _ _ _
_ _ B B 
 _ _ W _

B: [8, 15, 23, 24]
W: [27]
M: (27, 20)
O: True

Split decision short path
 _ _ _ _
_ _ _ B 
 _ _ _ _
_ _ B _ 
 _ _ _ X
_ _ B B 
 _ _ W _
aoemica
sumber
3
Saya menyarankan uji kasus seperti B=[8,15,23,24];W=[27]dengan masing-masing M=[27,4]dan M=[27,20]1. itu akan memberikan perubahan arah. 2 itu akan menjawab pertanyaan yang saya miliki: keduanya valid atau haruskah lebih lama diambil? ("Menangkap adalah wajib, jadi ilegal untuk tidak melakukan lompatan yang tersedia" semacam menyarankan keduanya valid, meskipun saya tidak tahu mengapa Anda membuatnya ilegal untuk tidak menangkap jika mungkin, jadi mungkin Anda bermaksud mengambil sebanyak mungkin potongan?)
Jonathan Allan
Maaf saya tidak tahu cara memainkan catur (Inggris) . Maukah Anda menambahkan beberapa detail tentang apa itu langkah hukum.
tsh
1
Berikut ini adalah ringkasan kasus uji dalam format ramah-STDIN.
Arnauld
Menangkap adalah wajib, jadi ilegal untuk tidak melakukan lompatan yang tersedia. apa yang dimaksud dengan "melompat"?
Erik the Outgolfer
1
@ Jonathanathan Allan Saya rasa saya menjawab pertanyaan Anda dalam penjelasan dan menambahkan kasus uji.
aoemica

Jawaban:

1

Itu menantang :) * memperbaiki bug (ditambahkan byte)

JavaScript (Node.js) , 197 193 191 185 181 186 byte

f=(B,W,S,E,F=1)=>g(S).filter((x,i)=>B[I="includes"](x)&!B[I](t=g(x)[i])&!W[I](t)&&t>0?F+=f(B,W,t,E):0)[0]?F>1:g(S)[I](E)
g=S=>[S--,!(y=~-(e=S-3)/4%2|0)||S%4^3?y?e+1:e:0,S%4||y?y?e:e-1:0]

Cobalah online!

DanielIndie
sumber
Saya pikir Anda dapat menggunakan >>2&1bukan /4%2|0.
Arnauld
Testcase: [10, 3], [14], 14, 7gagal.
tsh
@tsh diperbaiki :), jika lebih banyak test case gagal beri tahu saya
DanielIndie