Vấn đề:
Trong cờ vua, có một quy tắc khá nổi tiếng về vẽ bằng cách lặp lại. Nếu cùng một vị trí được lặp lại 3 lần (hoặc nhiều hơn) thì người chơi có ý định thực hiện di chuyển sẽ gây ra sự lặp lại này có thể yêu cầu rút thăm.
Đôi khi đây là một nhiệm vụ dễ dàng để một trọng tài phát hiện ra, nếu một vài động tác cuối cùng chỉ là những người chơi di chuyển lùi và tiến. Đôi khi nó ít tầm thường hơn, khi các mảnh đã di chuyển đáng kể giữa các vị trí lặp đi lặp lại.
Vấn đề trong thử thách này là đưa ra một giá trị trung thực nếu vị trí được yêu cầu được rút ra bởi sự lặp lại (đã được nhìn thấy 3 lần trở lên) và giá trị falsey nếu vị trí được yêu cầu không được vẽ bởi sự lặp lại, đưa ra một danh sách các bước di chuyển trong ký hiệu phối hợp như được mô tả dưới đây, hoặc bất kỳ ký hiệu nào bạn chọn (nhưng bạn sẽ phải chuyển đổi các trường hợp thử nghiệm).
Một vị trí là gì?
Trong một kịch bản trong thế giới thực, vị trí sẽ bị ảnh hưởng bởi những thứ như liệu người chơi có thể xây lâu đài hay liệu người đi đường có khả thi hay không; bạn không nên xem xét những điều này trong giải pháp của bạn cho vấn đề. Trong bài toán này, một vị trí được xác định đơn giản bởi cấu hình của các mảnh trên bảng. Vì vậy, đối với các mục đích của vấn đề này, hai vị trí được coi là giống nhau nếu mỗi ô vuông trên cả hai bảng được chiếm bởi cùng một loại mảnh cùng màu. Đây không phải là mảnh ghép chính xác, ví dụ các hiệp sĩ của người da trắng có thể hoán đổi hình vuông và nếu tất cả các mảnh khác đáp ứng các tiêu chí thì đây vẫn sẽ là vị trí tương tự.
Một ký hiệu hợp lệ trông như thế nào?
Mặc dù tôi sẽ tiếp tục giải thích ký hiệu tọa độ, bạn có thể tự do lấy đầu vào bằng một hệ thống ký hiệu bạn chọn. Với điều kiện:
- Mỗi mục trong ký hiệu mô tả bất kỳ hoặc tất cả: phần / mảnh liên quan; cho dù kiểm tra, checkmate, kiểm tra kép, checkmate hay bế tắc đã được chuyển giao; nếu bắt giữ en-passant đã xảy ra; vị trí ban đầu; vị trí cuối cùng.
- Bạn có thể không có thông tin về sự lặp lại trong ký hiệu của bạn.
Vì vậy, miễn là các tiêu chí này được đáp ứng, tôi rất vui lòng chấp nhận, miễn là bạn chỉ định trong câu trả lời của mình, hệ thống ký hiệu của bạn. Điều này có thể là ví dụ 0 hàng được lập chỉ mục, bộ dữ liệu cột hoặc bất cứ điều gì có ý nghĩa cho chương trình của bạn.
Ký hiệu phối hợp
Ký hiệu tọa độ là ký hiệu mô tả hoàn toàn các bước di chuyển như một hệ tọa độ.
Di chuyển được mô tả là đầu tiên tọa độ ban đầu từ tập hợp {A1-H8}
và sau đó tọa độ đích lại từ cùng một tập hợp. Vì vậy, King Gambit sẽ trông như thế (như một bộ sưu tập các chuỗi)
{"E2-E4","E7-E5","F2-F4"}
Tôi tin rằng đó là ký hiệu tốt nhất để sử dụng cho vấn đề này bởi vì nó không chứa đầy thông tin bên ngoài như liệu kiểm tra đã xảy ra hay loại mảnh di chuyển là gì. Như đã đề cập trước khi ký hiệu có thể là lựa chọn của bạn, vì vậy bạn có thể sử dụng một ký hiệu khác, ví dụ ký hiệu đại số hoặc bạn có thể điều chỉnh ký hiệu này (ví dụ: xóa dấu gạch ngang hoặc lấy làm danh sách các bộ dữ liệu)
Quy tắc:
- Bạn không nên xem xét một vị trí hoặc di chuyển là hợp lệ, chỉ khi nó gây ra sự lặp lại
- Bạn có thể cho rằng khuyến mãi đúc và cầm đồ sẽ không xảy ra.
- Bạn nên lấy một danh sách các chuỗi làm đầu vào và đầu ra một giá trị trung thực hoặc falsey tương ứng với việc lặp lại lần thứ ba (hoặc nhiều hơn) đã xảy ra ở bước cuối cùng
- Trò chơi luôn bắt đầu ở vị trí bắt đầu tiêu chuẩn cho cờ vua. Vị trí ban đầu có thể được tính vào sự lặp lại.
- Vẽ bởi sự lặp lại đã không xảy ra nếu vị trí không được lặp lại bởi bước di chuyển cuối cùng
Quy tắc chung:
- Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất bằng byte thắng.
Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'. - Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
- Lỗ hổng mặc định bị cấm.
- Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
- Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.
Các trường hợp thử nghiệm
Bạn nên trả về các giá trị trung thực cho:
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","D2-D4","D7-D5","D1-D3","D8-D6","C3-B1","C6-B8","B1-C3","B8-C6","D3-D1","D6-D8","D1-D3","D8-D6"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-E6","E2-F3","E6-D4","F3-D1","D4-C6","D1-E2","C6-D4","E1-D1","D4-C6","D1-E1","C6-D4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3"}
Và giá trị falsey cho:
{}
{"E2-E4","E7-E5","F2-F4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","F2-F4","F7-F5"}
{"E2-E4","E7-E5","G1-F3","B8-C6","F1-C4","G8-F6","F3-G5","D7-D5","E4-D5","F6-D5","G5-F7"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-C6","E2-D1","C6-D4","D1-E2","D4-C6","E2-D1"}
{"B1-C3","B8-C6","C3-B5","C6-B4","B5-D4","B4-D5","D4-C6","D5-C3","C6-B8","C3-B1","B8-C6","B1-C3","C6-B8","C3-B1"}
{"E2-E4","E7-E5","D1-E2","E8-E7","E1-D1","D8-E8","E2-E1","E7-D8","E1-E2","E8-E7","E2-E1","E7-E8"}
C6-B8
, vị trí ban đầu đã xảy ra ba lần.