Pháo có thể đi đâu?


9

Giới thiệu

Trò chơi xiangqi , còn được gọi là cờ Trung Quốc, là một trò chơi giống như cờ vua phổ biến ở Trung Quốc, Việt Nam, Đài Loan và các nước Đông Á khác. Màu sắc của hai bên trong xiangqi là đỏ và đen. Có bảy mảnh trong xiangqi: tướng ( G), cố vấn ( A), voi ( E), ngựa ( H), xe ngựa ( R), đại bác ( C) và lính ( S). Đối với mục đích của thử thách này, các mảnh chữ hoa được coi là các mảnh màu đỏ và chữ thường màu đen. Hầu hết các quân cờ này có một điểm tương đương thô trong cờ vua phương Tây, nhưng có một quân cờ hoàn toàn độc đáo: đại bác.

Các pháo di chuyển giống như một rook trong cờ hay một cỗ xe trong cờ tướng (di chuyển bất kỳ số lượng không gian ở hai X hoặc trục Y), nhưng không thể tấn công theo cách này. Thay vào đó, nó tấn công bằng cách nhảy dọc theo các trục X hoặc Y (giống như cách nó di chuyển) qua một mảnh bất kỳ màu nào (bạn hoặc kẻ thù) và hạ cánh trên mảnh màu đối diện, sau đó nó bắt được. Lưu ý rằng giống như tất cả các quân cờ và xiangqi, đại bác không thể chụp được các mảnh màu của riêng mình.

Ví dụ, trong sơ đồ sau, các không gian mà pháo ( C) có thể di chuyển được đánh dấu *và những không gian mà nó có thể nhảy và bắt được đánh dấu X, giả sử rằng có một mảnh màu đen / chữ thường ở đó.

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

Thử thách

Viết chương trình hoặc chức năng, đưa ra một bảng xiangqi và tọa độ của một khẩu pháo trên bảng đó làm đầu vào, đưa ra một danh sách các tọa độ mà pháo có thể di chuyển hoặc nhảy.

Định dạng cho tất cả I / O là linh hoạt.

Các định dạng có thể chấp nhận cho bảng xiangqi bao gồm một chuỗi phân tách dòng mới, danh sách các chuỗi hoặc một chuỗi với bất kỳ dấu phân cách nào khác không có trong aceghrsACEGHRS.. Bạn có thể giả sử bảng sẽ luôn là 9x10, kích thước của bảng xiangqi.

Nội dung của bảng sẽ bao gồm một số dấu chấm ( .), biểu thị các điểm trống trên bảng và các ký tự đại diện cho các mảnh. Ánh xạ mảnh đến ký tự như sau:

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

Chữ in hoa đại diện cho các mảnh màu đỏ và các chữ cái viết thường đại diện cho các mảnh màu đen. Các ký tự không được liệt kê ở đây (tức là không có aceghrsACEGHRS.) sẽ không xuất hiện trong bảng.

Định dạng của tọa độ đầu vào là linh hoạt và không bắt buộc phải khớp với định dạng của tọa độ đầu ra. Nó có thể là một danh sách gồm hai phần tử nguyên, một tuple 2, hai số với bất kỳ dấu phân cách hoặc hai ký tự, ví dụ. Nó cũng có thể là 0 chỉ mục hoặc 1 chỉ mục. Bạn có thể cho rằng tọa độ trên bảng sẽ luôn phân giải thành một khẩu pháo ( Choặc c).

Các tọa độ mà pháo có thể nhảy và di chuyển phải xuất hiện trong cùng một danh sách ở đầu ra; phân biệt giữa hai là không cần thiết. Các định dạng có thể chấp nhận cho bất kỳ tọa độ đầu ra riêng lẻ nào cũng giống như các định dạng cho tọa độ đầu vào. Các tọa độ có thể được phân tách bằng dòng mới, đầu ra dưới dạng danh sách hoặc bất kỳ đại diện nào khác. Không có thứ tự cụ thể là cần thiết; thứ tự thậm chí không phải là xác định.

Lưu ý rằng việc nhảy lên một mảnh cùng màu (vỏ) của khẩu pháo là không hợp pháp và do đó không thể xuất hiện trong đầu ra.

Các trường hợp thử nghiệm

Lưu ý rằng không phải tất cả các trường hợp thử nghiệm đều có thể là vị trí 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)]

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng. Chúc bạn chơi golf vui vẻ!


3
+1 cho Tương Kỳ. Đây là một trò chơi tuyệt vời, tôi đã có cơ hội học hỏi từ các đồng nghiệp của mình khi tôi làm việc cho một công ty Trung Quốc. Cảm giác chung giống như chơi cờ (giữ một đôi mắt sắc bén để phòng thủ nhưng chơi tích cực) nhưng chiến thuật thì khác (thật tốt khi đưa những cỗ xe ra sớm, trong khi thật tệ khi đưa những người mới chơi cờ vua sớm.) En.wikipedia .org / wiki / Xiangqi
River River St

