Введение
Игра в сянци , также известная как китайские шахматы, является шахматной игрой, популярной в Китае, Вьетнаме, Тайване и других странах Восточной Азии. Цвета двух сторон в сянци - красный и черный. В сянци есть семь частей: общее ( G
), советник ( A
), слон ( E
), лошадь ( H
), колесница ( R
), пушка ( C
) и солдат ( S
). Для целей этого задания заглавные части считаются красными, а строчные - черными. Большинство из этих фигур имеют грубый эквивалент в западных шахматах, но есть одна совершенно уникальная фигура: пушка.
Эти пушки двигаются как ладья в шахматах или колесница в сяом (перемещении любого количества пробелов по обе оси Х или оси Y), но не может атаковать этот путь. Вместо этого он атакует, перепрыгивая вдоль осей X или Y (так же, как он движется) через одну фигуру любого цвета (друга или врага) и приземляясь на фигуру противоположного цвета, которую затем захватывает. Обратите внимание, что, как и все фигуры шахмат и сянци, пушки не могут захватывать фигуры своего цвета.
Например, на следующей диаграмме пространства, в которые cannon ( C
) может перемещаться, отмечены *
, а те, в которые он может прыгать и захватывать, отмечены X
, предполагая, что там есть черный / строчный фрагмент.
....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....
Вызов
Напишите программу или функцию, которая с учетом доски сянци и координат пушки на этой доске в качестве входных данных выводит список координат, по которым пушка может двигаться или прыгать.
Формат для всех операций ввода / вывода является гибким.
Приемлемые форматы для доски xiangqi включают строку, разделенную новой строкой, список строк или строку с любым другим разделителем, которого нет в aceghrsACEGHRS.
. Вы можете предположить, что доска всегда будет размером 9x10, размером с сянци.
Содержимое самой доски будет состоять из нескольких .
точек ( ), представляющих пустые точки на доске, и символов, представляющих фигуры. Отображение по частям выглядит следующим образом:
A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier
Прописные буквы обозначают красные части, а строчные буквы - черные. Символы, не перечисленные здесь (то есть не в aceghrsACEGHRS.
), не будут отображаться на доске.
Формат входной координаты гибкий, и не требуется совпадать с форматом выходных координат. Это может быть, например, список из двух целочисленных элементов, 2-кортежа, двух чисел с любым разделителем или двух символов. Также может быть 0-индексирован или 1-индексирован. Вы можете предположить, что координата на доске всегда будет соответствовать пушке ( C
или c
).
Координаты, по которым пушка может прыгать и двигаться, должны отображаться в том же списке при выводе; Различие между двумя не является необходимым. Приемлемые форматы для любых отдельных выходных координат такие же, как для входных координат. Координаты могут быть разделены новой строкой, выводиться в виде списка или любого другого представления. Никакого конкретного заказа не требуется; порядок даже не должен быть детерминированным.
Обратите внимание, что прыжки на части одного и того же цвета (корпуса) орудия недопустимы и, следовательно, не могут появиться в выходных данных.
Контрольные примеры
Обратите внимание, что не во всех тестовых случаях возможны позиции сянци.
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)]
счет
Это Код-гольфпоэтому самый короткий ответ (в байтах) выигрывает. Удачного игры в гольф!
источник
Ответы:
Пип , 112 + 1 = 113 байт
Принимает ввод в качестве аргументов командной строки: две координаты, за которыми следуют 10 строк доски. Координаты начинаются с 0. Выводит координаты, например
67 77
, с новой строкой между списком с одинаковыми строками и списком с одинаковыми столбцами. Добавлен один байт для-s
флага.Попробуйте онлайн!
Объяснение несколько нелепой версии
По умолчанию Pip считывает аргументы командной строки в список
g
. Он также сохраняет первые пять аргументов в переменныхa
черезe
. Наши первые два аргумента,a
иb
, являются координатами пушки;g
содержит координаты, за которыми следуют строки доски. Чтобы получить только доскуg
, мы отрезаем ее от индекса 2 и назначаем обратноg
(g@>:2
).Теперь мы определим функцию
f
. Эта функция принимает два аргумента: строку, представляющую строку или столбец доски, и индекс пушки в этой строке. Эти аргументы доступны внутри функции какa
иb
. Функция вернет список всех индексов, представляющих точки, в которые пушка может переместиться или захватить.Сначала мы проверяем,
a@b
есть лиC
илиc
. Если это такC
, мы хотим, чтобы регулярное выражение[a-z]
соответствовало частям, которые оно может захватить. Если это такc
, регулярное выражение есть[A-Z]
. (Гольф-код генерирует эти регулярные выражения из встроенных переменных для строчных и прописных букв.) МыY
добавляем соответствующее регулярное выражение вy
переменную.Мы изменили символ пушки в строке на
@
(чтобы отличить его от других пушек в той же строке / столбце).Затем следует серия замен регулярных выражений, которые изменят каждое место, где пушка может перейти к космическому персонажу. Первое
\.*@\.*
совпадение регулярного выражения@
окружено любым числом периодов, каждый из которых представляет собой пустые места, в которые может двигаться пушка. Замена использует функцию обратного вызова,{aR'.s}
чтобы изменить все периоды на пробелы.Следующее регулярное выражение соответствует фрагменту, который может захватить пушка: либо
[a-z]
или[A-Z]
(в зависимости от того, в какую из них были введеныy
ранее), затем\.*\w *@
(любое количество периодов, одна буква, любое количество пробелов и@
). Это будет соответствовать строке вродеh..R @
(при условии, что пушка былаC
). Функция обратного вызоваs._@>1
отключает первый символ и добавляет пробел.Третье регулярное выражение похоже, но соответствует захватываемому фрагменту после пушки, а не до нее.
Наконец, функция возвращает
a@*s
, используя оператор find-all, чтобы получить список индексов всех пробелов.Теперь мы вызываем
f
строку пушки и снова столбец пушки. Строка строкиg@b
с индексом пушки внутри строкиa
. Функция возвращает список номеров столбцов, к каждому из которых мы добавляем номер строкиb
. Когда список печатается,-s
флаг помещает пробел между парами координат.Чтобы получить столбец, мы используем
Z
оператор ip для транспонированияg
, выбора индексаa
иJ
вывода списка символов в строку. Индекс Кэннона в этой струнеb
. Функция возвращает список номеров строк, к каждому из которых мы добавляем номер столбцаa
. Этот список, являясь последним выражением в программе, печатается автоматически.(В случае, если кому-то интересно, разделитель выражений
;
используется дляJ
анализа как унарный оператор, а не как двоичный.)источник