Damas

10

O objetivo deste desafio é determinar se um movimento é um legal Damas Inglesas movimento.

Este desafio usará uma placa 8x8. Uma peça movida deve ser tratada como um homem (não um rei) que só pode avançar na diagonal. O tabuleiro terá 0 ou mais peças pretas e 1 ou mais peças brancas. Uma peça branca estará em movimento no momento. A peça branca pode "pular" sobre uma peça preta na diagonal à sua frente, se o quadrado diretamente atrás dela estiver vazio. É possível saltar mais a partir dessa posição se houver outra peça preta em qualquer direção na diagonal à sua frente. A captura é obrigatória, portanto, é ilegal não dar um salto disponível. No entanto, não é obrigatório seguir um caminho que maximize o número de saltos. Basicamente, isso significa que, se você fizer um salto e houver outro salto possível a partir da posição final, esse movimento será ilegal. As posições das peças usam o seguinte esquema de numeração:

Numeração do tabuleiro de damas


Regras

Entradas:

  • Uma lista de números que representam peças pretas.

  • Uma lista de números que representam peças brancas.

  • Uma posição inicial para a peça branca

  • A posição final da peça branca

Resultado:

  • Um valor verdadeiro se a movimentação for válida, caso contrário, um valor de falsey


Você pode assumir que uma peça branca sempre ocupará a posição inicial.

Se conveniente, você pode assumir que a primeira peça branca da lista de peças brancas conterá a posição inicial em vez de aceitar a entrada 3.

Regras de golfe de código padrão. Menos bytes ganha.


Casos de teste

Para ilustrar, O é a posição inicial, X é a posição final, B são peças pretas e W são peças brancas

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
fonte
3
Sugiro um caso de teste como B=[8,15,23,24];W=[27]com cada um M=[27,4]e M=[27,20]1. ele dará uma mudança de direção. 2 ele responderá a uma pergunta que tenho: ambos são válidos ou devem ser mais demorados? ("A captura é obrigatória, portanto, é ilegal não dar um pulo disponível" meio que sugere que ambos sejam válidos, embora eu não saiba por que você faz com que seja ilegal não capturar, se possível, talvez você queira número de peças possível)?
Jonathan Allan
Desculpe, eu não sei jogar damas (em inglês) . Você gostaria de adicionar mais alguns detalhes sobre o que é uma jogada legal.
TSH
11
Aqui está um resumo dos casos de teste no formato compatível com STDIN.
Arnauld
A captura é obrigatória, portanto, é ilegal não dar um salto disponível. o que significa "dar um pulo"?
Erik the Outgolfer
11
@ JonathanAllan Acho que resolvi sua pergunta na explicação e adicionei os casos de teste.
Aoemica

Respostas:

1

Isso foi desafiador :) * bugs corrigidos (bytes adicionados)

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

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]

Experimente online!

DanielIndie
fonte
Eu acho que você pode usar em >>2&1vez de /4%2|0.
Arnauld
Caso de teste: [10, 3], [14], 14, 7falhou.
TSH
@tsh fixo :), se mais casos de teste não deixe-me saber
DanielIndie