มันเป็นท่าหมากรุกที่ถูกต้องหรือไม่?


15

ชื่อสำรองของ: ChessMoveQ

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

รายการแรกระบุตำแหน่งของทั้ง 32 ชิ้นบนกระดาน แต่ละองค์ประกอบจะเป็นไปตามโครงสร้าง<colour>, <piece-name>, <x-coord>, <y-coord>เช่น["W", "K", 5, 1]ซึ่งบ่งชี้ว่าราชาขาวนั้นอยู่บน5, 1( e1บนกระดานหมากรุกทั่วไป) องค์ประกอบทั้งหมดของอินพุตแรกจะไม่ซ้ำกัน <x-coord>และ<y-coord>จะอยู่ระหว่าง 1 ถึง 8 เสมอตัวอย่างหนึ่ง ได้แก่ :

[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8],
 ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7],
 ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7],
 ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3],
 ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1],
 ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2],
 ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]

ซึ่งจะเป็นตัวแทนของคณะกรรมการ:

กระดานหมากรุกตัวอย่าง

อินพุตที่สองจะประกอบด้วยโครงสร้างเดียวกันกับรายการย่อยของรายการแรก แต่แทนที่จะเป็นพิกัด x และ y เพื่อระบุตำแหน่งของชิ้นส่วนพวกเขาจะระบุตำแหน่งที่พยายามย้ายไป