@LevelRiverSt nó ít kỹ thuật hơn cờ vua và cảm thấy giống như một trò chơi điện tử với cảm giác chiến lược khác. Tôi thích nó!
noɥʇʎԀʎzɐɹƆ

Có vẻ như không có vua, nhưng có thể có nhiều hơn có thể?
l4m2

Câu trả lời:


1

Pip , 112 + 1 = 113 byte

Lấy đầu vào làm đối số dòng lệnh: hai tọa độ, theo sau là 10 dòng của bảng. Tọa độ là 0 dựa. Đầu ra tọa độ như thế 67 77, với một dòng mới giữa danh sách cùng hàng và danh sách cùng cột. Một byte được thêm cho -scờ.

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)

Hãy thử trực tuyến!

Giải thích về phiên bản hơi vô căn cứ

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)

Theo mặc định, Pip đọc dòng lệnh args vào danh sách g. Nó cũng lưu trữ năm đối số đầu tiên trong các biến athông qua e. Hai đối số đầu tiên của chúng tôi, ab, là tọa độ của khẩu pháo; gchứa tọa độ theo sau là các hàng của bảng. Để chỉ nhận bảng g, chúng tôi cắt nó từ chỉ số 2 trở đi và gán lại cho g( g@>:2).

Bây giờ chúng ta xác định một chức năng f. Hàm này có hai đối số: một chuỗi đại diện cho một hàng hoặc cột của bảng và chỉ mục của khẩu pháo trong chuỗi đó. Các đối số này có sẵn bên trong hàm như ab. Hàm này sẽ trả về một danh sách tất cả các chỉ số đại diện cho các điểm mà khẩu pháo có thể di chuyển đến hoặc bắt giữ.

Đầu tiên, chúng tôi kiểm tra xem a@bChay c. Nếu là vậy C, chúng ta sẽ muốn regex [a-z]khớp với các mảnh mà nó có thể chụp. Nếu đó là c, regex là [A-Z]. (Mã đánh gôn tạo ra các biểu thức chính này từ các biến dựng sẵn cho bảng chữ cái viết thường và viết hoa.) Chúng tôi ghi nhận Ybiểu thức chính quy phù hợp vào ybiến.

Chúng tôi thay đổi ký tự của pháo trong chuỗi thành @(để phân biệt với các khẩu pháo khác trong cùng một hàng / cột).

Tiếp đến là một loạt các thay thế regex, sẽ thay đổi mọi nơi mà khẩu pháo có thể đi đến một nhân vật không gian. Các \.*@\.*trận đấu regex đầu tiên được @bao quanh bởi bất kỳ số giai đoạn nào, tất cả đều thể hiện các điểm trống mà pháo có thể di chuyển. Sự thay thế sử dụng chức năng gọi lại {aR'.s}để thay đổi tất cả các khoảng thời gian thành không gian.

Regex tiếp theo khớp với một mảnh mà khẩu pháo có thể thu được: [a-z]hoặc [A-Z](tùy theo cái nào được kéo vào ytrước đó) theo sau \.*\w *@(bất kỳ số lượng thời gian, một chữ cái, bất kỳ số khoảng trắng và @). Điều này sẽ phù hợp với một chuỗi như h..R @(với điều kiện là pháo C). Hàm gọi lại s._@>1cắt bỏ ký tự đầu tiên và thêm một khoảng trắng.

Regex thứ ba là tương tự, nhưng phù hợp với một mảnh có thể chụp được sau khẩu pháo chứ không phải trước nó.

Cuối cùng, hàm trả về a@*s, sử dụng toán tử find-all để lấy danh sách các chỉ số của tất cả các khoảng trắng.

Bây giờ chúng tôi gọi fhàng của pháo và một lần nữa trên cột của pháo. Chuỗi của hàng là g@b, với chỉ số của pháo bên trong chuỗi a. Hàm trả về một danh sách các số cột, cho mỗi số chúng ta nối thêm số hàng b. Khi danh sách được in, -scờ sẽ đặt khoảng trắng giữa các cặp tọa độ.

Để có được cột, chúng tôi sử dụng Ztoán tử ip để hoán vị g, chọn chỉ mục avà nhập Jvào danh sách các ký tự kết quả thành một chuỗi. Chỉ số của pháo trong chuỗi này là b. Hàm trả về một danh sách các số hàng, cho mỗi số mà chúng tôi thêm vào số cột a. Danh sách này, là biểu thức cuối cùng trong chương trình, được tự động in.

(Trong trường hợp bất kỳ ai thắc mắc, trình phân tách biểu thức ;sẽ ở đó để buộc Jphân tích thành một toán tử đơn nguyên thay vì nhị phân.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.