ปืนใหญ่ไปได้ที่ไหน


9

บทนำ

เกมเซียงฉีหรือที่รู้จักกันในชื่อหมากรุกจีนเป็นเกมหมากรุกที่ได้รับความนิยมในประเทศจีนเวียดนามไต้หวันและประเทศอื่น ๆ ในเอเชียตะวันออก สีของทั้งสองฝ่ายในเซียงกิเป็นสีแดงและดำ เซียงกิมีเจ็ดชิ้น: นายพล ( G), ที่ปรึกษา ( A), ช้าง ( E), ม้า ( H), ราชรถ ( R), ปืนใหญ่ ( C), และทหาร ( S) สำหรับจุดประสงค์ของการท้าทายชิ้นส่วนตัวพิมพ์ใหญ่ถือว่าเป็นสีแดงและตัวพิมพ์เล็กเป็นสีดำ ชิ้นส่วนเหล่านี้ส่วนใหญ่มีความเท่าเทียมกันในหมากรุกตะวันตก แต่มีชิ้นเดียวที่ไม่เหมือนใคร: ปืนใหญ่

ปืนใหญ่ย้ายเช่นโกงในเกมหมากรุกหรือรถม้าในหมากรุกเป็น (ย้ายจำนวนของช่องว่างในทั้ง X หรือแกน Y ใด ๆ ) แต่ไม่สามารถโจมตีด้วยวิธีนี้ แต่มันโจมตีโดยการกระโดดพร้อม X หรือ Y แกน (แบบเดียวกับที่มันเคลื่อน) มากกว่าหนึ่งชิ้นส่วนของสีใด ๆ (เพื่อนหรือศัตรู) และเชื่อมโยงไปเกี่ยวกับชิ้นส่วนที่อยู่ตรงข้ามสีซึ่งมันก็จับ โปรดทราบว่าเช่นเดียวกับหมากรุกและชิ้นเซียงกิทั้งหมดปืนใหญ่ไม่สามารถจับชิ้นสีของตัวเองได้

ตัวอย่างเช่นในแผนภาพต่อไปนี้ช่องว่างที่ปืนใหญ่ ( C) สามารถเคลื่อนย้ายได้ถูกทำเครื่องหมายด้วย*และพื้นที่ที่สามารถกระโดดและจับภาพได้จะถูกทำเครื่องหมายด้วยXโดยสมมติว่ามีชิ้นส่วนสีดำ / ตัวพิมพ์เล็กอยู่ที่นั่น

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

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดบอร์ด xiangqi และพิกัดของปืนใหญ่บนบอร์ดนั้นเป็นอินพุตเอาต์พุตรายการของพิกัดที่ปืนใหญ่สามารถเคลื่อนที่หรือกระโดดได้

รูปแบบสำหรับ I / O ทั้งหมดนั้นมีความยืดหยุ่น

รูปแบบที่ยอมรับได้สำหรับกระดานหมากรุก ได้แก่ สตริงขึ้นบรรทัดใหม่คั่นรายการของสตริงหรือสตริงกับแยกอื่น ๆ aceghrsACEGHRS.ที่ไม่ได้อยู่ใน คุณอาจคิดว่าบอร์ดจะมีขนาด 9x10 เสมอขนาดของบอร์ดเซียงกิ

เนื้อหาของคณะกรรมการจะประกอบด้วยระยะเวลา ( .) แสดงถึงจุดที่ว่างเปล่าบนกระดานและตัวละครที่เป็นตัวแทนของชิ้นส่วน การแมปตัวต่ออักขระเป็นดังนี้:

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

ตัวอักษรตัวพิมพ์ใหญ่แทนชิ้นส่วนสีแดงและตัวอักษรตัวพิมพ์เล็กแทนชิ้นส่วนสีดำ ตัวละครที่ไม่ได้ระบุไว้ที่นี่ (เช่นไม่ได้อยู่ในaceghrsACEGHRS.) จะไม่ปรากฏในกระดาน

รูปแบบของพิกัดอินพุตมีความยืดหยุ่นและไม่จำเป็นต้องตรงกับรูปแบบของพิกัดเอาต์พุต มันสามารถเป็นรายการของสององค์ประกอบจำนวนเต็ม, 2-tuple, สองตัวเลขด้วยตัวคั่นใด ๆ หรือสองตัวอักษรตัวอย่างเช่น มันอาจเป็นดัชนี 0 หรือดัชนี 1 ก็ได้ คุณอาจสันนิษฐานว่าพิกัดบนกระดานมักจะแก้ไขเป็นปืนใหญ่ ( Cหรือc)

พิกัดที่ปืนใหญ่สามารถกระโดดและย้ายจะต้องปรากฏในรายการเดียวกันในเอาต์พุต ไม่จำเป็นต้องแยกความแตกต่างระหว่างทั้งสอง รูปแบบที่ยอมรับได้สำหรับพิกัดเอาต์พุตแต่ละรายการจะเหมือนกับรูปแบบอินพุต coord พิกัดอาจคั่นด้วยบรรทัดใหม่เอาท์พุทเป็นรายการหรือการแสดงอื่น ๆ ไม่จำเป็นต้องมีคำสั่งเฉพาะ คำสั่งไม่จำเป็นต้องกำหนดขึ้น

