Einführung
Das Xiangqi- Spiel , auch als chinesisches Schach bekannt, ist ein schachähnliches Spiel, das in China, Vietnam, Taiwan und anderen ostasiatischen Ländern beliebt ist. Die Farben der beiden Seiten in Xiangqi sind rot und schwarz. In Xiangqi gibt es sieben Teile: General ( G
), Berater ( A
), Elefant ( E
), Pferd ( H
), Streitwagen ( R
), Kanone ( C
) und Soldat ( S
). Für die Zwecke dieser Herausforderung werden Großbuchstaben als rot und Kleinbuchstaben als schwarz betrachtet. Die meisten dieser Figuren haben eine grobe Entsprechung im westlichen Schach, aber es gibt eine völlig einzigartige Figur: die Kanone.
Die Kanone bewegt sich wie ein Turm im Schach oder ein Streitwagen in Xiangqi (bewegt eine beliebige Anzahl von Feldern auf der X- oder Y-Achse), kann aber auf diese Weise nicht angreifen. Stattdessen greift es an, indem es entlang der X- oder Y-Achse (auf die gleiche Weise, wie es sich bewegt) über ein Stück einer beliebigen Farbe (Freund oder Feind) springt und auf dem gegenüberliegenden Stück landet, das es dann erfasst. Beachten Sie, dass Kanonen wie alle Schach- und Xiangqi-Figuren keine Figuren ihrer eigenen Farbe erfassen können.
Im folgenden Diagramm sind beispielsweise die Felder C
markiert *
, in die sich die Kanone ( ) bewegen kann , und diejenigen, in die sie springen und erfassen kann, sind mit markiert X
, vorausgesetzt, dass sich dort ein schwarz / klein geschriebenes Stück befindet.
....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die bei einer Xiangqi-Tafel und den Koordinaten einer Kanone auf dieser Tafel als Eingabe eine Liste von Koordinaten ausgibt, zu denen sich die Kanone bewegen oder springen kann.
Das Format für alle E / A ist flexibel.
Akzeptable Formate für die Xiangqi-Karte umfassen eine durch Zeilenumbrüche getrennte Zeichenfolge, eine Liste von Zeichenfolgen oder eine Zeichenfolge mit einem anderen Trennzeichen, das nicht enthalten ist aceghrsACEGHRS.
. Sie können davon ausgehen, dass die Karte immer 9x10 groß ist, die Größe einer Xiangqi-Karte.
Der Inhalt der Tafel selbst besteht aus einer Reihe von .
Punkten ( ), die leere Punkte auf der Tafel darstellen, und Zeichen, die Teile darstellen. Die Zuordnung von Stück zu Charakter ist wie folgt:
A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier
Großbuchstaben stehen für rote Teile und Kleinbuchstaben für schwarze Teile. Zeichen, die hier nicht aufgeführt sind (dh nicht in aceghrsACEGHRS.
), werden nicht im Forum angezeigt.
Das Format der Eingabekoordinate ist flexibel und muss nicht mit dem Format der Ausgabekoordinaten übereinstimmen. Dies kann beispielsweise eine Liste mit zwei ganzzahligen Elementen, einem 2-Tupel, zwei Zahlen mit einem beliebigen Trennzeichen oder zwei Zeichen sein. Es kann auch entweder 0-indiziert oder 1-indiziert sein. Sie können davon ausgehen, dass sich die Koordinate auf dem Brett immer in eine Kanone ( C
oder c
) auflöst .
Die Koordinaten, zu denen die Kanone springen und sich bewegen kann, müssen in der Ausgabe in derselben Liste erscheinen. Eine Unterscheidung zwischen beiden ist nicht erforderlich. Akzeptable Formate für einzelne Ausgabekoordinaten sind dieselben wie für die Eingabekoordinate. Die Koordinaten können durch Zeilenumbrüche getrennt, als Liste oder eine andere Darstellung ausgegeben werden. Es ist keine bestimmte Reihenfolge erforderlich. Die Reihenfolge muss nicht einmal deterministisch sein.
Beachten Sie, dass Sprünge auf ein Stück der gleichen Farbe (Hülle) der Kanone nicht zulässig sind und daher nicht in der Ausgabe erscheinen können.
Testfälle
Beachten Sie, dass nicht alle Testfälle mögliche Xiangqi-Positionen sind.
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)]
Wertung
Dies ist Code-Golf , daher gewinnt die kürzeste Antwort (in Bytes). Viel Spaß beim Golfen!
quelle
Antworten:
Pip , 112 + 1 = 113 Bytes
Übernimmt die Eingabe als Befehlszeilenargumente: die beiden Koordinaten, gefolgt von den 10 Zeilen der Karte. Koordinaten basieren auf 0. Gibt Koordinaten wie
67 77
mit einem Zeilenumbruch zwischen der Liste derselben Zeile und der Liste derselben Spalte aus. Ein Byte für das-s
Flag hinzugefügt .Probieren Sie es online aus!
Erklärung der etwas ungolfed Version
Standardmäßig liest Pip Befehlszeilenargumente in die Liste ein
g
. Es speichert auch die ersten fünf Argumente in den Variablena
durche
. Unsere ersten beiden Argumentea
undb
sind die Koordinaten der Kanone;g
enthält die Koordinaten, gefolgt von den Zeilen der Tafel. Um nur das Boardg
einzubinden, schneiden wir es ab Index 2 auf und weisen es wiederg
(g@>:2
) zu.Nun definieren wir eine Funktion
f
. Diese Funktion akzeptiert zwei Argumente: eine Zeichenfolge, die eine Zeile oder Spalte der Tafel darstellt, und den Index der Kanone in dieser Zeichenfolge. Diese Argumente sind in der Funktion alsa
und verfügbarb
. Die Funktion gibt eine Liste aller Indizes zurück, die Punkte darstellen, zu denen sich die Kanone bewegen oder die sie erfassen kann.Zuerst testen wir , ob
a@b
istC
oderc
. Wenn dies derC
Fall ist, möchten wir, dass der Regex[a-z]
mit den Teilen übereinstimmt, die er erfassen kann. Wennc
ja, ist der reguläre Ausdruck[A-Z]
. (Der Golfcode generiert diese regulären Ausdrücke aus den integrierten Variablen für Klein- und Großbuchstaben.) WirY
fügen den entsprechenden regulären Ausdruck in diey
Variable ein.Wir ändern das Zeichen der Kanone in der Zeichenfolge in
@
(um es von anderen Kanonen in derselben Zeile / Spalte zu unterscheiden).Als nächstes folgt eine Reihe von Regex-Ersetzungen, die jeden Ort ändern, an dem die Kanone zu einem Weltraumcharakter gelangen kann. Die ersten Regex-
\.*@\.*
Übereinstimmungen sind@
von einer beliebigen Anzahl von Perioden umgeben, die alle leere Stellen darstellen, zu denen sich die Kanone bewegen kann. Die Ersetzung verwendet eine Rückruffunktion{aR'.s}
, um alle Punkte in Leerzeichen umzuwandeln.Die nächste Regex entspricht einem Stück, das die Kanone erfassen kann: entweder
[a-z]
oder[A-Z]
(je nachdem, in welchesy
zuvor gerissen wurde), gefolgt von\.*\w *@
(einer beliebigen Anzahl von Punkten , einem Buchstaben, einer beliebigen Anzahl von Leerzeichen und@
). Dies entspricht einer Zeichenfolge wieh..R @
(vorausgesetzt, die Kanone warC
). Die Rückruffunktions._@>1
schneidet das erste Zeichen ab und stellt ein Leerzeichen voran.Die dritte Regex ist ähnlich, passt aber eher zu einem erfassbaren Stück nach der Kanone als davor.
Schließlich kehrt die Funktion
a@*s
mit dem Operator find-all zurück, um eine Liste der Indizes aller Leerzeichen abzurufen.Wir rufen jetzt
f
die Kanonenreihe und erneut die Kanonensäule an. Die Zeichenfolge der Zeile istg@b
, wobei der Kanonenindex innerhalb der Zeichenfolge ista
. Die Funktion gibt eine Liste von Spaltennummern zurück, an die jeweils die Zeilennummer angehängt wirdb
. Wenn die Liste gedruckt wird,-s
setzt das Flag ein Leerzeichen zwischen die Koordinatenpaare.Um die Spalte zu erhalten, verwenden wir den
Z
IP-Operatorg
, um die resultierende Liste von Zeichen in eine Zeichenfolge zu transponieren , einen Index auszuwählena
und zuJ
speichern. Der Kanonenindex innerhalb dieser Zeichenfolge lautetb
. Die Funktion gibt eine Liste von Zeilennummern zurück, denen jeweils die Spaltennummer vorangestellt wirda
. Diese Liste ist der letzte Ausdruck im Programm und wird automatisch gedruckt.(Falls sich jemand wundert, dient das Ausdruckstrennzeichen
;
dazu,J
das Parsen als unärer Operator und nicht als binärer Operator zu erzwingen .)quelle