O rei pode pegar o peão?

26

Dada uma entrada de quatro números inteiros x 1 , y 1 , x 2 e y 2 , determine se um rei branco no xadrez (com coordenadas ( x 1 , y 1 )) poderia pegar um peão preto (com coordenadas ( x 2 , y 2 )) e capturá-lo se o peão estiver se movendo para promover a uma rainha o mais rápido possível.

As coordenadas do quadro são as seguintes:

       first coordinate (x)
             12345678

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

Suponha que seja branco se mover (a vez do rei) e que ambos os jogadores joguem da melhor maneira (o rei se moverá o mais rápido possível para pegar o peão, e o peão se moverá o mais rápido possível para promover). As coordenadas de entrada sempre serão distintas e o peão nunca começará com uma coordenada y de 8.

O rei move um quadrado em qualquer direção a cada turno (pode se mover na diagonal), e o peão pode mover apenas um espaço para a frente (diminuir sua coordenada y), a menos que esteja na sua posição inicial (com nosso sistema de coordenadas, coordenada y de 7), caso em que pode mover dois espaços para a frente.

A entrada pode ser fornecida como uma cadeia de caracteres separada por espaço em branco / vírgula, uma matriz de cadeias / números inteiros ou quatro argumentos de função / linha de comando / etc. As coordenadas podem ser dadas na ordem que for mais conveniente / golfe (assim, aceitar entrada como [y 2 , y 1 , x 1 , y 2 ] é bom desde que seja consistente). A saída deve ser um valor verdadeiro ou falso .

Como esse é o , o código mais curto em bytes vence.

Casos de teste de verdade :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Casos de teste de falsidade :

6 4 3 2

8 8 1 7

3 4 3 2

Maçaneta da porta
fonte
Podemos escolher a ordem das coordenadas ou precisa ser x1 y1 x2 y2?
Dennis
11
Sugiro o caso de teste 1 8 1 7, onde o rei captura antes que o peão possa mover dois espaços. Eu acho que todas as respostas agora entendem errado. Essa situação dificulta muito o problema.
Xnor
1
@Neil porque a conversão de números é apenas chato e não adiciona nada
edc65
1
@ Neil Já existem muitos posts aqui envolvendo notação algébrica, e eu queria me concentrar no desafio real.
Maçaneta
2
@kaine O peão não representa uma ameaça significativa para o rei, a menos que o rei não possa enfrentá-lo ou antes do movimento que ele promove. O rei não precisa passar para o cheque, porque sempre há uma jogada igualmente boa que ele pode fazer.
Neil

Respostas:

3

Gelatina , 33 bytes

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

Este programa lê as coordenadas a partir x2\nx1\ny2\ny1de STDIN. Experimente online!

Versão não concorrente

Infelizmente, o intérprete Jelly teve um erro quando esta pergunta foi publicada. O referido bug impediu que ele aceitasse mais de dois argumentos da linha de comando. A versão mais recente do Jelly pode resolver a tarefa especificada em 23 bytes .

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

Experimente online!

Dennis
fonte
18

Python 2, 53 40

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

O rei tem coordenadas (x, y)e o peão (p, q).

Existem três casos significativos:

  1. O peão está no rank 7 e o rei no rank 8. Para capturar o peão, o rei deve estar no mesmo arquivo ou em um adjacente.

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

  2. O peão está no posto 7. Para capturar o peão, o rei deve estar dentro de seis arquivos.

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

  3. O peão está em uma posição mais baixa. Para capturar o peão, o rei deve ser capaz de alcançar a praça de promoção no máximo um movimento após o peão.

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

Minha solução é justamente essas condições. Espero que não haja erros neste momento.

grc
fonte
2
Que tal cortar o abscom max(y-1,x-p,p-x)?
xnor
Não deveria f(1,8,1,7)ser Trueporque o rei imediatamente captura o peão? Eu acho que há uma sutileza em que a linha 7 do peão não pode ser tratada como a linha 6 se o rei capturar imediatamente.
xnor
@ xnor Eu acho que está consertado agora (de uma maneira mal golfe).
grc 07/01
1
Se você reverteu a última condição, poderá remover o espaço entre ore -2.
xsot
@xsot obrigado pela dica. Mudei minha abordagem e reduzi-a um pouco mais agora.
grc 07/01
2

Prolog, 48 42 bytes

Código:

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

Exemplos:

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

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

Não é um mau desafio para o Prolog em comparação com a maioria.

Editar: salvou 6 bytes mudando para a fórmula usada na resposta Python 2 do grc .
Infelizmente, o Prolog não pode encadear comparações, pois o python pode e a divisão inteira é 1 byte mais longa que a divisão float.

Experimente online aqui

Emigna
fonte
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)

Espero ter salvo bytes não usando Math.abs, Math.min, Math.max

O peão na linha sete pode escapar do movimento de 2 espaços, se e somente se o rei não estiver em uma coluna próxima - é por isso que há uma verificação dantes de substituir 7 por 6.

Caso de teste para execução no console:

;[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)]

Resultado: [true, true, true, true, false, false, false]

edc65
fonte
0

Ruby, 50 bytes

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

Os argumentos são (rei x, rei y, peão x, peão y), todos os números inteiros.

PellMell
fonte