Checkers Checker

10

Celem tego wyzwania jest ustalenie, czy ruch jest legalnym ruchem warcabów angielskich .

W tym wyzwaniu zostanie użyta tablica 8x8. Przesunięty pionek należy traktować jak człowieka (a nie króla), który może poruszać się po przekątnej do przodu. Na planszy będzie 0 lub więcej czarnych i 1 lub więcej białych. Jeden biały element będzie się teraz poruszał. Biały element może „przeskoczyć” na jeden czarny element po przekątnej przed nim, jeśli kwadrat bezpośrednio za nim jest pusty. Możliwe jest wykonanie kolejnego skoku z tej pozycji, jeśli przed nim jest inny czarny element w dowolnym kierunku po przekątnej. Przechwytywanie jest obowiązkowe, więc nie wolno nie skakać z dostępnego skoku. Jednak nie jest obowiązkowe obieranie ścieżki, która maksymalizuje liczbę skoków. Zasadniczo oznacza to, że jeśli wykonasz skok i istnieje inny możliwy skok z pozycji końcowej, ruch ten jest nielegalny. Pozycje sztuk stosują następujący schemat numeracji:

Numeracja szachownicy


Zasady

Wejścia:

  • Lista liczb reprezentujących czarne elementy.

  • Lista liczb reprezentujących białe elementy.

  • Pozycja początkowa dla białego kawałka

  • Pozycja końcowa dla białego kawałka

Wynik:

  • Prawdziwa wartość, jeśli ruch jest prawidłowy, w przeciwnym razie wartość falsey


Możesz założyć, że biały kawałek zawsze będzie zajmował pozycję początkową.

Jeśli jest to wygodne, możesz założyć, że pierwszy biały kawałek na białej liście będzie zawierał pozycję początkową zamiast akceptować dane wejściowe 3.

Standardowe zasady gry w golfa. Wygrywa najmniej bajtów.


Przypadki testowe

Aby to zilustrować, O to pozycja początkowa, X to pozycja końcowa, B to czarne kawałki, a W to białe kawałki

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
źródło
3
Sugeruję przypadek testowy jak B=[8,15,23,24];W=[27]w każdym z M=[27,4]i M=[27,20]1. da to zmianę kierunku. 2 odpowie na pytanie, które mam: czy oba są ważne, czy też należy je kontynuować? („Przechwytywanie jest obowiązkowe, więc niedozwolone jest nie skakanie, które jest dostępne” sugeruje, że oba są ważne, chociaż nie wiem, dlaczego sprawiasz, że nielegalne nie jest przechwytywanie, jeśli to możliwe, więc może masz na myśli jak najwięcej kawałków?)
Jonathan Allan,
Niestety nie wiem, jak grać w warcaby (angielski) . Czy mógłbyś dodać więcej szczegółów na temat legalnego posunięcia?
tsh
1
Oto podsumowanie przypadków testowych w formacie przyjaznym dla STDIN.
Arnauld
Przechwytywanie jest obowiązkowe, więc nie wolno nie skakać z dostępnego skoku. co znaczy „skoczyć”?
Erik the Outgolfer,
1
@JonathanAllan Myślę, że odpowiedziałem na twoje pytanie w wyjaśnieniu i dodałem przypadki testowe.
aoemica,

Odpowiedzi:

1

To było trudne :) * naprawione błędy (dodane bajty)

JavaScript (Node.js) , 197 193 191 185 181 186 bajtów

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]

Wypróbuj online!

DanielIndie
źródło
Myślę, że możesz użyć >>2&1zamiast /4%2|0.
Arnauld
Testcase: [10, 3], [14], 14, 7failed.
tsh
@tsh naprawiono :), jeśli więcej przypadków testowych nie powiodło się, daj mi znać
DanielIndie