Gdzie może iść armata?

9

Wprowadzenie

Gra w Xiangqi , znana również jako szachy chińskie, jest grą podobną do szachów popularną w Chinach, Wietnamie, na Tajwanie i innych krajach Azji Wschodniej. Kolory obu stron w Xiangqi są czerwone i czarne. W Xiangqi jest siedem elementów: generał ( G), doradca ( A), słoń ( E), koń ( H), rydwan ( R), armata ( C) i żołnierz ( S). Do celów tego wyzwania wielkie litery są uważane za czerwone, a małe za czarne. Większość tych elementów ma przybliżony odpowiednik w szachach zachodnich, ale jest jeden całkowicie unikalny element: działo.

W armat porusza się jak wieża w szachy lub rydwan w Xiangqi (Moving dowolną liczbę miejsc na obu osiach X lub Y), ale nie mogą atakować w ten sposób. Zamiast tego atakuje, przeskakując wzdłuż osi X lub Y (w ten sam sposób, w jaki się porusza) nad jednym kawałkiem dowolnego koloru (przyjaciel lub wróg) i lądując na kawałku o przeciwnych kolorach, który następnie przechwytuje. Pamiętaj, że podobnie jak wszystkie szachy i figury xiangqi, armaty nie mogą uchwycić pionków własnego koloru.

Na przykład, na poniższym schemacie, pola, do których armata ( C) może się poruszać, są oznaczone *, a te, do których może skakać i przechwytywać, są oznaczone X, zakładając, że jest tam czarny / mały kawałek.

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

Wyzwanie

Napisz program lub funkcję, która biorąc pod uwagę tablicę xiangqi i współrzędne armaty na tej tablicy jako dane wejściowe, wyświetla listę współrzędnych, do których armata może się poruszać lub skakać.

Format wszystkich I / O jest elastyczny.

Dopuszczalne formaty dla tablicy xiangqi obejmują ciąg oddzielony znakiem nowej linii, listę ciągów lub ciąg znaków z dowolnym innym separatorem, którego nie ma aceghrsACEGHRS.. Możesz założyć, że plansza będzie zawsze miała rozmiar 9x10, czyli rozmiar planszy xiangqi.

Zawartość samej planszy będzie się składać z wielu kropek ( .), reprezentujących puste punkty na planszy i postaci reprezentujących pionki. Mapowanie poszczególnych elementów jest następujące:

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

Wielkie litery reprezentują czerwone elementy, a małe litery oznaczają czarne elementy. Postacie niewymienione tutaj (tj. Nie w aceghrsACEGHRS.) nie pojawią się na planszy.

Format współrzędnych wejściowych jest elastyczny i nie jest wymagany do dopasowania formatu współrzędnych wyjściowych. Może to być lista dwóch elementów całkowitych, na przykład 2-krotek, dwóch liczb z dowolnym separatorem lub dwóch znaków. Może być również indeksowany 0 lub indeksowany 1. Możesz założyć, że współrzędne na planszy zawsze będą rozpatrywane jako działo ( Club c).

Współrzędne, do których armata może skakać i przemieszczać się, muszą pojawić się na tej samej liście na wyjściu; rozróżnienie między nimi nie jest konieczne. Akceptowane formaty dla poszczególnych współrzędnych wyjściowych są takie same jak formaty dla współrzędnej wejściowej. Współrzędne mogą być oddzielone znakiem nowej linii, generowane jako lista lub dowolna inna reprezentacja. Żadne szczególne zamówienie nie jest konieczne; kolejność nie musi nawet być deterministyczna.

Zauważ, że skoki na kawałek tego samego koloru (obudowy) armaty są niezgodne z prawem i dlatego nie mogą pojawić się na wyjściu.

Przypadki testowe

Zauważ, że nie wszystkie przypadki testowe są możliwymi pozycjami 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)]

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź (w bajtach). Miłej gry w golfa!

Miedź
źródło
3
+1 dla Xiangqi. To niesamowita gra, którą miałem okazję uczyć się od moich kolegów, kiedy pracowałem dla chińskiej firmy. Ogólne wrażenie przypomina granie w szachy (uważaj na obronę, ale graj agresywnie), ale taktyka jest inna (dobrze jest wcześnie wyprowadzać rydwany, podczas gdy źle jest wyprowadzać wieże na początku szachów). En.wikipedia .org / wiki / Xiangqi
Level River St
@LevelRiverSt jest znacznie mniej techniczny niż szachy i wydaje się być grą wideo o innym strategicznym charakterze. Lubię to!
noɥʇʎԀʎzɐɹƆ
Wydaje się, że nie może być króla, ale czy może być więcej niż możliwy kawałek?
l4m2