สำหรับตัวอย่างข้างต้นการเคลื่อนไหวที่ถูกต้องอาจเป็นได้["W", "B", 4, 3](อธิการย้ายหนึ่งช่องไปข้างหน้าและไปทางซ้าย) และการเคลื่อนไหวที่ไม่ถูกต้องอาจเป็น["B", "R", 4, 1]เหมือนเกมโกงจะต้องเคลื่อนที่ผ่านอัศวินและผู้จำนำเพื่อไปที่จัตุรัส ขณะที่การย้ายอาจจะหมายถึงหลายชิ้นในช่วงเวลาที่คุณต้องทดสอบว่าใด ๆของชิ้นส่วนที่ระบุสามารถทำให้การย้ายที่ไม่เพียงหนึ่งของพวกเขา ตัวอย่างเช่นตัวอย่างแรกใช้ได้กับอธิการเพียงคนเดียว แต่ยังคงเป็นการเคลื่อนไหวที่ถูกต้อง อย่างไรก็ตาม rook ดำไม่สามารถทำการเคลื่อนไหวที่สองดังนั้นจึงไม่ถูกต้อง

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

  • ชิ้นส่วนใด ๆ : ไม่มีชิ้นใดสามารถเคลื่อนย้ายไปยังช่องสี่เหลี่ยมที่ถูกครอบครองอยู่แล้วหรือออกจากกระดานยกเว้นว่าช่องนั้นจะถูกครอบครองโดยชิ้นส่วนจากสีอื่น ตัวอย่างเช่นชิ้นส่วนสีขาวอาจย้ายไปยังสี่เหลี่ยมจัตุรัสที่ครอบครองโดยชิ้นส่วนสีดำ แต่ไม่ใช่ชิ้นส่วนสีขาว นอกจากนี้ไม่มีชิ้นใดยกเว้นอัศวินสามารถย้ายไปยังช่องสี่เหลี่ยมที่ถูกบดบังด้วยชิ้นส่วนอื่นโดยตรง
    • ย้ายโดยชิ้นBไปที่ตารางCคือ "อุปสรรคโดยตรง" โดยชิ้นถ้าโดยตรงในตรง (มุมฉากหรือแนวทแยง) สายระหว่างBและC
  • ทุกชิ้น : ตำแหน่งของกษัตริย์สามารถส่งผลต่อความถูกต้องของการเคลื่อนไหวได้ หากตรงตามเงื่อนไขสองข้อใดข้อหนึ่งการย้ายจะไม่ถูกต้อง:
    • เผยให้เห็นกษัตริย์เพื่อตรวจสอบโดยการย้ายชิ้นส่วนในด้านเดียวกันเป็นกษัตริย์ที่ใกล้สูญพันธุ์ สิ่งนี้ใช้ได้เฉพาะเมื่อชิ้นส่วนที่ไม่ใช่ของฝ่ายตรงข้ามเคลื่อนไหวเท่านั้นแทนที่จะเป็นชิ้นส่วนที่เคลื่อนไหวเพื่อย้ายกษัตริย์เพื่อตรวจสอบ
    • ออกจากกษัตริย์ในการตรวจสอบในกรณีที่มีการย้ายออกจากเช็ค ดังนั้นหากพระราชาอยู่ในการตรวจสอบและการเคลื่อนไหวกำหนดว่าชิ้นส่วนอื่นจะย้ายมันเป็นย้ายที่ไม่ถูกต้องเว้นแต่ชิ้นอื่นจะป้องกันการตรวจสอบ ชิ้นหนึ่งสามารถป้องกันการตรวจสอบด้วยวิธีใดวิธีหนึ่งจากสองวิธี: ไม่ว่าจะเป็นการตรวจสอบชิ้นงานหรือขัดขวางเส้นทางระหว่างการตรวจสอบชิ้นงานและกษัตริย์
    • "เช็ค" เป็นสถานการณ์ที่ฝ่ายตรงข้ามของกษัตริย์สามารถ (ถ้าเป็นตาของพวกเขาที่จะย้าย) ถูกต้องตามกฎหมายย้ายชิ้นส่วนไปยังกษัตริย์ที่ กฎนี้ใช้ไม่ได้ซ้ำ ๆ เช่นกษัตริย์อยู่ในการตรวจสอบแม้ว่าการเคลื่อนไหวโดยฝ่ายตรงข้ามกับกษัตริย์ที่จะออกจากกษัตริย์ของตัวเองในการตรวจสอบ
  • เบี้ย : จำนำสามารถย้ายไปข้างหน้า (เช่นขึ้นไปถ้าสีขาวลงไปถ้าสีดำ) หนึ่งตารางไปยังตารางที่ว่าง นอกจากนี้ยังมีสามสถานการณ์พิเศษ:
    • หากเบี้ยยังไม่ได้ย้าย (คุณสามารถกำหนดได้โดยใช้พิกัด Y; จำนำสีขาวไม่ได้ย้ายถ้าพิกัด Y ของพวกเขาคือ 2, เบี้ยสีดำไม่ได้ย้ายถ้าพิกัดของพวกเขาคือ 7) จำนำ ได้รับอนุญาตให้ย้ายสองช่องไปข้างหน้าไปยังช่องว่าง
    • หากมีชิ้นส่วนของฝ่ายตรงข้ามในแนวทแยงหน้าเบี้ย (เช่นในตารางไปทางทิศตะวันตกเฉียงเหนือหรือตะวันออกเฉียงเหนือของเบี้ยถ้ามันเป็นสีขาวหรือไปทางตะวันตกเฉียงใต้หรือตะวันออกเฉียงใต้ถ้ามันเป็นสีดำ) จำนำได้รับอนุญาตให้ย้ายไปยังตารางที่มีปัญหา
    • หากจำนำย้ายไปพิกัด Y สุดท้าย (8 สำหรับสีขาวหรือ 1 สำหรับสีดำ) ในกฎหมากรุกปกติจะต้องได้รับการเลื่อนตำแหน่งให้เป็นราชินี, โกง, อัศวินหรือบิชอปที่มีสีเดียวกัน สำหรับวัตถุประสงค์ของคำถามนี้ตัวเลือกการส่งเสริมการขายนั้นไม่เกี่ยวข้องกับการย้ายที่ถูกต้องหรือไม่ (และไม่สามารถแสดงในรูปแบบการป้อนข้อมูล) ได้ แต่ต้องมีการอนุญาตให้เลื่อนการจำนำที่จะส่งผลให้มีการเลื่อนตำแหน่ง
  • บิชอป : บิชอปสามารถเคลื่อนที่ได้ระหว่าง 1 ถึง 8 กำลังสองตามแนวเส้นทางระหว่าง intercardinal ที่ไม่มีสิ่งกีดขวาง (เช่นเส้นทแยงมุม)
  • อัศวิน : อัศวินสามารถเคลื่อนที่เป็นLรูปร่างได้ประกอบด้วยการเคลื่อนไหวอย่างใดอย่างหนึ่งต่อไปนี้ (เทียบเท่า):
    • สี่เหลี่ยมจัตุรัสเดียวในทิศทางใดก็ตามตามด้วยการเลี้ยว 90/270 °ตามด้วยการเคลื่อนที่สุดท้ายของ 2 สี่เหลี่ยมไปข้างหน้า
    • 2 สี่เหลี่ยมในทิศทางที่สำคัญใด ๆ ตามมาด้วยการเลี้ยว 90/270 °ตามด้วยการเคลื่อนที่ครั้งสุดท้ายของจตุรัสเดี่ยวไปข้างหน้า
    (โปรดจำไว้ว่าเส้นทางของอัศวินไม่สามารถถูกบล็อกได้โดยการสอดแทรกชิ้นส่วนแม้ว่าตารางสุดท้ายจะต้องถูกกฎหมาย)
  • Rooks : Rooks สามารถเคลื่อนที่ระหว่าง 1 ถึง 8 กำลังสองตามแนวเส้นทางที่ไม่มีสิ่งกีดขวางใด ๆ
  • ควีนส์ : ควีนส์สามารถเคลื่อนที่ได้ระหว่าง 1 ถึง 8 กำลังสองตามแนวเส้นทางที่ไม่มีสิ่งกีดขวางใด ๆ
  • Kings : Kings เคลื่อนไหวเหมือนราชินียกเว้นว่าพวกมันถูก จำกัด ให้เคลื่อนที่เพียงหนึ่งตารางต่อการเคลื่อนไหวเท่านั้น (เช่น King สามารถย้ายไปยังจตุรัส cardinally หรือ diagonally ที่อยู่ติดกัน) เพื่อเป็นการเตือนคุณไม่สามารถเคลื่อนไหวได้ซึ่งทำให้กษัตริย์ของคุณอยู่ในการตรวจสอบ ดังนั้นคุณไม่สามารถย้ายกษัตริย์ของคุณเข้าสู่การตรวจสอบเช่นกัน

