Para onde pode ir o canhão?

9

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 ( Cou 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 é , então a resposta mais curta (em bytes) vence. Feliz golfe!

Cobre
fonte
3
+1 para Xiangqi. É um jogo incrível, que tive a oportunidade de aprender com meus colegas quando trabalhei para uma empresa chinesa. A sensação geral é como jogar xadrez (fique atento à defesa, mas jogue agressivamente), mas as táticas são diferentes (é bom trazer as carruagens mais cedo, enquanto que é ruim trazer as torres no início do xadrez.) Pt.wikipedia .org / wiki / Xiangqi
Level River St
O @LevelRiverSt é muito menos técnico que o xadrez e parece um videogame com uma sensação estratégica diferente. Eu gosto disso!
noɐɹƆzɐɹƆ 10/09/16
Parece que não pode haver rei, mas pode haver mais do que uma peça possível?
L4m2

Respostas:

1

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 -ssinalizador.

g@>:2P(f:{Ya@bQ'C?X^z;X^AZa@b:'@aR`\.*@\.*`{aR'.s}Ry.`\.*\w *@`s._@>1R`@ *\w\.*`.y_@<v.s@*s}g@ba).ba.(f;J(Zga)b)

Experimente online!

Explicação da versão um pouco não destruída

g@>:2
f:{
 Y a@bQ'C ? `[a-z]` `[A-Z]`
 a@b:'@
 aR:`\.*@\.*` {aR'.s}
 aR:y.`\.*\w *@` s._@>1
 aR:`@ *\w\.*`.y _@<v.s
 a@*s
}
P (f g@b a).b
a.(f; J(Zg)@a b)

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áveis aatravés e. Nossos dois primeiros argumentos, ae b, são as coordenadas do canhão; gcontém as coordenadas seguidas pelas linhas do quadro. Para incluir apenas o quadro g, dividimos o índice 2 em diante e atribuímos de volta a g( 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 como ae b. 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é Cou c. Se for C, queremos que o regex [a-z]corresponda às peças que ele pode capturar. Se for c, 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). YAnexamos o regex apropriado na yvariá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 puxado yanteriormente)) seguido por \.*\w *@(qualquer número de períodos, uma letra, qualquer número de espaços e @). Isso corresponderá a uma string como h..R @(desde que o canhão estivesse C). A função de retorno de chamada s._@>1corta 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 fa 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 string a. A função retorna uma lista de números de coluna, para cada um dos quais anexamos o número da linha b. Quando a lista é impressa, o -ssinalizador coloca um espaço entre os pares de coordenadas.

Para obter a coluna, usamos o Zoperador ip para transpor g, selecionar índice ae Jinserir 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 coluna a. 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çar Ja análise como um operador unário em vez de binário.)

DLosc
fonte