จุดจบของหมากรุก: สีขาวถึง Mate In One


19

ด้วยตารางตัวอักษรขนาด 8x8 ที่แสดงถึงสถานะปัจจุบันของเกมหมากรุกงานของโปรแกรมของคุณคือการค้นหาการเคลื่อนไหวครั้งต่อไปสำหรับสีขาวซึ่งจะส่งผลให้เกิดการรุกฆาต

อินพุต

อินพุตจะอยู่ใน STDIN - 8 บรรทัดละ 8 ตัวอักษร ความหมายของตัวละครแต่ละตัวมีดังนี้:

K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square

ตัวอักษรตัวพิมพ์ใหญ่หมายถึงชิ้นส่วนสีขาวและตัวพิมพ์เล็กแสดงถึงสีดำ กระดานจะถูกวางเพื่อให้สีขาวกำลังเล่นขึ้นจากด้านล่างและสีดำกำลังเล่นจากด้านบน

เอาท์พุต

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

ตัวอย่างอินพุต

ตัวอย่างที่ 1

การป้อนข้อมูล:

------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------

เอาท์พุท:

c6

ตัวอย่างที่ 2

การป้อนข้อมูล:

--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-

เอาท์พุท:

Nf5

ตัวอย่างที่ 3

การป้อนข้อมูล:

---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-

เอาท์พุท:

Rh5

คุณสามารถสันนิษฐานได้ว่าวิธีการแก้ปัญหาจะไม่เกี่ยวข้องกับการขว้าง

นี่คือ code-golf - ทางออกที่สั้นที่สุดชนะ

(ตัวอย่างที่นำมาจากmateinone.com - ปริศนา 81, 82 และ 83)


ไม่ฉันคิดว่าเพื่อจุดประสงค์ของคำถามนี้คุณสามารถสันนิษฐานได้ว่าคำตอบนั้นจะไม่เกี่ยวข้องกับการขว้างปา ฉันจะอัปเดตคำถาม
Gareth

เราควรจัดการตำแหน่งที่มีมากกว่าหนึ่งคู่ในหนึ่งเดียวได้อย่างไร?
Rob

@Rob ต้องการเพียงโซลูชันเดียวดังนั้นให้ออกโซลูชันใดก็ได้ที่คุณค้นหาก่อน
Gareth

มันปลอดภัยหรือไม่ที่จะสมมติว่าโซลูชันไม่เกี่ยวข้องกับการส่งเสริม
ปีเตอร์เทย์เลอร์

@ ปีเตอร์ใช่ฉันไม่ต้องการทำให้ปัญหายุ่งยากมากเกินไป
Gareth

คำตอบ:


7

Ruby, 589 512 510 499 493 ตัวอักษร

R=0..7
a=->b{o=[];R.map{|r|R.map{|c|v=Hash[?K,[6,7,8,11,13,16,17,18],?R,s=[157,161,163,167],?B,t=[156,158,166,168],?Q,s+t,?N,[1,3,5,9,15,19,21,23],?P,[32,181,183]][z=b[r][c]];v&&v.map{|s|k=2!=l=s/25+1;u=r;v=c;l.times{u+=s/5%5-2;v+=s%5-2;R===u&&R===v||break;t=b[u][v];j=t<?.&&l<8;(j||t=~/[a-z]/&&k)&&o<<=(h=b.map &:swapcase;h[u][v]=h[r][c];h[r][c]=?-;[z+"%c%d"%[97+v,8-u],h.reverse]);j&&(k||r==6)||break}}}};o}
a[$<.map{|l|l}].map{|m,b|a[b].any?{|f,x|a[x].all?{|g,y|y*""=~/K/}}||$><<m[/[^P]+/]}

อินพุตถูกให้ผ่าน stdin เช่น:

> ruby mateinone.rb
--------
--------
--------
-k------
b-------
-N-P----
--------
-----K-Q
^Z
Qb7

เอาท์พุทไม่ได้เป็นเพียงการเคลื่อนไหวเดียวที่บังคับให้คู่ครองในหนึ่งเดียว

แก้ไข 1:ใช้ฟังก์ชั่นeเพียงครั้งเดียวดังนั้นฉันจึงขีดเส้นใต้ ประการที่สองการเข้ารหัสในขณะนี้จะขึ้นอยู่กับหมายเลข 5 แทน 10 และการปรับโครงสร้างโคลนของบอร์ดจะช่วยประหยัดตัวอักษรได้เล็กน้อย

แก้ไข 2:ยังไม่ปรับปรุงเท่าที่ฉันต้องการ เปลี่ยนกัญชาจากไป{a=>b,c=>d} Hash[a,b,c,d]ค่าใช้จ่ายนี้มี 4 ตัวอักษร แต่จะบันทึกได้หนึ่งรายการต่อหนึ่งคู่คีย์ - ค่า

แก้ไข 3:การลดลงเล็กน้อยเท่านั้น: การทำเครื่องหมาย M (4 ตัวอักษร), t==?--> t<?.(2), ลบการจำนำโดยใช้สัญลักษณ์ทางพีชคณิตในตอนท้าย (2), แทนที่ put (3) โปรแกรมมีความยาวน้อยกว่า 500 ตัวอักษร

แก้ไข 4:เป็นที่น่าสนใจเท่าไหร่ยังคงสามารถค้นหาในโปรแกรมดังกล่าว ย้ายค่าคงที่ภายนอกลูปและพบการคำนวณซ้ำอื่น


โดย "ไม่หนึ่ง แต่คุณหมายถึง" ไม่จำเป็นต้องเป็นหนึ่ง แต่ทุกคน "?
แมทธิวอ่าน

@ Matewew คุณพูดถูก ฉันหมายถึง "ทุกคน"
Howard

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