โปรดทราบว่าการกระโดดลงบนชิ้นส่วนที่มีสีเดียวกัน (กล่อง) ของปืนใหญ่นั้นไม่ถูกกฎหมายดังนั้นจึงไม่สามารถปรากฏในเอาต์พุต

กรณีทดสอบ

โปรดทราบว่าไม่ใช่ทุกกรณีทดสอบที่เป็นไปได้ในตำแหน่งเซียงกิ

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

Pip , 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 อ่าน args gบรรทัดคำสั่งลงในรายการ นอกจากนี้ยังเก็บอาร์กิวเมนต์ที่ห้าครั้งแรกในตัวแปรผ่านa eข้อโต้แย้งสองข้อแรกของเราaและbเป็นพิกัดของปืนใหญ่ gมีพิกัดตามด้วยแถวของกระดาน เพื่อให้ได้บอร์ดเพียงแค่gเราเชือดมันจากดัชนี 2 เป็นต้นไปและกำหนดกลับไปที่g( g@>:2)

fตอนนี้เรากำหนดฟังก์ชัน ฟังก์ชั่นนี้รับอาร์กิวเมนต์สองตัว: สตริงที่แทนแถวหรือคอลัมน์ของบอร์ดและดัชนีของปืนใหญ่ในสายนั้น ข้อโต้แย้งเหล่านี้มีฟังก์ชั่นภายในเป็นและa bฟังก์ชั่นจะส่งกลับรายการดัชนีทั้งหมดที่แสดงถึงจุดที่ปืนใหญ่สามารถย้ายไปหรือจับภาพได้

ครั้งแรกที่เราทดสอบว่าa@bเป็นหรือC cถ้าเป็นCเช่นนั้นเราจะต้องการให้ regex [a-z]จับคู่กับส่วนที่จับได้ ถ้ามันc, regex [A-Z]คือ (รหัส golfed สร้าง regexes เหล่านี้จากตัวแปรบิวอินสำหรับตัวอักษรตัวพิมพ์เล็กและตัวใหญ่) เราYใส่ regex ที่เหมาะสมลงในyตัวแปร

เราเปลี่ยนลักษณะของปืนใหญ่ในสตริงเป็น@(เพื่อแยกความแตกต่างจากปืนใหญ่อื่น ๆ ในแถว / คอลัมน์เดียวกัน)

ถัดไปเป็นชุดของการเปลี่ยน regex ซึ่งจะเปลี่ยนทุกสถานที่ปืนใหญ่สามารถไปที่ตัวละครอวกาศ การ\.*@\.*จับคู่regex แรก@ล้อมรอบด้วยจำนวนของช่วงเวลาใด ๆ ซึ่งทั้งหมดเป็นตัวแทนของจุดที่ว่างเปล่าที่ปืนใหญ่สามารถเคลื่อนย้าย การแทนที่ใช้ฟังก์ชันการโทรกลับ{aR'.s}เพื่อเปลี่ยนช่วงเวลาทั้งหมดเป็นช่องว่าง

regex ถัดไปจับคู่ชิ้นส่วนปืนใหญ่ที่สามารถจับภาพ: [a-z]หรือ[A-Z](ขึ้นอยู่กับว่าถูกดึงเข้าไปyก่อน) ตามด้วย\.*\w *@(จำนวนใด ๆ ของช่วงเวลาหนึ่งตัวอักษรจำนวนช่องว่างใด ๆ และ@) สิ่งนี้จะจับคู่สตริงเช่นh..R @(หากมีปืนใหญ่อยู่C) ฟังก์ชั่นการโทรกลับs._@>1หั่นตัวอักษรตัวแรกออกและเตรียมพื้นที่

Regex ที่สามนั้นคล้ายกัน แต่ตรงกับส่วนที่จับได้หลังจากปืนใหญ่มากกว่าก่อน

ในที่สุดฟังก์ชั่นกลับa@*sมาโดยใช้ตัวดำเนินการค้นหาทั้งหมดเพื่อรับรายการดัชนีของช่องว่างทั้งหมด

ตอนนี้เราเรียกfแถวของปืนใหญ่และอีกครั้งในคอลัมน์ของปืนใหญ่ สตริงแถวเป็นดัชนีของแคนนอนที่ภายในเป็นสตริงg@b ฟังก์ชั่นส่งกลับรายการของตัวเลขคอลัมน์แต่ละที่เราผนวกหมายเลขแถวa bเมื่อรายการถูกพิมพ์-sแฟล็กจะใส่ช่องว่างระหว่างคู่พิกัด

ในการรับคอลัมน์เราใช้ตัวZดำเนินการ ip เพื่อย้ายgเลือกดัชนีaและJใช้รายการผลลัพธ์ของอักขระเป็นสตริง bดัชนีปืนใหญ่ภายในสายนี้คือ ฟังก์ชั่นจะส่งกลับรายการหมายเลขแถวโดยที่แต่ละหมายเลขนั้นเราเติมหมายเลขคอลัมน์aไว้ รายการนี้เป็นนิพจน์สุดท้ายในโปรแกรมที่พิมพ์อัตโนมัติ

(ในกรณีที่มีใครสงสัยตัวคั่นนิพจน์;อยู่ที่นั่นเพื่อบังคับJให้แยกวิเคราะห์เป็นตัวดำเนินการเอกแทนที่จะเป็นเลขฐานสอง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.