Dove può andare il cannone?


9

introduzione

Il gioco dello xiangqi , noto anche come scacchi cinesi, è un gioco simile agli scacchi popolare in Cina, Vietnam, Taiwan e altri paesi dell'Asia orientale. I colori dei due lati in xiangqi sono rosso e nero. Xiangqi contiene sette pezzi: general ( G), advisor ( A), elephant ( E), horse ( H), chariot ( R), cannon ( C) e soldier ( S). Ai fini di questa sfida, i pezzi maiuscoli sono considerati rossi e quelli minuscoli neri. La maggior parte di questi pezzi ha un equivalente approssimativo negli scacchi occidentali, ma esiste un pezzo assolutamente unico: il cannone.

Il cannone si muove come una torre negli scacchi o un carro in xiangqi (muovendo un numero qualsiasi di spazi sugli assi X o Y), ma non può attaccare in questo modo. Invece, attacca saltando lungo gli assi X o Y (nello stesso modo in cui si muove) su un pezzo di qualsiasi colore (amico o nemico) e atterrando sul pezzo di colore opposto, che poi cattura. Si noti che come tutti gli scacchi e i pezzi xiangqi, i cannoni non possono catturare pezzi del proprio colore.

Ad esempio, nel diagramma seguente, gli spazi in cui il cannone ( C) può spostarsi sono contrassegnati *e quelli in cui può saltare e catturare sono contrassegnati X, supponendo che vi sia un pezzo nero / minuscolo lì.

....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....

Sfida

Scrivi un programma o una funzione che, dati una scheda xiangqi e le coordinate di un cannone su quella scheda come input, generano un elenco di coordinate su cui il cannone può muoversi o saltare.

Il formato per tutti gli I / O è flessibile.

Formati accettabili per la scheda xiangqi includono una stringa separata da nuova riga, un elenco di stringhe o una stringa con qualsiasi altro separatore non presente aceghrsACEGHRS.. Puoi presumere che la tavola sarà sempre 9x10, la dimensione di una tavola xiangqi.

Il contenuto della scacchiera stessa consisterà in un numero di punti ( .), che rappresentano punti vuoti sulla scacchiera, e personaggi che rappresentano pezzi. La mappatura da pezzo a personaggio è la seguente:

A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier

Le lettere maiuscole rappresentano i pezzi rossi e le lettere minuscole rappresentano i pezzi neri. I personaggi non elencati qui (cioè non in aceghrsACEGHRS.) non appariranno nel tabellone.

Il formato della coordinata di input è flessibile e non è necessario che corrisponda al formato delle coordinate di output. Può essere un elenco di due elementi interi, una 2 tupla, due numeri con qualsiasi separatore o due caratteri, ad esempio. Può anche essere indicizzato 0 o indicizzato 1. Puoi presumere che le coordinate sulla scacchiera si risolveranno sempre in un cannone ( Co c).

Le coordinate su cui il cannone può saltare e spostarsi devono apparire nella stessa lista in output; la distinzione tra i due non è necessaria. I formati accettabili per le singole coordinate di output sono gli stessi di quelli del coord di input. Le coordinate possono essere separate da newline, emesse come un elenco o qualsiasi altra rappresentazione. Non è necessario alcun ordine particolare; l'ordine non deve nemmeno essere deterministico.

Nota che i salti su un pezzo dello stesso colore (caso) del cannone non sono legali e quindi non possono apparire nell'output.

Casi test

Si noti che non tutti i casi di test sono possibili posizioni 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)]

punteggio

Questo è , quindi vince la risposta più breve (in byte). Buon golf!


