Thử thách này là viết một hàm minimax bằng ngôn ngữ bạn chọn, để tạo ra bước đi tốt nhất tiếp theo trong trò chơi NxN của tic-tac-toe với trạng thái bảng hiện tại . Đầu vào bảng có thể được chấp nhận dưới dạng Ma trận, Bộ sưu tập 2D hoặc bất kỳ thứ gì khác có ý nghĩa với bạn, nhưng tuân thủ các quy tắc . Đầu ra là bước đi tốt nhất tiếp theo cho bất cứ ai hiện tại , nơi X được coi là đã bắt đầu .
Bối cảnh nhanh về thuật toán Minimax
Ý tưởng cơ bản của thuật toán minimax là liệt kê tất cả các kết quả có thể xảy ra như một DAG sau đó cân nhắc chúng bằng lợi ích mà chuỗi di chuyển mang lại cho người chơi, được chốt bởi bước di chuyển đầu tiên được thực hiện. Tất cả các kết quả có thể xảy ra sau đó là 'xô' bởi nước đi đầu tiên và được tính dựa trên tổng của tất cả các kết quả (-1 cho một trận thua, 0 cho hòa và 1 cho một chiến thắng). Trong các triển khai yêu cầu nhiều người chơi để chơi, bạn liệt kê tất cả các động tác có thể có của người chơi và tất cả các phản ứng có thể có của đối thủ. Chẳng hạn, trong một trò chơi tic-tac-toe (sau lần di chuyển đầu tiên), có 8 động tác đầu tiên có thể bạn có thể thực hiện, và tất cả chúng có vẻ như bằng nhau khi chỉ phân tích lượt tiếp theo. Nhưng bằng cách lặp qua tất cả các kết quả có thể có cho từng nhóm di chuyển có thể dẫn đến kết quả cuối cùng và tổng hợp tất cả chúng,
Để biết tóm tắt tốt hơn, sâu hơn và theo ngữ cảnh của thuật toán mini-max về mặt tic-tac-toe, hãy đọc thêm tại đây: http://neverstopbuilding.com/minimax
XKCD (Chỉ giải pháp 3x3)
Những quy định
- Bất kỳ ngôn ngữ nào cũng có thể được sử dụng, nhưng không cho phép các thư viện minimax bên ngoài.
- Đầu ra có thể là tọa độ (0-n, 0-n) hoặc số (1-n * n) cho thấy bước tiếp theo tốt nhất.
- Ngoài ra, bạn phải có khả năng xác định khi nào tình huống tốt nhất là thua hoặc hòa thay vì thắng.
- Cách bạn biểu thị một sự mất mát hoặc một sự ràng buộc là, một lần nữa, tùy thuộc vào bạn.
- Đầu vào phải sử dụng X và O truyền thống và bạn phải giả sử X di chuyển trước; không gian trống có thể được đại diện bởi bất cứ điều gì.
- Bạn có thể cho rằng bất kỳ đầu vào nào vào chương trình của bạn đều có n O và n + 1 X, nói cách khác, bạn có thể cho rằng bạn đang nhận được một bảng mạch tốt.
- Trạng thái hiện tại của bảng phải là đầu vào duy nhất cho chương trình của bạn, nếu bạn đang sử dụng đệ quy, các phương thức trợ giúp phải được thực hiện để tạo thuận lợi cho các yêu cầu đầu vào. Xem /codegolf//a/92851/59376 để được làm rõ.
- Mọi giá trị 10> = n> = 1 phải được hỗ trợ; nếu chương trình của bạn "hết thời gian" cho n> 10, tôi cũng thấy điều này có thể chấp nhận được, vì một số ngôn ngữ có sức mạnh xử lý thấp hơn đáng kể (Đặc biệt là sử dụng bảng điều khiển đối diện web).
Đánh giá
- Đây là môn đánh gôn, do đó, số byte thấp nhất của chương trình sẽ thắng và các sơ hở tiêu chuẩn không được phép.
- Trong trường hợp hòa, chương trình hỗ trợ 'n' lớn nhất sẽ giành chiến thắng.
Ví dụ đầu vào
2x2
[[X,O]
[-,-]]
Đầu ra: 2 hoặc [0,1] (3 hoặc [1,1] cũng có thể được cho là chính xác) (Một số dạng biểu thị vị trí, tùy ý miễn là bạn có thể dễ dàng giải thích định dạng bạn đã sử dụng)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Đầu ra: -1 (Mất)
Một lần nữa, bất kỳ định dạng đầu vào nào bạn muốn đều được cho phép, nhưng phải sử dụng X và O, các ví dụ được cung cấp không có nghĩa là hạn chế định dạng đó, chỉ để truyền cảm hứng.