Odpowiedzi:

1

Pip , 112 + 1 = 113 bajtów

Pobiera dane wejściowe jako argumenty wiersza poleceń: dwie współrzędne, po których następuje 10 linii tablicy. Współrzędne są oparte na 0. Wyświetla współrzędne podobne 67 77, z nowym wierszem między listą tego samego wiersza i listą tej samej kolumny. Dodano jeden bajt dla -sflagi.

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)

Wypróbuj online!

Wyjaśnienie nieco nie golfowej wersji

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)

Domyślnie Pip wczytuje na listę argumenty wiersza poleceń g. Przechowuje również pierwsze pięć argumentów w zmiennych aprzez e. Nasze pierwsze dwa argumenty, ai b, są współrzędnymi armaty; gzawiera współrzędne, po których następują rzędy planszy. Aby uzyskać tylko planszę g, odcinamy ją od indeksu 2 i przypisujemy z powrotem do g( g@>:2).

Teraz definiujemy funkcję f. Ta funkcja przyjmuje dwa argumenty: ciąg znaków reprezentujący rząd lub kolumnę planszy oraz indeks armaty w tym ciągu. Te argumenty są dostępne wewnątrz funkcji jako ai b. Funkcja zwróci listę wszystkich wskaźników reprezentujących miejsca, do których armata może się przenieść lub przechwycić.

Najpierw sprawdzamy, czy a@bjest Cczy c. Jeśli tak C, chcemy, aby wyrażenie [a-z]pasowało do elementów, które może przechwycić. Jeśli tak c, to wyrażenie regularne to [A-Z]. (Kod w golfa generuje te Ywyrażenia regularne z wbudowanych zmiennych dla małych i wielkich liter alfabetu.) Odpowiadamy odpowiednim wyrażeniem regularnym na yzmienną.

Zmieniamy znak armaty w ciągu na @(aby odróżnić go od innych armat w tym samym rzędzie / kolumnie).

Następnie pojawia się seria zamienników wyrażeń regularnych, które zmienią każde miejsce, w którym armata może przejść do postaci spacji. Pierwsze \.*@\.*dopasowania wyrażeń regularnych @otoczone dowolną liczbą okresów, z których wszystkie reprezentują puste miejsca, do których armata może się przenieść. Zastąpienie wykorzystuje funkcję wywołania zwrotnego, {aR'.s}aby zmienić wszystkie kropki na spacje.

Następny wyrażenie regularne odpowiada elementowi, który może przechwycić działo: albo ( [a-z]lub, [A-Z]zależnie od tego, do którego ywcześniej zaciągnięto ), a następnie \.*\w *@(dowolna liczba kropek, jedna litera, dowolna liczba spacji i @). Będzie pasować do ciągu h..R @(pod warunkiem, że działo było C). Funkcja zwrotna s._@>1odcina pierwszy znak i wstawia spację.

Trzecie wyrażenie regularne jest podobne, ale pasuje do chwytalnego elementu po armacie, a nie przed nim.

Na koniec funkcja powraca a@*s, używając operatora find-all, aby uzyskać listę indeksów wszystkich spacji.

Wzywamy teraz frząd armaty i ponownie kolumnę armaty. Ciąg wiersza jest g@b, a indeks działa znajduje się wewnątrz ciągu a. Funkcja zwraca listę numerów kolumn, do których dołączamy numer wiersza b. Po wydrukowaniu listy -sflaga umieszcza spację między parami współrzędnych.

Aby uzyskać kolumnę, używamy Zoperatora ip do transpozycji g, wyboru indeksu ai Jwstawiania wynikowej listy znaków do łańcucha. Indeks armaty w tym ciągu to b. Funkcja zwraca listę numerów wierszy, do których przed każdym numerem kolumny wstawiamy a. Ta lista, będąca ostatnim wyrażeniem w programie, jest automatycznie drukowana.

(W przypadku, gdy ktoś zastanawia się, separator wyrażeń ;ma wymusić Jparsowanie jako operator jednoargumentowy, a nie binarny).

DLosc
źródło