대포는 어디로 갈 수 있습니까?


9

소개

중국 체스라고도 하는 xiangqi 게임은 중국, 베트남, 대만 및 기타 동아시아 국가에서 인기있는 체스와 유사한 게임입니다. xiangqi의 양면 색상은 빨간색과 검은 색입니다. xiangqi에는 장군 ( G), 고문 ( A), 코끼리 ( E), 말 ( H), 전차 ( R), 대포 ( C) 및 군인 ( S)의 7 가지 조각이 있습니다 . 이 문제를 해결하기 위해 대문자는 빨간색으로, 소문자는 검정색으로 간주합니다. 이 조각들 대부분은 서양 체스에서는 대등 한 것이지만, 대포라는 완전히 독특한 조각이 있습니다.

대포 체스에 루크 또는 샹치에서 전차합니다 (X 또는 Y 축선 중 어느 하나의 공간에 임의의 개수의 이동) 등으로 이동하지만,이 방법을 공격 할 수 없다. 대신, X 이상 Y 축 (가 이동 같은 방식으로) 함께 점프 공격 반대 색의 조각에 색상 (친구 또는 적) 및 착륙, 그것을 다음 캡처의 조각. 모든 체스 및 xiangqi 조각과 마찬가지로 대포는 자신의 색 조각을 캡처 할 수 없습니다.

예를 들어, 다음 다이어그램에서 대포 ( C)가 이동할 수 있는 공간 은로 표시되고 *, 점프 및 캡처 X할 수있는 공간은 검은 색 / 소문자가있는 것으로 가정합니다.

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

도전

xiangqi 보드와 해당 보드의 대포 좌표를 입력으로 받으면 대포가 이동하거나 이동할 수있는 좌표 목록을 출력하는 프로그램 또는 함수를 작성하십시오.

모든 I / O의 형식은 유연합니다.

xiangqi 보드에 허용되는 형식에는 줄 바꿈으로 구분 된 문자열, 문자열 목록 또는에없는 다른 구분 기호가있는 문자열이 aceghrsACEGHRS.있습니다. 보드가 항상 xiangqi 보드의 크기 인 9x10이라고 가정 할 수 있습니다.

보드 자체의 내용은 보드의 .빈 지점을 나타내는 여러 마침표 ( )와 조각을 나타내는 문자로 구성됩니다. 조각 대 문자 매핑은 다음과 같습니다.

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

대문자는 빨간색 조각을 나타내고 소문자는 검은 조각을 나타냅니다. 여기에 나열되지 않은 (즉,에없는 aceghrsACEGHRS.) 문자 는 보드에 나타나지 않습니다.

입력 좌표의 형식은 유연하며 출력 좌표의 형식과 일치하지 않아도됩니다. 예를 들어 두 개의 정수 요소, 두 개의 튜플, 구분 기호가있는 두 개의 숫자 또는 두 개의 문자 목록 일 수 있습니다. 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
Xiangqi의 경우 +1 중국 회사에서 일할 때 동료들에게서 배울 수있는 좋은 게임이었습니다. 일반적인 느낌은 체스를하는 것과 같지만 (방어를 위해 날카로운 눈을 유지하지만 공격적으로 플레이) 전술은 다릅니다 (전차를 일찍 꺼내는 것이 좋지만, 루크를 체스에서 일찍 내놓는 것은 좋지 않습니다). en.wikipedia .org / wiki / Xiangqi
Level River St

@LevelRiverSt 체스보다 기술이 훨씬 적고 전략적인 느낌이 다른 비디오 게임처럼 느껴집니다. 나는 그것을 좋아한다!
noɥʇʎԀʎzɐɹƆ

왕이 없을 수도 있지만 가능한 것 이상을 가질 수 있습니까?
l4m2

답변:


1

, 112 + 1 = 113 바이트

입력을 명령 행 인수로 사용합니다. 두 좌표와 그 뒤에 보드의 10 행. 좌표는 0을 기준으로합니다. 67 77같은 행 목록과 같은 열 목록 사이에 줄 바꿈을 사용하여과 같은 좌표를 출력 합니다. -s플래그에 1 바이트가 추가되었습니다 .

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)

온라인으로 사용해보십시오!

다소 ungolfed 버전의 설명

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통해 변수에 처음 5 개의 인수를 저장합니다 e. 우리의 처음 두 인수 a하고 b, 대포의 좌표; g좌표와 보드의 행이 포함됩니다. 보드를로 가져 오기 위해 g인덱스 2부터 보드를 분리하고 g( g@>:2)에 다시 할당합니다 .

이제 함수를 정의합니다 f. 이 함수는 보드의 행 또는 열을 나타내는 문자열과 해당 문자열에서 대포의 인덱스를 나타내는 두 가지 인수를 사용합니다. 이 인수는 함수 내에서 aand 로 사용할 수 있습니다 b. 이 함수는 대포가 이동할 수있는 지점을 나타내는 모든 인덱스 목록을 반환합니다.

첫째, 우리는 여부를 테스트 a@b입니다 Cc. 이 경우 C정규식 [a-z]이 캡처 할 수있는 조각과 일치하도록해야합니다. 이 경우 c정규 표현식은 [A-Z]입니다. (골프 코드는 소문자와 대문자 알파벳의 내장 변수에서 이러한 Y정규 표현식을 생성합니다 .) 적절한 정규 표현식을 y변수에 고정합니다.

문자열에서 대포 문자를 @(행 / 열의 다른 대포와 구별하기 위해)로 변경합니다.

다음은 일련의 정규식 대체품으로 대포가 공백 문자로 이동할 수있는 모든 위치를 변경합니다. 첫 번째 정규 표현식 \.*@\.*@여러 기간으로 둘러싸여 있으며 대포가 이동할 수있는 빈 지점을 나타냅니다. 대체는 콜백 함수 {aR'.s}를 사용하여 모든 기간을 공백으로 변경합니다.

중 : 다음 정규식 대포 캡처 할 수있는 부분과 일치 [a-z]또는 [A-Z](하나 꼴로 하였다에 따라 y다음 이전) \.*\w *@(어떤시기의 수, 하나 개의 문자를 공백의 수, 및 @). 이것은 h..R @(대포가 제공된 경우) 와 같은 문자열과 일치합니다 C. 콜백 함수 s._@>1는 첫 문자를 잘라 내고 공백을 추가합니다.

세 번째 정규 표현식은 비슷하지만 대포 이후의 캡처 가능한 부분과 일치합니다.

마지막으로이 함수는 a@*sfind-all 연산자를 사용하여를 반환 하여 모든 공백의 인덱스 목록을 가져옵니다.

우리는 이제 f대포의 줄과 대포의 열을 다시 호출 합니다. 행의 문자열은 입니다. g@b문자열 내부의 대포 색인은 a입니다. 이 함수는 행 번호를 추가하는 각각의 열 번호 목록을 반환합니다 b. 리스트가 인쇄되면 -s플래그는 좌표 쌍 사이에 공백을 둡니다.

열을 얻으려면, 우리는 사용 Z전치에 IP 연산자를 g선택 인덱스 aJ문자열로 문자의 결과 목록 OIN. 이 문자열 내에서 대포의 색인은 b입니다. 이 함수는 열 번호 앞에 행 번호 목록을 반환합니다 a. 프로그램에서 마지막 표현식 인이 목록은 자동 인쇄됩니다.

(누군가 궁금해하는 경우 표현식 구분 기호 ;J바이너리가 아닌 단항 연산자로 구문 분석해야합니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.