Dadas duas posições diferentes em um tabuleiro de xadrez e o tipo de peça, faça o número mínimo de movimentos necessários para que essa peça vá de uma posição para outra.
Regras
A peça dada pode ser rei, rainha, torre, cavaleiro e bispo. (Esta entrada pode ser aceita como 5 caracteres únicos)
As 2 posições podem ser tomadas em qualquer formato conveniente,
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
Caso a peça não possa chegar lá, produza algo que não seja um número inteiro positivo.
Exemplos
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Respostas:
JavaScript (Node.js) ,
183180179 bytesExperimente online!
Há muito tempo para casos extremos, agradeço a Arnauld pela verificação. Teste do cavaleiro
fonte
max
por um ternário.APL (Dyalog Classic) ,
117107105103989795928987 bytesExperimente online!
arg esquerdo é tipo de peça: 0 = rei, 1 = rainha, 2 = torre, 3 = cavaleiro, 4 = bispo; arg direito é uma matriz 2x2 de cordas, cada linha representando uma posição; retorna 0 para inacessível
|-⌿⍵
calcula o par [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
escolhe uma expressão da lista "..."; se é uma função, é aplicada a|-⌿⍵
; se for um valor (isso acontece apenas para um cavaleiro),⊣
certifique-se de devolvê-lo em vez de|-⌿⍵
rei: max (
⌈/
) dos abs ∆-squeen: remova os zeros (
~∘0
) e conte (≢
) os únicos (∪
)torre: soma (
+/
) de signa (monádico×
; 0 para 0, 1 para positivo)cavaleiro:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- comece com a posição inicial e calcule recursivamente gerações de movimentos do cavaleiro até que a posição final esteja no conjunto; retornar profundidade de recursãobispo: as paridades dos dois ∆-s são iguais? (
2=.|⊢
, equivalente a=/2|⊢
) multiplique o resultado booleano (0 ou 1) pelo número único de contagem (≢∘∪
)fonte
⍎⍺⊃
. Muito esperto.Java (JDK) , 229 bytes
Experimente online!
Explicações
Código:
Créditos
fonte
Carvão , 108 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Liste todos os 64 quadrados do tabuleiro na variável de lista vazia predefinida.
Faça uma lista de listas cuja primeira entrada é uma lista que contém a posição inicial.
Repita até que a última entrada da lista contenha a posição final.
Filtre todas as posições do tabuleiro afastadas de qualquer entrada na última entrada da lista de listas e empurre-a para a lista de listas. Isso inclui as posições visitadas anteriormente, mas, de qualquer maneira, não estávamos interessadas nelas, então terminamos com uma primeira pesquisa abrangente do fórum sobre a posição final.
Calcule as diferenças absolutas de coordenadas entre as posições inicial e final.
Selecione com base na peça de entrada.
Se for um rei, imprima a diferença máxima absoluta de coordenadas.
Se for uma dama, imprima 2, a menos que as duas diferenças sejam iguais ou uma seja zero.
Se for uma torre, imprima 2, a menos que uma das diferenças seja zero.
Se for um bispo, imprima 0 se os quadrados tiverem paridade oposta, caso contrário, imprima 2, a menos que as duas diferenças sejam iguais.
Se for um cavaleiro, imprima o número de voltas realizadas para encontrar a posição final.
fonte
Japonês , 67 bytes
Experimente online!
Que foi uma experiência. Tomei muita inspiração na excelente resposta da APL . Suspeito que ainda haja muito golfe, especialmente no código Knight.
As posições são a primeira entrada, no formulário
[[x1,x2],[y1,y2]]
. Deve funcionar bem[[y1,y2],[x1,x2]]
também. A seleção das peças é a segunda entrada, com 0 = rei, 1 = rainha, 2 = cavaleiro, 3 = torre, 4 = bispo. Observe que Knight e Rook são trocados em comparação com a resposta da APL.Explicação:
fonte
á
funcionava para diminuir[[1,2][2,1]]
consideravelmente.á
, um bom!U
está implícito depois@
, para que você possa salvar dois bytes na função knight. Você também pode iniciá-lo@=ã ü;
para salvar outro. (Oã
truque é inteligente também :-))