Куда может пойти пушка?

9

Введение

Игра в сянци , также известная как китайские шахматы, является шахматной игрой, популярной в Китае, Вьетнаме, Тайване и других странах Восточной Азии. Цвета двух сторон в сянци - красный и черный. В сянци есть семь частей: общее ( 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)]

счет

Это поэтому самый короткий ответ (в байтах) выигрывает. Удачного игры в гольф!

медь
источник
3
+1 для Сянци. Это потрясающая игра, у меня была возможность учиться у моих коллег, когда я работал в китайской компании. Общее ощущение похоже на игру в шахматы (внимательно следите за защитой, но играйте агрессивно), но тактика другая (хорошо вывести колесницы рано, в то время как плохо вывести ладей рано в шахматы.) En.wikipedia .org / wiki / Xiangqi
Уровень Река Сент-
@LevelRiverSt гораздо менее техничен, чем шахматы, и выглядит как видеоигра с другим стратегическим ощущением. Мне это нравится!
noɥʇʎԀʎzɐɹƆ 10.09.16
Кажется, не может быть короля, но может ли быть больше, чем возможно?
l4m2

Ответы:

1

Пип , 112 + 1 = 113 байт

Принимает ввод в качестве аргументов командной строки: две координаты, за которыми следуют 10 строк доски. Координаты начинаются с 0. Выводит координаты, например 67 77, с новой строкой между списком с одинаковыми строками и списком с одинаковыми столбцами. Добавлен один байт для -sфлага.

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)

Попробуйте онлайн!

Объяснение несколько нелепой версии

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)

По умолчанию 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анализа как унарный оператор, а не как двоичный.)

DLosc
источник