กฎของหมากรุกยังมีการเคลื่อนไหวพิเศษที่เรียกว่า "castling" และ "en passant" อย่างไรก็ตามเนื่องจากความถูกต้องตามกฎหมายของการเคลื่อนไหวเหล่านี้ขึ้นอยู่กับประวัติของเกมไม่ใช่แค่ตำแหน่งปัจจุบัน (และเนื่องจากการคาสต์ต้องใช้การเคลื่อนที่สองชิ้นพร้อมกันซึ่งไม่เหมาะกับรูปแบบอินพุต) คุณจึงไม่ควรพิจารณาการเคลื่อนไหวเหล่านี้ ที่จะมีอยู่ (เช่นการเคลื่อนไหวที่จะ castling หรือ en passant ควรพิจารณาว่าผิดกฎหมาย)

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

กรณีทดสอบ

Board
Move => Output (Reason)

[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8], ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7], ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7], ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3], ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1], ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2], ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
["W", "R", 8, 2] => True (The rook on h1 can move forward one)

[['B', 'K', 6, 8], ['B', 'Q', 1, 7], ['B', 'N', 1, 3], ['B', 'N', 7, 1], ['B', 'B', 8, 8], ['B', 'B', 2, 5], ['B', 'R', 4, 3], ['B', 'R', 1, 5], ['B', 'P', 5, 5], ['B', 'P', 7, 2], ['B', 'P', 5, 7], ['B', 'P', 5, 6], ['B', 'P', 4, 4], ['W', 'K', 7, 3], ['W', 'Q', 3, 2], ['W', 'N', 4, 8], ['W', 'N', 7, 5], ['W', 'B', 1, 1], ['W', 'B', 8, 1], ['W', 'R', 1, 8], ['W', 'R', 3, 7], ['W', 'P', 8, 2], ['W', 'P', 6, 3], ['W', 'P', 4, 2], ['W', 'P', 1, 4], ['W', 'P', 8, 7]]
['W', 'N', 1, 5] => False (Neither knight to move to a5 from where they are)

[['B', 'K', 7, 3], ['B', 'Q', 2, 4], ['B', 'N', 5, 2], ['B', 'N', 1, 6], ['B', 'B', 7, 7], ['B', 'B', 1, 8], ['W', 'K', 7, 1], ['W', 'Q', 6, 1], ['W', 'N', 5, 6], ['W', 'N', 3, 3], ['W', 'B', 2, 2], ['W', 'B', 6, 5]]
['B', 'K', 8, 3] => False (The white bishop would put the king in check)

