Wohin kann die Kanone gehen?

9

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 Cmarkiert *, 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 ( Coder 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 , daher gewinnt die kürzeste Antwort (in Bytes). Viel Spaß beim Golfen!

Kupfer
quelle
3
+1 für Xiangqi. Es ist ein großartiges Spiel, dass ich die Gelegenheit hatte, von meinen Kollegen zu lernen, als ich für eine chinesische Firma arbeitete. Das allgemeine Gefühl ist wie beim Schachspielen (ein scharfes Auge für die Verteidigung haben, aber aggressiv spielen), aber die Taktik ist anders (es ist gut, die Streitwagen früh herauszubringen, während es schlecht ist, die Türme früh im Schach herauszubringen.) En.wikipedia .org / wiki / Xiangqi
Level River St
@LevelRiverSt Es ist viel weniger technisch als Schach und fühlt sich an wie ein Videospiel mit einem anderen strategischen Gefühl. Ich mag das!
noɥʇʎԀʎzɐɹƆ
Es scheint, dass es keinen König gibt, aber kann es mehr als ein mögliches Stück geben?
14 m2

Antworten:

1

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 77mit einem Zeilenumbruch zwischen der Liste derselben Zeile und der Liste derselben Spalte aus. Ein Byte für das -sFlag hinzugefügt .

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)

Probieren Sie es online aus!

Erklärung der etwas ungolfed Version

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)

Standardmäßig liest Pip Befehlszeilenargumente in die Liste ein g. Es speichert auch die ersten fünf Argumente in den Variablen adurch e. Unsere ersten beiden Argumente aund bsind die Koordinaten der Kanone; genthält die Koordinaten, gefolgt von den Zeilen der Tafel. Um nur das Board geinzubinden, schneiden wir es ab Index 2 auf und weisen es wieder g( 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 als aund verfügbar b. 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@bist Coder c. Wenn dies der CFall ist, möchten wir, dass der Regex [a-z]mit den Teilen übereinstimmt, die er erfassen kann. Wenn cja, 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.) Wir Yfügen den entsprechenden regulären Ausdruck in die yVariable 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 welches yzuvor gerissen wurde), gefolgt von \.*\w *@(einer beliebigen Anzahl von Punkten , einem Buchstaben, einer beliebigen Anzahl von Leerzeichen und @). Dies entspricht einer Zeichenfolge wie h..R @(vorausgesetzt, die Kanone war C). Die Rückruffunktion s._@>1schneidet 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@*smit dem Operator find-all zurück, um eine Liste der Indizes aller Leerzeichen abzurufen.

Wir rufen jetzt fdie Kanonenreihe und erneut die Kanonensäule an. Die Zeichenfolge der Zeile ist g@b, wobei der Kanonenindex innerhalb der Zeichenfolge ist a. Die Funktion gibt eine Liste von Spaltennummern zurück, an die jeweils die Zeilennummer angehängt wird b. Wenn die Liste gedruckt wird, -ssetzt das Flag ein Leerzeichen zwischen die Koordinatenpaare.

Um die Spalte zu erhalten, verwenden wir den ZIP-Operator g, um die resultierende Liste von Zeichen in eine Zeichenfolge zu transponieren , einen Index auszuwählen aund zu Jspeichern. Der Kanonenindex innerhalb dieser Zeichenfolge lautet b. Die Funktion gibt eine Liste von Zeilennummern zurück, denen jeweils die Spaltennummer vorangestellt wird a. Diese Liste ist der letzte Ausdruck im Programm und wird automatisch gedruckt.

(Falls sich jemand wundert, dient das Ausdruckstrennzeichen ;dazu, Jdas Parsen als unärer Operator und nicht als binärer Operator zu erzwingen .)

DLosc
quelle