Куди може піти гармата?


9

Вступ

Гра в xiangqi , також відома як китайські шахи, є шаховою грою, популярною в Китаї, В'єтнамі, Тайвані та інших країнах Східної Азії. Кольори двох сторін у xiangqi - червоний і чорний. У xiangqi є сім штук: генерал ( G), радник ( A), слон ( E), кінь ( H), колісниця ( R), гармата ( C) та солдат ( S). Для цілей цього виклику великі шматки вважаються червоними, а малі - чорними. Більшість із цих творів мають грубі еквіваленти в західних шахах, але є одна абсолютно унікальна штука: гармата.

Ці гармати рухаються як тура в шахах або колісниця в Сяомей (переміщенні будь-якої кількості прогалин по обидві осі Х або осі Y), але не може атакувати цей шлях. Натомість вона атакує, стрибаючи по осях X або Y (так само, як рухається) через один шматок будь-якого кольору (друг чи ворог) та приземляючись на шматок протилежного кольору, який потім захоплює. Зауважте, що, як і всі шахові та сянцкі фігури, гармати не можуть захоплювати шматочки власного кольору.

Наприклад, на наступній діаграмі пробіли, до яких Cможе рухатися гармата ( ), позначені *, і ті, до яких він може стрибати і захоплювати, позначені X, припускаючи, що там є чорний / малий шматок.

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

Виклик

Напишіть програму або функцію, яка, враховуючи дошку xiangqi та координати гармати на цій дошці як вхід, виводить список координат, до яких гармата може рухатися чи стрибати.

Формат для всіх вводу-виводу є гнучким.

Прийнятні формати для плати xiangqi включають рядок, розділений для нового рядка, список рядків або рядок з будь-яким іншим роздільником, який не знаходиться aceghrsACEGHRS.. Ви можете припустити, що дошка завжди буде розміром 9x10, розмір дошки xiangqi.

Вміст самої дошки буде складатися з декількох періодів ( .), що представляють порожні точки на дошці та символи, що представляють фрагменти. Відображення по персонажу полягає в наступному:

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

Великі літери представляють червоні шматки, а малі літери - чорні шматки. Символи, не вказані тут (тобто не в aceghrsACEGHRS.), не з'являться на дошці.

Формат вхідної координати є гнучким і не вимагає відповідності формату вихідних координат. Це може бути список двох цілих елементів, 2-кортеже, двох чисел з будь-яким роздільником, або двох символів, наприклад. Він також може бути або 0-індексованим, або 1-індексованим. Ви можете припустити, що координата на дошці завжди буде відповідати гармати ( Cабо c).

Координати, до яких гармата може стрибати і переміщатися, повинні відображатися в тому ж списку на виході; розмежувати їх не потрібно. Прийнятні формати для будь-яких окремих вихідних координат такі ж, як і для вхідної координати. Координати можуть бути розділені новою лінією, виводитись у вигляді списку чи будь-якого іншого подання. Особливого замовлення не потрібно; наказ навіть не повинен бути детермінованим.

Зауважте, що стрибки на шматок одного кольору (корпус) гармати не є законними, і тому вони не можуть відображатися у висновку.

Тестові справи

Зауважте, що не у всіх тестових випадках можливі позиції 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)]

Оцінка балів

Це є , тому найкоротша відповідь (у байтах) виграє. Щасливого гольфу!


3
+1 для Xiangqi. Це дивовижна гра, що я мав можливість вчитися у своїх колег, коли працював у китайській компанії. Загальне відчуття так само, як грати в шахи (пильно стежте за захистом, але грайте агресивно), але тактики різні (добре виводити колісниці рано, тоді як погано виводити граків рано в шахи.) En.wikipedia .org / wiki / Xiangqi
Рівень річки Св.

@LevelRiverSt це набагато менш технічно, ніж шахи, і відчуває себе відеоіграми з іншим стратегічним почуттям. Мені це подобається!
noɥʇʎԀʎzɐɹƆ

Здається, короля може не бути, але чи може бути більше, ніж можливий шматок?
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розбиратись як одинарний оператор, а не двійковий.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.