3
+1 per Xiangqi. È un gioco fantastico, che ho avuto l'opportunità di imparare dai miei colleghi quando ho lavorato per un'azienda cinese. L'atmosfera generale è come giocare a scacchi (tieni d'occhio la difesa ma gioca in modo aggressivo) ma le tattiche sono diverse (è bene far uscire presto i carri, mentre è male far uscire le torri all'inizio degli scacchi.) It.wikipedia .org / wiki / Xiangqi
Level River St,

@LevelRiverSt è molto meno tecnico degli scacchi e sembra un videogioco con una diversa strategia strategica. Mi piace!
noɥʇʎԀʎzɐɹƆ

Sembra che non ci possa essere un re, ma può esserci più del possibile pezzo?
l4m2

Risposte:


1

Pip , 112 + 1 = 113 byte

Accetta input come argomenti della riga di comando: le due coordinate, seguite dalle 10 linee della scheda. Le coordinate sono basate su 0. Emette coordinate come 67 77, con una nuova riga tra l'elenco della stessa riga e l'elenco della stessa colonna. Un byte aggiunto per il -sflag.

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)

Provalo online!

Spiegazione della versione un po 'non golfata

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)

Per impostazione predefinita, Pip legge gli argomenti della riga di comando nell'elenco g. Memorizza anche i primi cinque argomenti nelle variabili aattraverso e. I nostri primi due argomenti, ae b, sono le coordinate del cannone; gcontiene le coordinate seguite dalle righe del tabellone. Per ottenere solo il board g, lo dividiamo dall'indice 2 in poi e lo assegniamo di nuovo a g( g@>:2).

Ora definiamo una funzione f. Questa funzione accetta due argomenti: una stringa che rappresenta una riga o una colonna del tabellone e l'indice del cannone in quella stringa. Questi argomenti sono disponibili all'interno della funzione come ae b. La funzione restituirà un elenco di tutti gli indici che rappresentano i punti in cui il cannone può spostarsi o catturare.

Innanzitutto, testiamo se lo a@bè Co c. Se lo è C, vogliamo che la regex [a-z]corrisponda ai pezzi che può catturare. Se lo è c, la regex è [A-Z]. (Il codice golfizzato genera queste regex dalle variabili incorporate per l'alfabeto maiuscolo e minuscolo.) YInseriamo la regex appropriata nella yvariabile.

Cambiamo il carattere del cannone nella stringa in @(per distinguerlo dagli altri cannoni nella stessa riga / colonna).

Successivamente arriva una serie di sostituzioni regex, che cambieranno ogni posto in cui il cannone può andare a un personaggio spaziale. La prima regex \.*@\.*corrisponde @circondata da un numero qualsiasi di punti, che rappresentano tutti i punti vuoti in cui il cannone può spostarsi. La sostituzione utilizza una funzione di richiamata {aR'.s}per modificare tutti i periodi in spazi.

La regex successiva corrisponde a un pezzo che il cannone può catturare: uno [a-z]o [A-Z](a seconda di quale è stato tirato in yprecedenza) seguito da \.*\w *@(qualsiasi numero di punti, una lettera, qualsiasi numero di spazi e @). Questo corrisponderà a una stringa come h..R @(purché il cannone fosse C). La funzione di callback s._@>1taglia il primo carattere e antepone uno spazio.

Il terzo regex è simile, ma abbina un pezzo catturabile dopo il cannone piuttosto che prima.

Infine, la funzione ritorna a@*s, usando l'operatore find-all per ottenere un elenco degli indici di tutti gli spazi.

Ora chiamiamo fsulla fila del cannone e di nuovo sulla colonna del cannone. La stringa della riga è g@b, con l'indice del cannone all'interno della stringa a. La funzione restituisce un elenco di numeri di colonna, a ciascuno dei quali viene aggiunto il numero di riga b. Quando viene stampato l'elenco, la -sbandiera inserisce uno spazio tra le coppie di coordinate.

Per ottenere la colonna, utilizziamo l' Zoperatore ip per trasporre g, selezionare l'indice ae Jl'elenco di caratteri risultante in una stringa. L'indice del cannone all'interno di questa stringa è b. La funzione restituisce un elenco di numeri di riga, a ciascuno dei quali anteponiamo il numero di colonna a. Questo elenco, essendo l'ultima espressione nel programma, viene stampato automaticamente.

(Nel caso qualcuno si chiedesse, il separatore di espressioni ;è lì per forzare Jad analizzare come un operatore unario piuttosto che binario.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.