Mục tiêu của bạn là viết một người chơi hoàn hảo cho trò chơi Wythoff's Nim .
Quy tắc của Wythoff Nim
Wythoff 'Nim là một trò chơi hai người chơi quyết định được chơi với hai đống quầy giống hệt nhau. Người chơi thay phiên nhau, trong đó họ thực hiện một trong những điều sau:
- Loại bỏ một hoặc nhiều quầy từ đống đầu tiên
- Loại bỏ một hoặc nhiều quầy từ đống thứ hai
- Loại bỏ một số lượng bằng nhau của quầy (một hoặc nhiều), từ cả cọc thứ nhất và cọc thứ hai.
Tất nhiên, các cọc không thể âm, nhưng chúng có thể xuống 0. Bất kỳ người chơi nào loại bỏ bộ đếm cuối cùng sẽ thắng trò chơi.
Đối với những người có đầu óc hình học hơn, đây là một công thức tương đương của trò chơi mà bạn có thể chơi trên applet này . Một nữ hoàng duy nhất bắt đầu trên một số hình vuông của bàn cờ vô hạn có góc nằm ở góc dưới bên trái. Người chơi luân phiên di chuyển nữ hoàng, di chuyển như nữ hoàng cờ vua nhưng bị giới hạn ở ba hướng:
- Xuống
- Trái
- Theo đường chéo xuống và trái
Ai di chuyển nữ hoàng đến góc sẽ thắng.
Liên kết tọa độ của nữ hoàng (với góc (0,0)
) với kích thước của các cọc tương ứng, thật dễ dàng để thấy cả hai trò chơi đều giống nhau.
Chơi hoàn hảo
(Bạn có thể bỏ qua điều này nếu quen thuộc với các khái niệm chơi hoàn hảo và di chuyển chiến thắng.)
Vì Wythoff 'Nim là một trò chơi hữu hạn và mang tính quyết định, nên nó có một khái niệm về lối chơi hoàn hảo . Một người chơi hoàn hảo là một chiến lược sẽ luôn giành chiến thắng từ vị trí giành được về mặt lý thuyết, nghĩa là một vị trí trong đó tồn tại một chiến lược đảm bảo chiến thắng.
Để trở thành một chiến lược chiến thắng, nó đủ để di chuyển để luôn luôn di chuyển đến một vị trí chiến thắng về mặt lý thuyết cho người chơi vừa di chuyển, và do đó người chơi sẽ không đi tiếp. Vị trí đầu tiên trong số các vị trí chiến thắng (còn được gọi là vị trí lạnh ) là (0,0), (1,2), (2,1), (3,5), (5,3)
. Xem bài viết trên Wikipedia để biết giải thích về thuật toán để tìm chiến lược chiến thắng cho Wythoff's Nim, cũng như một công thức để tạo ra các vị trí giành chiến thắng.
Yêu cầu chương trình
Viết chương trình hoặc hàm lấy một vị trí làm đầu vào và xuất ra một nước đi chiến thắng dưới dạng vị trí sau khi di chuyển đó. Ít byte nhất sẽ thắng.
Nếu không có động thái chiến thắng tồn tại, tức là, vị trí là một mất mát về mặt lý thuyết, chương trình của bạn sẽ chỉ ra như vậy và bị mất.
Chương trình của bạn phải chạy trong một khoảng thời gian hợp lý. Vì vậy, một tìm kiếm cây đệ quy theo cấp số nhân sẽ không đủ. Nếu bạn muốn tính toán trước và mã hóa một chiến lược, điều đó tốt.
Đầu vào
Một cặp (i,j)
số không âm biểu thị kích thước cọc, mỗi số nhiều nhất 99
. Đây có thể là hai số, một tuple, một danh sách hoặc bất kỳ vùng chứa nào bạn thích.
Đầu ra
In hoặc xuất vị trí sau khi bạn di chuyển, một lần nữa dưới dạng hai số hoặc một thùng chứa. Đây phải là một bước đi hợp pháp đến một vị trí chiến thắng. Nếu có nhiều động thái như vậy, bất kỳ một động tác nào cũng tốt, nhưng chỉ một.
Nếu không có động thái chiến thắng, bạn phải chỉ ra điều này trong đầu ra. Bất kỳ đầu ra nào False
, None
0, hoặc (-1,-1)
sẽ làm, miễn là nó không phải là một vị trí hợp pháp, và đều giống nhau cho mọi đầu vào bị mất.
Ví dụ chạy
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)