[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 5, 8] => False (The white queen currently has the king in check, and this move doesn't prevent that)

[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 7, 5] => True (The king is in check, and the knight blocks that)

[['B', 'K', 8, 3], ['B', 'Q', 6, 5], ['B', 'N', 7, 8], ['B', 'N', 3, 7], ['B', 'B', 4, 1], ['B', 'B', 1, 1], ['W', 'K', 7, 7], ['W', 'Q', 7, 1], ['W', 'N', 2, 2], ['W', 'N', 1, 3], ['W', 'B', 3, 5]]
['B', 'B', 2, 2] => True (takes the white knight)

[['B', 'K', 6, 1], ['B', 'Q', 6, 2], ['W', 'K', 8, 1]]
['B', 'Q', 7, 1] => True (Smallest checkmate possible, in terms of bounding box)

ความท้าทายนี้ได้รับการทดลองใช้ผลิตภัณฑ์ มันได้รับ downvotes โดยไม่มีคำอธิบายใด ๆ ดังนั้นฉันจึงตัดสินใจโพสต์ไว้


"ชิ้นส่วนที่เคลื่อนไหวด้านเดียวกันเผยให้เห็นกษัตริย์เพื่อตรวจสอบ" - ข้อความนี้ดูเหมือนจะไม่พอดีตอนที่คุณย้ายหัวข้อที่จะไป ฉันจะเปลี่ยนเป็นบางอย่างเช่น "การย้ายงานชิ้นนี้จะทำให้กษัตริย์ดู"
FlipTack

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

2
ไม่มีใครลงคะแนนเลย ...
FlipTack

1
เราจะได้อาร์เรย์ 2d เป็นชิ้นส่วนได้หรือไม่?
OVS

1
@ovs ใช่ดูเหมือนว่าจะเป็นที่ยอมรับ
caird coinheringaahing

คำตอบ:


3

Python 2 (พร้อมpython-Chess ),  141 138 134 133  132 ไบต์

โดยไม่ต้องทำรหัสที่น่าสนใจจริงๆ - แต่บางทีนี่อาจแข่งขันกับภาษากอล์ฟหรือ (ฉันกล้าพูดถึง) Mathematica?

หมายเหตุ: หลามหมากรุกเป็นPypiแพคเกจติดตั้งบนหลาม 2.7.9+ ด้วย:
python -m pip install python-chess)

import chess
a,p,n=input()
S=chess.Board(a+' - - 0 1')
for m in S.legal_moves:1/(m.to_square!=n)**(`p`in`S.piece_at(m.from_square)`)

อินพุตแบบเต็มโปรแกรมยอมรับสามรายการ:

  1. จุดเริ่มต้นของระเบียน FEN - สตริงที่มีสองฟิลด์แรก นี่คือการกำหนดสถานะบอร์ดและสีที่กำลังเคลื่อนที่ (เนื่องจากนี่คือข้อมูลในอินพุตใน OP ในขณะที่ฟิลด์สามถึงหกถูก "แก้ไข" โดย OP ดังนั้นจึงไม่ควรเป็นส่วนหนึ่งของอินพุต)
  2. ชื่อชิ้นส่วนพยายามเคลื่อนย้าย (ตามที่กำหนดใน OP - หนึ่งในPRNBQK)
  3. ตารางที่ชิ้นส่วนที่มีชื่อเป็นความพยายามที่จะย้ายที่a1เป็น0, b1เป็น1... a2เป็น8... , h8คือ63,

โปรแกรมแสดงผลผ่านรหัสออกที่ได้รับให้ป้อนข้อมูลที่ถูกต้อง

  • 1 ถ้าการย้ายเป็นสิ่งที่ถูกต้อง (โปรแกรมยกข้อผิดพลาด - เนื่องจากการหารด้วยศูนย์);
  • 0 มันไม่ได้เป็น (โปรแกรมออกจากปกติ)

(อย่า) ลองออนไลน์! (เนื่องจากแพ็คเกจ python-Chess ไม่ได้ติดตั้งที่นั่นและ TIO ไม่อนุญาตการเชื่อมต่ออินเทอร์เน็ตดังนั้นรหัส pip-install ในส่วนหัวจะไม่ทำงาน)

