Introdução
O jogo de xiangqi , também conhecido como xadrez chinês, é um jogo semelhante ao xadrez popular na China, Vietnã, Taiwan e outros países do leste asiático. As cores dos dois lados em xiangqi são vermelho e preto. Existem sete peças em xiangqi: geral ( G
), conselheiro ( A
), elefante ( E
), cavalo ( H
), carruagem ( R
), canhão ( C
) e soldado ( S
). Para os propósitos deste desafio, as peças maiúsculas são consideradas vermelhas e as minúsculas pretas. A maioria dessas peças tem um equivalente aproximado no xadrez ocidental, mas há uma peça completamente única: o canhão.
O canhão se move como uma torre no xadrez ou uma carruagem no xiangqi (movendo qualquer número de espaços nos eixos X ou Y), mas não pode atacar dessa maneira. Em vez disso, ele ataca pulando ao longo dos eixos X ou Y (da mesma maneira que se move) sobre uma peça de qualquer cor (amigo ou inimigo) e aterrissando na peça de cor oposta, que ela captura. Observe que, como todas as peças de xadrez e xiangqi, os canhões não podem capturar peças de sua própria cor.
Por exemplo, no diagrama a seguir, os espaços para os quais o canhão ( C
) pode se mover são marcados *
e aqueles para os quais ele pode pular e capturar são marcados X
, assumindo que haja uma peça preta / minúscula lá.
....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....
Desafio
Escreva um programa ou função que, dada uma placa xiangqi e as coordenadas de um canhão nessa placa como entrada, produza uma lista de coordenadas para as quais o canhão pode se mover ou pular.
O formato para todas as E / S é flexível.
Os formatos aceitáveis para a placa xiangqi incluem uma cadeia separada por nova linha, uma lista de cadeias ou uma cadeia com qualquer outro separador que não esteja aceghrsACEGHRS.
. Você pode supor que o quadro sempre será 9x10, do tamanho de um quadro xiangqi.
O conteúdo do próprio quadro consistirá em um número de pontos ( .
), representando pontos vazios no quadro e caracteres representando peças. O mapeamento de peça para caractere é o seguinte:
A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier
Letras maiúsculas representam peças vermelhas e letras minúsculas representam peças pretas. Os caracteres não listados aqui (ou seja, não incluídos aceghrsACEGHRS.
) não aparecerão no quadro.
O formato da coordenada de entrada é flexível e não é necessário para corresponder ao formato das coordenadas de saída. Pode ser uma lista de dois elementos inteiros, uma tupla de 2, dois números com qualquer separador ou dois caracteres, por exemplo. Também pode ser indexado em 0 ou 1. Você pode supor que a coordenada no quadro sempre será resolvida como um canhão ( C
ou c
).
As coordenadas para as quais o canhão pode pular e mover devem aparecer na mesma lista na saída; a distinção entre os dois não é necessária. Os formatos aceitáveis para quaisquer coordenadas de saída individuais são os mesmos da coordenada de entrada. As coordenadas podem ser separadas por nova linha, exibidas como uma lista ou qualquer outra representação. Nenhuma ordem específica é necessária; a ordem nem precisa ser determinística.
Observe que saltar em um pedaço da mesma cor (estojo) do canhão não é legal e, portanto, não pode aparecer na saída.
Casos de teste
Observe que nem todos os casos de teste são possíveis posições xiangqi.
Input board
Input coordinate (0-indexed)
List of output coordinates
.........
.........
.........
.........
.........
....C....
.........
.........
.........
.........
(4, 5)
[(0, 5), (1, 5), (2, 5), (3, 5), (5, 5), (6, 5), (7, 5), (8, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 6), (4, 7), (4, 8), (4, 9)]
.........
.....G...
.........
.........
.....e...
.........
.........
h..R.c..S
.....a...
.........
(5, 7)
[(4, 7), (6, 7), (7, 7), (5, 6), (5, 5), (5, 1)]
..s......
..A...e..
.........
EACCcsh.H
..r......
.....S...
......s..
....C....
..g......
(2, 3)
[(2, 0), (2, 2), (4, 3), (2, 9)]
rheagaehr
.........
.c.....c.
s.s.s.s.s
.........
.........
S.S.S.S.S
.C.....C.
.........
RHEAGAEHR
(7, 7)
[(2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (8, 7), (7, 0), (7, 3), (7, 4), (7, 5), (7, 6), (7, 8)]
Pontuação
Isso é código-golfe , então a resposta mais curta (em bytes) vence. Feliz golfe!
fonte
Respostas:
Pip , 112 + 1 = 113 bytes
Recebe entrada como argumentos da linha de comando: as duas coordenadas, seguidas pelas 10 linhas do quadro. As coordenadas são baseadas em 0. Gera coordenadas como
67 77
, com uma nova linha entre a lista da mesma linha e a mesma coluna. Um byte adicionado para o-s
sinalizador.Experimente online!
Explicação da versão um pouco não destruída
Por padrão, o Pip lê os argumentos da linha de comando na lista
g
. Ele também armazena os cinco primeiros argumentos nas variáveisa
atravése
. Nossos dois primeiros argumentos,a
eb
, são as coordenadas do canhão;g
contém as coordenadas seguidas pelas linhas do quadro. Para incluir apenas o quadrog
, dividimos o índice 2 em diante e atribuímos de volta ag
(g@>:2
).Agora vamos definir uma função
f
. Esta função recebe dois argumentos: uma sequência que representa uma linha ou coluna do tabuleiro e o índice do canhão nessa sequência. Esses argumentos estão disponíveis dentro da função comoa
eb
. A função retornará uma lista de todos os índices que representam pontos para os quais o canhão pode se mover ou capturar.Primeiro, testamos se
a@b
éC
ouc
. Se forC
, queremos que o regex[a-z]
corresponda às peças que ele pode capturar. Se forc
, o regex é[A-Z]
. (O código golfado gera esses regexes a partir das variáveis internas para o alfabeto maiúsculo e minúsculo).Y
Anexamos o regex apropriado nay
variável.Alteramos o caractere do canhão na string para
@
(para distingui-lo de outros canhões na mesma linha / coluna).Em seguida, vem uma série de substituições de expressões regulares, que mudam todos os lugares em que o canhão pode ir para um caractere de espaço. O primeiro regex
\.*@\.*
corresponde@
cercado por qualquer número de períodos, todos representando pontos vazios para os quais o canhão pode se mover. A substituição usa uma função de retorno de chamada{aR'.s}
para alterar todos os períodos para espaços.O próximo regex corresponde a uma peça que o canhão pode capturar:
[a-z]
ou[A-Z]
((dependendo de qual foi puxadoy
anteriormente)) seguido por\.*\w *@
(qualquer número de períodos, uma letra, qualquer número de espaços e@
). Isso corresponderá a uma string comoh..R @
(desde que o canhão estivesseC
). A função de retorno de chamadas._@>1
corta o primeiro caractere e precede um espaço.O terceiro regex é semelhante, mas corresponde a uma peça capturável após o canhão, e não antes.
Finalmente, a função retorna
a@*s
, usando o operador find-all para obter uma lista dos índices de todos os espaços.Agora chamamos
f
a linha do canhão e novamente a coluna do canhão. A string da linha ég@b
, com o índice do canhão dentro da stringa
. A função retorna uma lista de números de coluna, para cada um dos quais anexamos o número da linhab
. Quando a lista é impressa, o-s
sinalizador coloca um espaço entre os pares de coordenadas.Para obter a coluna, usamos o
Z
operador ip para transporg
, selecionar índicea
eJ
inserir a lista de caracteres resultante em uma string. O índice do canhão dentro dessa string éb
. A função retorna uma lista de números de linha, para cada um dos quais acrescentamos o número da colunaa
. Esta lista, sendo a última expressão no programa, é impressa automaticamente.(Caso alguém esteja se perguntando, o separador de expressões
;
existe para forçarJ
a análise como um operador unário em vez de binário.)fonte