Шашки шашки


10

Цель этого задания - определить, является ли ход легальным ходом по английским шашкам .

Эта задача будет использовать доску 8x8. Подвижная фигура должна рассматриваться как человек (не король), который может двигаться только по диагонали. На доске будет 0 или более черных фигур и 1 или более белых фигур. Одна белая фигура будет двигаться в данный момент. Белая фигура может «перепрыгнуть» через одну черную фигуру по диагонали перед ней, если квадрат прямо за ней пуст. Можно сделать еще один прыжок из этой позиции, если перед ним по диагонали есть еще одна черная фигура в любом направлении. Захват обязателен, поэтому запрещается не делать прыжок, который доступен. Однако не обязательно выбирать путь, который максимизирует количество прыжков. По сути, это означает, что если вы совершите прыжок и есть еще один возможный прыжок из конечной позиции, то это движение будет недопустимым. Позиции штук используют следующую схему нумерации:

Шахматная нумерация


правила

Входы:

  • Список чисел, которые представляют черные фигуры.

  • Список чисел, которые представляют белые фигуры.

  • Исходная позиция для белого куска

  • Конечная позиция для белого куска

Вывод:

  • Истинное значение, если ход действителен, в противном случае - ложное значение


Можно предположить, что белая фигура всегда будет занимать исходную позицию.

Если это удобно, вы можете предположить, что первая белая фигура в списке белых фигур будет содержать начальную позицию вместо принятия ввода 3.

Стандартные правила игры в гольф. Побеждает несколько байтов.


Тестовые случаи

Для иллюстрации: О - начальная позиция, Х - конечная позиция, В - черные фигуры, а W - белые фигуры.

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 _

3
Я предлагаю тест-случай , как B=[8,15,23,24];W=[27]с каждым из M=[27,4]и M=[27,20]1. Это даст изменение направления. 2 он ответит на мой вопрос: оба они действительны или должны быть приняты дольше? («Захват обязателен, поэтому незаконно не делать прыжок, который доступен», как бы предполагает, что оба действительны, хотя я не знаю, почему вы делаете незаконным не захватывать, если это возможно, так что, возможно, вы хотите взять как сколько штук возможно?)
Джонатан Аллан,

Извините, я не знаю, как играть в (английский) шашки . Не могли бы вы добавить более подробную информацию о том, что является законным ходом.
1818 года


Захват обязателен, поэтому запрещается не делать прыжок, который доступен. что значит "прыгнуть"?
Эрик Outgolfer

1
@JonathanAllan Я думаю, что я ответил на ваш вопрос в объяснении и добавил контрольные примеры.
Aoemica

Ответы:


1

Это было сложно :) * исправлены ошибки (добавлено байтов)

JavaScript (Node.js) , 197 193 191 185 181 186 байт

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]

Попробуйте онлайн!


Я думаю, что вы можете использовать >>2&1вместо /4%2|0.
Арнаулд

Тестовый случай: [10, 3], [14], 14, 7не удалось.
1818 года

@tsh исправлено :), если больше тестовых случаев не
пройдено,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.