โปรดทราบว่าผู้ประกอบการมีอำนาจในหลามทำให้1**1 == 1**0 == 0**0 == 1แต่0**1 == 0
... ด้วยเหตุนี้1/0**1ก่อให้เกิดการหารด้วยศูนย์ข้อผิดพลาดในขณะที่1/1**1, 1/1**0และ1/0**0ทั้งหมดประสบความสำเร็จ
( ... และที่ในหลามFalseและTrueถือเอาการ0และ1ตามลำดับ)


2
มันเป็นคำตอบที่ถูกต้องสมบูรณ์แบบ แต่ก็รู้สึกเหมือนโกงเหมือนคำตอบ Mathematica ในตัว
caird coinheringaahing

ใช่ดังนั้นความคิดเห็นที่ฉันใส่ไว้ที่ด้านบน "โดยไม่ต้องทำโค้ดที่น่าสนใจจริงๆ ... " บางทีเมื่อฉันมีเวลาอีกมากฉันจะทำ Jelly one (ซึ่งไม่สามารถนำเข้าโมดูลนี้ :))
Jonathan Allan

1
... โปรดทราบว่ามันยังใช้ความพยายามอยู่
Jonathan Allan

จัดเรียงใหม่str(S.piece_at(m.from_square))==p forเพื่อให้p==str(S.piece_at(m.from_square))forควรบันทึกหนึ่งไบต์
Zacharý

อ่าใช่ - ขอบคุณ @ Zachary ฉันเป็นเพียงการมองหาที่จะดูว่าฉันสามารถแยกจากreprการใช้ backticks ที่จะเปลี่ยนstrเพื่อประหยัด ...
โจนาธานอัลลัน

3

Regex (PCRE2), 931 925 837 ไบต์

การแก้ปัญหานี้ออกจากคำแถลงปัญหาในสองสถานะกระดานที่ส่งผ่านไปยัง regex แทนที่จะเป็นสถานะบอร์ดเดียวและการย้าย การย้ายถูกอนุมานจากความแตกต่างระหว่างสถานะกระดานทั้งสอง ดังนั้นฉันจึงทำหน้าที่ของโปรแกรม TIO ในการทดสอบเคสในรูปแบบที่จัดทำโดยคำถามนี้ค้นหาอินสแตนซ์ทั้งหมดของชิ้นส่วนที่อธิบายบนกระดานและแต่ละอันลองย้ายไปยังตำแหน่งปลายทางและประเมิน regex ด้วยความเป็นไปได้ว่าการค้นหาใด ๆ ที่รายงานโดย regex ว่าถูกต้อง หากไม่เป็นไรแจ้งให้เราทราบ เป็นไปได้ที่จะใช้ regex เป็น position + move แต่จะดูสง่างามน้อยกว่าและต้องการการปรับโครงสร้างที่จริงจัง

กระดานแสดงใน 8 × 8 ASCII โดยที่ชิ้นสีขาวเป็นตัวพิมพ์ใหญ่และสีดำเป็นตัวพิมพ์เล็ก: P awn, k N ight, B ishop, R ook, Q ueen, K ing ด้านของสีดำ (อันดับที่ 8) อยู่ด้านบนและด้านบนของสีขาว (อันดับที่ 1) อยู่ที่ด้านล่าง แต่ละอันดับจะถูกคั่นด้วยบรรทัดใหม่และสี่เหลี่ยมที่ว่างเปล่าจะถูกทำเครื่องหมายเป็น-แต่ละตำแหน่งจะถูกคั่นด้วยการขึ้นบรรทัดใหม่และสี่เหลี่ยมที่ว่างจะทำเครื่องหมายเป็นตำแหน่งกระดานทั้งสองจะถูกคั่นด้วยการขึ้นบรรทัดใหม่พิเศษ

เป้าหมายที่แท้จริงของโครงการนี้คือการตรวจสอบความถูกต้องของเกมทั้งหมดไม่ใช่แค่การเคลื่อนไหวเพียงครั้งเดียว ดูสถานะปัจจุบันของความคืบหน้าด้านล่าง

