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 ( C
lub 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 golf-golf, więc wygrywa najkrótsza odpowiedź (w bajtach). Miłej gry w golfa!
źródło
Odpowiedzi:
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-s
flagi.Wypróbuj online!
Wyjaśnienie nieco nie golfowej wersji
Domyślnie Pip wczytuje na listę argumenty wiersza poleceń
g
. Przechowuje również pierwsze pięć argumentów w zmiennycha
przeze
. Nasze pierwsze dwa argumenty,a
ib
, są współrzędnymi armaty;g
zawiera 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 dog
(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 jakoa
ib
. 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@b
jestC
czyc
. Jeśli takC
, chcemy, aby wyrażenie[a-z]
pasowało do elementów, które może przechwycić. Jeśli takc
, to wyrażenie regularne to[A-Z]
. (Kod w golfa generuje teY
wyrażenia regularne z wbudowanych zmiennych dla małych i wielkich liter alfabetu.) Odpowiadamy odpowiednim wyrażeniem regularnym nay
zmienną.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óregoy
wcześniej zaciągnięto ), a następnie\.*\w *@
(dowolna liczba kropek, jedna litera, dowolna liczba spacji i@
). Będzie pasować do ciąguh..R @
(pod warunkiem, że działo byłoC
). Funkcja zwrotnas._@>1
odcina 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
f
rząd armaty i ponownie kolumnę armaty. Ciąg wiersza jestg@b
, a indeks działa znajduje się wewnątrz ciągua
. Funkcja zwraca listę numerów kolumn, do których dołączamy numer wierszab
. Po wydrukowaniu listy-s
flaga umieszcza spację między parami współrzędnych.Aby uzyskać kolumnę, używamy
Z
operatora ip do transpozycjig
, wyboru indeksua
iJ
wstawiania wynikowej listy znaków do łańcucha. Indeks armaty w tym ciągu tob
. Funkcja zwraca listę numerów wierszy, do których przed każdym numerem kolumny wstawiamya
. Ta lista, będąca ostatnim wyrażeniem w programie, jest automatycznie drukowana.(W przypadku, gdy ktoś zastanawia się, separator wyrażeń
;
ma wymusićJ
parsowanie jako operator jednoargumentowy, a nie binarny).źródło