Đó có phải là một nước cờ hợp lệ?


15

Tên thay thế: ChessMoveQ

Đưa ra một danh sách tối đa 32 yếu tố, mỗi yếu tố bao gồm 4 yếu tố và danh sách thứ hai có 4 yếu tố, xác định xem di chuyển chi tiết trong đầu vào thứ hai có phải là một nước cờ hợp lệ hay không.

Danh sách đầu tiên cho biết vị trí của tất cả 32 miếng trên bảng. Mỗi yếu tố sẽ tuân theo cấu trúc <colour>, <piece-name>, <x-coord>, <y-coord>, chẳng hạn như ["W", "K", 5, 1], chỉ ra rằng vua trắng đang ở trên 5, 1( e1trên bàn cờ bình thường). Tất cả các yếu tố của đầu vào đầu tiên sẽ là duy nhất. <x-coord><y-coord>sẽ luôn nằm trong khoảng từ 1 đến 8. Một ví dụ sẽ là:

[["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]]

đại diện cho hội đồng quản trị:

một ví dụ bàn cờ

Đầu vào thứ hai sẽ bao gồm các cấu trúc giống như các danh sách con của danh sách đầu tiên, nhưng thay vì tọa độ x và y chỉ ra vị trí của mảnh, chúng đang chỉ ra nơi nó đang cố gắng di chuyển đến.

Đối với ví dụ trên, một nước đi hợp lệ có thể là ["W", "B", 4, 3](giám mục di chuyển một hình vuông về phía trước và bên trái), và một động thái không hợp lệ có thể là ["B", "R", 4, 1]do người lính sẽ phải di chuyển qua hiệp sĩ, và con tốt để đến quảng trường. Vì di chuyển có thể đề cập đến nhiều mảnh ghép nhiều lần, bạn phải kiểm tra xem bất kỳ mảnh nào được chỉ định có thể thực hiện di chuyển, không chỉ một trong số chúng. Chẳng hạn, ví dụ đầu tiên chỉ hợp lệ cho một giám mục, nhưng nó vẫn là một động thái hợp lệ. Tuy nhiên, không phải tân binh đen nào có thể thực hiện động tác thứ hai, vì vậy nó không hợp lệ.

Nhiệm vụ của bạn là xác định xem di chuyển chi tiết trong đầu vào thứ hai có phải là một nước cờ hợp lệ hay không. Hiệu lực của một quy tắc khác nhau, tùy thuộc vào mảnh đang cố gắng di chuyển (nhấp vào tên của mảnh để biết sơ đồ di chuyển hợp lệ):

  • Bất kỳ mảnh nào : Không có mảnh nào có thể di chuyển lên một hình vuông đã bị chiếm đóng, hoặc rời khỏi bảng, trừ khi hình vuông đó bị chiếm bởi một mảnh từ màu khác. Ví dụ, một mảnh màu trắng có thể di chuyển lên một hình vuông bị chiếm bởi một mảnh màu đen, nhưng không phải là một mảnh màu trắng. Ngoài ra, không có mảnh nào, ngoại trừ Hiệp sĩ, có thể di chuyển đến các ô vuông bị cản trở trực tiếp bởi một mảnh khác.
    • Một động thái của mảnh B để vuông C là "trực tiếp bị che khuất" bởi mảnh Một nếu Một là trực tiếp, trong một thẳng (trực giao hoặc đường chéo) dòng, giữa BC .
  • Bất kỳ quân cờ nào : Vị trí của nhà vua cũng có thể ảnh hưởng đến hiệu lực của việc di chuyển quân cờ. Nếu một trong hai điều kiện này được đáp ứng, di chuyển không hợp lệ:
    • Phơi bày nhà vua để kiểm tra, bằng cách di chuyển một mảnh ở cùng phía với vị vua đang gặp nguy hiểm. Điều này chỉ áp dụng nếu một mảnh không đối lập làm cho di chuyển, chứ không phải là một mảnh đối lập di chuyển để đặt nhà vua vào tầm kiểm soát.
    • Rời nhà vua trong tầm kiểm soát, trong trường hợp này nó di chuyển ra khỏi kiểm soát. Do đó, nếu nhà vua đang kiểm tra và di chuyển ra lệnh rằng một mảnh khác di chuyển, thì đó là một động thái không hợp lệ, trừ khi các mảnh khác đang ngăn chặn kiểm tra. Một mảnh có thể ngăn kiểm tra theo một trong hai cách: hoặc nó lấy mảnh kiểm tra thực hiện, hoặc nó cản trở đường đi giữa kiểm tra thực hiện mảnh và nhà vua.
    • "Kiểm tra" là tình huống mà đối thủ của nhà vua có thể (nếu đến lượt họ di chuyển) hợp pháp di chuyển một mảnh lên vị vua đó. Quy tắc này không áp dụng đệ quy, tức là một vị vua đang trong tầm kiểm soát ngay cả khi di chuyển của đối thủ lên vị vua đó sẽ khiến vua của họ bị kiểm soát.
  • Chân : Một con tốt có thể di chuyển về phía trước (tức là hướng lên nếu màu trắng, hướng xuống nếu màu đen) một hình vuông thành hình vuông không có người. Ngoài ra còn có ba tình huống đặc biệt:
    • Nếu con tốt chưa di chuyển (bạn có thể xác định điều này bằng tọa độ Y; con tốt trắng không di chuyển nếu tọa độ Y của chúng là 2, con tốt màu đen không di chuyển nếu tọa độ Y của chúng là 7), con tốt được phép di chuyển hai hình vuông về phía trước đến một hình vuông không có người.
    • Nếu có một mảnh của đối thủ theo đường chéo ở phía trước của con tốt (tức là trên hình vuông ở phía tây bắc hoặc đông bắc của con tốt nếu nó màu trắng, hoặc về phía tây nam hoặc đông nam nếu nó màu đen), cầm đồ được phép di chuyển lên quảng trường bị chiếm đóng.
    • Nếu một con tốt chuyển đến tọa độ Y cuối cùng (8 cho màu trắng hoặc 1 cho màu đen) trong các quy tắc cờ thông thường, nó phải được thăng cấp thành nữ hoàng, tân binh, hiệp sĩ hoặc giám mục cùng màu. Đối với mục đích của câu hỏi này, việc lựa chọn khuyến mãi không liên quan đến việc di chuyển có hợp lệ hay không (và không thể được thể hiện ở định dạng đầu vào), nhưng phải cho phép di chuyển cầm đồ dẫn đến khuyến mãi.
  • Giám mục : Các giám mục có thể di chuyển từ 1 đến 8 ô vuông dọc theo bất kỳ con đường liên thông không bị cản trở (tức là đường chéo).
  • Hiệp sĩ : Hiệp sĩ có thể di chuyển trong mộtLhình dạng, bao gồm một trong các động tác (tương đương) sau đây:
    • Một hình vuông duy nhất theo bất kỳ hướng hồng y nào, theo sau là một góc 90/270 °, tiếp theo là bước di chuyển cuối cùng của 2 hình vuông về phía trước.
    • 2 hình vuông theo bất kỳ hướng hồng y nào, theo sau là một góc 90/270 °, tiếp theo là bước di chuyển cuối cùng của một hình vuông về phía trước.
    (Hãy nhớ rằng đường đi của một hiệp sĩ không thể bị chặn bằng cách can thiệp, mặc dù hình vuông cuối cùng của nó vẫn phải hợp pháp.)
  • Rooks : Rooks có thể di chuyển giữa 1 và 8 ô vuông dọc theo bất kỳ con đường hồng y không bị cản trở liên tục.
  • Nữ hoàng : Nữ hoàng có thể di chuyển giữa 1 và 8 ô vuông dọc theo bất kỳ con đường không bị cản trở nào của hồng y hoặc liên thẻ (tức là đường chéo).
  • Các vị vua : Các vị vua di chuyển như các nữ hoàng, ngoại trừ việc họ bị giới hạn chỉ di chuyển một ô vuông trên mỗi lần di chuyển (tức là một vị vua chỉ có thể di chuyển đến các ô vuông liền kề theo đường chéo hoặc chéo). Xin nhắc lại, bạn không thể thực hiện một động thái khiến vua của bạn bị kiểm soát; do đó, bạn cũng không thể di chuyển vua của bạn vào kiểm tra.

Các quy tắc của cờ vua cũng chứa các nước đi đặc biệt gọi là "castling" và "en passant". Tuy nhiên, vì tính hợp pháp của các di chuyển này phụ thuộc vào lịch sử của trò chơi, không chỉ vị trí hiện tại (và vì castling yêu cầu di chuyển hai mảnh cùng một lúc, không phù hợp với định dạng đầu vào), bạn nên xem xét cả hai động thái này tồn tại (nghĩa là một động thái sẽ bị ném hoặc en passant nên được coi là bất hợp pháp).

Bạn có thể xuất bất kỳ hai kết quả riêng biệt nào để cho biết tính hợp lệ của việc di chuyển và bạn có thể thực hiện đầu vào theo phương pháp bạn muốn. Bạn cũng có thể chọn lập chỉ mục 0 thay vì lập chỉ mục 1 cho các vị trí nếu bạn thích. Đây là một , vì vậy mã ngắn nhất sẽ thắng!

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

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)

Thử thách này đã được sandbox . Nó đã nhận được downvote, không có bất kỳ lời giải thích nào, vì vậy tôi quyết định đăng nó bằng mọi cách


"Một mảnh ở cùng một phía di chuyển, phơi bày nhà vua để kiểm tra." - từ ngữ này dường như không phù hợp với bây giờ khi bạn di chuyển tiêu đề. Tôi sẽ đổi nó thành một cái gì đó như "Di chuyển tác phẩm này sẽ khiến nhà vua phải kiểm tra"
FlipTack

Câu hỏi này đã được đánh giá thấp trong Sandbox, và bây giờ ở đây mà không có một lời giải thích nào. Tôi không thể làm gì để khiến bạn nói với tôi lý do tại sao bạn hạ cấp, nhưng ít nhất có sự kiên quyết để giải thích hành động của bạn, thay vì đứng im lặng trong bóng tối. Nếu bạn nghĩ rằng bài đăng này có thể được cải thiện, vui lòng đề xuất cách, thay vì chụp ảnh nồi mà không giải thích chính mình.
caird coinheringaahing

2
Không ai đánh giá thấp nó ...?
FlipTack

1
Chúng ta có thể lấy một mảng 2d làm đầu vào không?
trứng

1
@ovs Vâng, điều đó dường như được chấp nhận
caird coinheringaahing

Câu trả lời:


3

Python 2 (với python-Chess ),  141 138 134 133  132 byte

Không thực hiện bất kỳ mã nào thực sự thú vị - nhưng có lẽ điều này có thể cạnh tranh với các ngôn ngữ chơi gôn hoặc (tôi dám đề cập đến nó) Mathematica?

Lưu ý: python-Chess là gói Pypi cài đặt nó trên Python 2.7.9+ với
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)`)

Một đầu vào chấp nhận toàn bộ chương trình của ba mục:

  1. sự khởi đầu của một bản ghi FEN - chuỗi chứa hai trường đầu tiên. Điều này là để xác định trạng thái bảng VÀ màu nào đang di chuyển (vì đây là thông tin trong đầu vào trong OP, trong khi các trường từ ba đến sáu được "cố định" bởi OP do đó không phải là một phần của đầu vào)
  2. tên mảnh đang cố gắng di chuyển (như được đưa ra trong OP - một trong PRNBQK )
  3. hình vuông mà mảnh tên đang cố gắng để di chuyển nơi a10, b1được 1... a2được 8, ..., h863,

Chương trình xuất ra thông qua mã thoát được cung cấp đầu vào hợp lệ:

  • 1 nếu di chuyển là hợp lệ (chương trình đưa ra lỗi - do chia cho 0);
  • 0 nó không phải là (chương trình thoát bình thường)

(Đừng) Hãy thử trực tuyến!(vì gói python-Chess không được cài đặt ở đó và TIO không cho phép kết nối internet nên mã cài đặt pip trong tiêu đề sẽ không hoạt động).

Lưu ý rằng các nhà điều hành điện bằng Python làm 1**1 == 1**0 == 0**0 == 1nhưng 0**1 == 0
... do đó 1/0**1đặt ra một phép chia cho không lỗi trong khi 1/1**1, 1/1**01/0**0tất cả thành công
(... và rằng bằng Python FalseTruetương đương với 01tương ứng).


2
Đó là một câu trả lời hoàn toàn hợp lệ, nhưng nó có cảm giác hơi giống như gian lận, tương tự như câu trả lời Mathicala chỉ có sẵn.
caird coinheringaahing

Vâng, do đó, nhận xét tôi đặt ở đầu "Không cần thực hiện bất kỳ mã nào thực sự thú vị ..." có thể khi tôi có thêm thời gian tôi sẽ thực hiện một Jelly (không thể nhập mô-đun này :))
Jonathan Allan

1
... nhớ bạn nó vẫn mất một số nỗ lực.
Jonathan Allan

Sắp xếp lại str(S.piece_at(m.from_square))==p forđể p==str(S.piece_at(m.from_square))for, mà nên lưu một byte.
Zacharý

À, vâng - cảm ơn @ Zacharý Tôi chỉ đang tìm xem liệu tôi có thể phân tích cú pháp từ việc reprsử dụng backticks để thay thế strđể cứu ...
Jonathan Allan

3

Regex (PCRE2), 931 925 837 byte

Giải pháp này khởi hành từ tuyên bố vấn đề trong đó hai trạng thái bảng được chuyển sang biểu thức chính quy, thay vì một trạng thái bảng và di chuyển. Động thái này được suy ra từ sự khác biệt giữa hai quốc gia hội đồng. Vì vậy, tôi đã biến nó thành công việc của chương trình TIO để lấy các trường hợp thử nghiệm theo định dạng được cung cấp bởi câu hỏi này, tìm tất cả các phiên bản của phần được mô tả trên bảng và với mỗi trường hợp, hãy thử di chuyển nó đến vị trí đích và đánh giá regex với khả năng đó, việc tìm kiếm nếu có được báo cáo bởi regex là hợp lệ. Nếu điều này không ổn, hãy cho tôi biết; có thể thực hiện regex như vị trí + di chuyển, nhưng sẽ kém thanh lịch hơn nhiều và đòi hỏi phải tái cấu trúc nghiêm túc.

Bảng được thể hiện trong 8 × 8 ASCII trong đó các mảnh màu trắng là chữ hoa và màu đen là chữ thường: P awn, k N ight, B ishop, R ook, Q ueen, K ing. Phía đen (hạng 8) ở phía trên và phía trắng (hạng 1) ở phía dưới. Mỗi cấp bậc được phân tách bằng một dòng mới và các ô vuông trống được đánh dấu là -. Hai vị trí bảng được phân tách bằng một dòng mới.

Mục đích thực tế của dự án này là xác nhận toàn bộ trò chơi, không chỉ là các động tác đơn lẻ. Xem bên dưới để biết tình trạng tiến độ hiện tại.

()?(?>|((.|
(?=.)){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)))

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

Được in đẹp và không được chỉnh sửa một phần (các bản sao lưu tuyệt đối đã thay đổi thành tương đối và các nhóm bắt được thay đổi thành không bắt hoặc trong một số trường hợp là nguyên tử cho tốc độ):

# 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 byte bằng cách sử dụng các lệnh gọi chương trình con không nguyên tử, do đó nhắm mục tiêu lại từ PCRE1 đến PCRE2

Phiên bản trên đã được sửa đổi không cho phép en passant hoặc castling, nhưng toàn bộ dự án hiện đang ở trạng thái xác nhận mọi loại di chuyển, bắt đầu từ trạng thái ban đầu (phải là vị trí bắt đầu cờ tiêu chuẩn - Chess960 không được hỗ trợ, nhưng ít nhất). Các quy tắc đầy đủ của en passant và castling được thi hành.

Đây là một trò chơi mẫu được xác thực bởi regex đầy đủ (PCRE1 - chưa được nhắm mục tiêu lại) [regex101.com] .

Di chuyển không hợp lệ sẽ dẫn đến mọi vị trí bảng tiếp theo không được khớp / tô sáng. Phát hiện người kiểm tra / bế tắc, và do đó phát hiện ai là người chiến thắng (hoặc nếu đó là một trận hòa), vẫn chưa được thực hiện; đó là lý do tại sao trạng thái bảng cuối cùng trong ví dụ này không được tô sáng.

Dưới đây là chương trình C / C ++ chuyển đổi ký hiệu đại số thành định dạng được công nhận bởi regex này.Hiện tại, ký hiệu đại số phải được đặt ở dạng một mảng nội tuyến trong mã nguồn, với các chuỗi riêng biệt cho mỗi lần di chuyển, nhưng đọc nó dưới dạng một chuỗi từ stdin hoặc đối số dòng lệnh, với toàn bộ chuỗi di chuyển được phân tách bằng khoảng trắng và số di chuyển chấm dứt, được lên kế hoạch.

Tôi cũng bắt đầu vào một regex xác nhận một trò chơi đầy đủ hoàn toàn theo ký hiệu cờ đại số, với vị trí ban đầu tiêu chuẩn được ngụ ý. Tất cả những gì nó cần là một "bảng cào" trống được gắn vào cuối đầu vào (sau danh sách di chuyển). Tôi khá chắc chắn rằng có thể thực hiện điều này một cách đầy đủ và đôi khi có kế hoạch hoàn thiện nó.


Tôi đã không cảm thấy sợ hãi như vậy kể từ khi tôi ho lên một sự quái dị regex 3000 byte cho câu hỏi xác thực Sudoku (một sai lầm lớn, xem xét câu trả lời chiến thắng đã đạt được trong vòng chưa đến 75). Thực sự chứng minh quan điểm rằng đôi khi khi bạn sử dụng regex để giải quyết vấn đề, bạn kết thúc với hai vấn đề
Giá trị mực

@ValueInk Heh, có thể bạn đúng, nhưng tôi thích nó bất kể (hoặc có thể vì) tính không thực tế của nó. Nhận xét của bạn đã truyền cảm hứng cho tôi để cố gắng trả lời câu hỏi Sudoku đó, nhưng tôi chỉ quản lý 200 byte . Ồ tốt
Deadcode
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.