()?(?>|((.|
(?=.)){2})((?=(\X{72})-))((?=(?(1)[-a-z]|[-A-Z])))((?5)(?(?=(.*
)
)[qnrb]|p))((?5)(?(?=(?8){8}
)[QNRB]|P)))(?>((.)(?=(?5)\11)|(?(m)$)((?(1)(-(?=(?9))(?=(?3){8}((?3){9})?P(?4))(?(-1)(?=(?8){4}
))|[a-z](?=(?9))(?=(?3){7}(?2)?P(?4)))|(p(?4)((?=(?3){8}((?3){9})?-(?7))(?(-1)(?=(?8){7}
))|(?=(?3){7}(?2)?[A-Z](?7)))))|(?<e>(?6).)?(?=(?i:(?|(?(e)|(B|Q))(?27)(?(e)(B|Q))|(?(e)|(R|Q))(?31)(?(e)(R|Q))|(?(e)|(N))(?34)(?(e)(N))|(?(e)|(K))(?35)?(?(e)(K))))(?(e)(?<=(?!(?6)).)(?4)|(?6).(?5)\19))(?(e)(?=(?5)\20)|(?!(?6)).(?4)))(?<m>)|(?(+1)$)(.))+
)+\k<m>
(?!\X{0,70}((?(1)p|k)(?=(?3){7}(?2)?(?(1)K|P))|(?i:(?<E>(?!(?6))K)?((?(E)|((?6)[BQ]))(()?((?(-1)-)(?3){7}(?(-2)(?2)))+)(?(E)(?-4))|(?(E)|((?6)[RQ]))(-*|((?(-1)-)(?3){8})+)(?(E)(?-3))|(?(E)|((?6)N))((?<=..)(?2){3}|(?=.)(?2){5}|(?2){8}(?2)?)(?(E)(?-2)))(?(E)|(?&E))|K((?3){7,9})?K)))

ลองออนไลน์!

สวย - พิมพ์และ ungolfed บางส่วน (backrefs สัมบูรณ์เปลี่ยนเป็นญาติและกลุ่มจับเปลี่ยนเป็นไม่ใช่ - จับหรือในบางกรณีอะตอมเพื่อความเร็ว):

# Chess move validation regex (PCRE)
()?                 # decide whether to evaluate this as white's or black's move; \1 set = white, \1 unset (NPCG) = black
(?>|                # subroutines:
  ((.|\n(?=.)){2})                  # (?3) = for moving within the board, without wrapping to the next board, (?2) = (?3){2}
  ((?=                              # (?4) = assert that position of just-consumed piece is vacated on the next turn
    (\X{72})                        # (?5) = skip to the position of the just-consumed piece on the next turn
  -))
  ((?=(?(1)[-a-z]|[-A-Z])))         # (?6) = assert that the piece at the current position belongs to the current player's opponent or is empty
  ((?5)(?(?=(.*\n)\n)[qnrb]|p))     # (?7) = black pawn that might be promoted, (?8) = .*\n
  ((?5)(?(?=(?8){8}\n)[QNRB]|P))    # (?9) = white pawn that might be promoted
)
(?>
  (?>
    # Handle squares that don't change (empty->empty or pieces that doesn't move)
    (.)(?=(?5)\g{-1}) |
    # Handle a piece that moves (and optionally captures an enemy piece)
    (?(m)$)  # allow only one move to be made per turn
    (?>
      (?(1)
        (?:                                                         # white pawn
            -  (?=(?9))(?=(?3){8}((?3){9})?P(?4))(?(-1)(?=(?8){4}\n)) |   # move 1 or 2 spaces forward
          [a-z](?=(?9))(?=(?3){7}(?2)?     P(?4))                     )   # capture diagonally
      |
        (?:p(?4)(?:                                                 # black pawn
          (?=(?3){8}((?3){9})?  -  (?7))(?(-1)(?=(?8){7}\n)) |            # move 1 or 2 spaces forward
          (?=(?3){7}(?2)?     [A-Z](?7)) )                   )            # capture diagonally
      ) |
      # bishops, rooks, queens, knights, or kings
      (?<e>(?6).)?   # decide between scanning forward (<e> is unset) or backwards (<e> is captured)
      (?=
        (?i:
          (?|
            (?(e)|(B|Q)) (?&B)  (?(e)(B|Q)) | # bishops or queens
            (?(e)|(R|Q)) (?&R)  (?(e)(R|Q)) | # rooks or queens
            (?(e)|(N  )) (?&N)  (?(e)(N  )) | # knights
            (?(e)|(K  )) (?&K)? (?(e)(K  ))   # kings
          )
        )
        (?(e)(?<=(?!(?6)).)(?4)|(?6).(?5)\g{-2})   # verify that the piece moved, and optionally captured piece, are of the correct color
      )
      (?(e)(?=(?5)\g{-1})|(?!(?6)).(?4))   # verify that the piece moved is the same type and color at its destination in the next turn's board position
    )(?<m>) |
    (?(+1)$)(.)  # handle the destination/source square that a piece moved to/from (only allow matching one of these per turn)
  )+\n
)+
\k<m>         # assert that a move has taken place
\n
# don't allow moving into check  
(?!
  \X{0,70}
  (?:
    # pawns (capture diagonally)
    (?(1)p|k)(?=(?3){7}(?2)?(?(1)K|P)) |
    # bishops, rooks, queens, knights, or kings
    (?i:
      (?<E>(?!(?6))K)?   # decide between scanning forward (<E> is unset) or backwards (<E> is captured)
      (?:
        (?(E)|((?6)[BQ])) (?<B>()?((?(-1)-)(?3){7}(?(-2)(?2)))+)         (?(E)(?-4)) | # bishops or queens
        (?(E)|((?6)[RQ])) (?<R>-*|((?(-1)-)(?3){8})+)                    (?(E)(?-3)) | # rooks or queens
        (?(E)|((?6) N  )) (?<N>(?<=..)(?2){3}|(?=.)(?2){5}|(?2){8}(?2)?) (?(E)(?-2))   # knights
      )
      (?(E)|(?&E)) |
      K(?<K>(?3){7,9})?K   # kings
    )
  )
)

-88 ไบต์โดยใช้การเรียกรูทีนย่อยที่ไม่ใช่อะตอมจึงกำหนดเป้าหมายใหม่จาก PCRE1 เป็น PCRE2

เวอร์ชั่นข้างต้นได้รับการแก้ไขเพื่อไม่ให้ผู้คนเดินผ่านหรือเหวี่ยง แต่โครงการทั้งหมดอยู่ในสถานะที่ตรวจสอบการเคลื่อนไหวทุกประเภทเริ่มต้นที่สถานะกระดานเริ่มต้น (ซึ่งต้องเป็นตำแหน่งเริ่มต้นหมากรุกมาตรฐาน - Chess960 ไม่ใช่ สนับสนุนอย่างน้อยก็) กฎเต็มของ en passant และ castling ถูกบังคับใช้

นี่คือเกมตัวอย่างที่ตรวจสอบโดย regex แบบเต็ม (PCRE1 - ยังไม่ได้กำหนดเป้าหมายใหม่) [regex101.com][regex101.com]

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

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

ฉันยังเริ่มต้นด้วย regex ที่ตรวจสอบเกมเต็มรูปแบบในสัญญลักษณ์หมากรุกเกี่ยวกับพีชคณิตโดยมีตำแหน่งเริ่มต้นมาตรฐานถูกบอกเป็นนัย สิ่งที่ต้องมีคือ "กระดานลบข้อมูล" ที่ว่างท้ายท้ายอินพุต (หลังจากรายการเคลื่อนไหว) ฉันค่อนข้างแน่ใจว่ามันเป็นไปได้ที่จะใช้มันอย่างเต็มที่และวางแผนที่จะทำมันให้เสร็จในบางครั้ง


ฉันไม่ได้เต็มไปด้วยความหวาดกลัวอย่างนี้มานานนับตั้งแต่ที่ฉันมีปัญหาความน่าเชื่อถือในการตรวจสอบความถูกต้องถึง 3,000 ไบต์สำหรับคำถามการตรวจสอบของ Sudoku (ความผิดพลาดครั้งใหญ่เมื่อพิจารณาจากคำตอบที่ชนะนั้น พิสูจน์ได้อย่างแท้จริงถึงจุดที่บางครั้งเมื่อคุณใช้ regex ในการแก้ปัญหาคุณจะพบปัญหาสองประการ
Value Ink

@ValueInk Heh บางทีคุณพูดถูก แต่ฉันสนุกกับมันโดยไม่คำนึงถึง (หรืออาจเป็นเพราะ) การทำสิ่งที่ไม่เหมาะสมที่สุด ความคิดเห็นของคุณเป็นแรงบันดาลใจให้ฉันลองตอบคำถามของ Sudoku แต่ฉันจัดการได้แค่ 200 ไบต์เท่านั้น โอ้ดี
Deadcode
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.