Tro choi
Nim là một trò chơi chiến lược toán học, trong đó 2 người chơi thay phiên nhau lấy các vật phẩm từ các đống khác nhau. Đến lượt bạn, bạn phải lấy ít nhất một vật phẩm và bạn có thể lấy bao nhiêu tùy thích, miễn là bạn chỉ lấy từ một đống. Người chơi lấy vật phẩm cuối cùng sẽ thắng! Đây là một trò chơi giải quyết. Trước khi tôi đi vào chiến lược, bạn có thể thử chơi trực tuyến tại đây .
Chiến lược
Chiến lược chiến thắng được giải thích rất rõ ràng và đơn giản tại đây . Tôi sẽ giải thích nó bằng cách sử dụng một chút thuật ngữ kỹ thuật. Cách để chiến thắng trò chơi này là luôn lấy càng nhiều vật phẩm càng tốt để tổng nhị phân-số luôn luôn bằng 0. Hãy xem xét bảng sau:
*
* *
* * *
* * * *
* * * * *
1 2 3 4 5
Để tìm tổng nhị phân-số của bảng này, bạn phải:
Chuyển đổi số trong mỗi hàng thành nhị phân. Vậy ta có 001, 010, 011, 100 và 101.
Thêm tất cả các số với nhau, và bỏ qua bất kỳ mang.
001 010 011 100 +101 ---- 001
Bạn cũng có thể bitwise-xor mỗi số và điều này sẽ đạt được kết quả tương tự.
Bây giờ, nếu tổng trong cấu hình hiện tại này là 001, thì đây chưa phải là một bảng chiến thắng. Nhưng bạn có thể làm cho nó một bảng chiến thắng! Nếu chúng tôi lấy một mục trong các cột 1, 3 hoặc 5, tổng sẽ là 0. Đây là một bảng chiến thắng, có nghĩa là, với điều kiện bạn không phạm sai lầm, người chơi tiếp theo sẽ di chuyển sẽ thua. Vì vậy, bạn phải luôn luôn kết thúc lượt của mình với một bảng chiến thắng. Hãy nói rằng bạn lấy một mục ra khỏi cột 5. Bây giờ bảng trông như thế này:
* *
* * *
* * * *
* * * * *
1 2 3 4 5
Miễn là bạn không làm hỏng, bạn có một chiến thắng được đảm bảo. Không có gì đối thủ của bạn có thể làm để ngăn chặn bạn. Hãy nói rằng anh ta lấy tất cả các mục từ cột 5.
*
* *
* * *
* * * *
1 2 3 4 5
Bạn sẽ đi đâu tiếp theo? Đừng cuộn xuống và cố gắng tự mình tìm ra.
Ngay bây giờ, tổng là 100. Di chuyển tốt nhất (và chỉ di chuyển chiến thắng) sẽ là lấy tất cả mọi thứ từ cột 4. Điều đó sẽ rời khỏi bảng như thế này:
*
* *
* * *
1 2 3 4 5
và tổng như thế này
001
010
+011
----
000
điều đó có nghĩa là bạn đang ở trong một bảng chiến thắng! Yay!
Các thách thức
Bạn phải viết một chương trình hoặc chức năng, được đưa ra một bảng nim, sẽ trả lại một nước đi chiến thắng, hoặc một giá trị chim ưng nếu không có nước cờ chiến thắng.
Đầu vào của bạn:
Sẽ là định dạng danh sách ngôn ngữ gốc của bạn, trong đó mỗi mục trong danh sách tương ứng với số lượng mục trong một cột nhất định. Ví dụ: đầu vào {4, 2, 1, 0, 3} tương ứng với bảng nim sau:
* * * * * * * * * * 1, 2, 3, 4, 5
(tùy chọn) Số lượng hàng. (Đối với các ngôn ngữ như C / C ++, nơi mà điều này không được biết đến từ chính danh sách.)
Đầu ra của bạn:
Có thể đi đến STDOUT hoặc được trả về từ chức năng
Phải là hai số, 1) cột chúng tôi đang xóa (Hãy nhớ rằng các cột được lập chỉ mục 0) và 2) số lượng mục cần xóa khỏi hàng đó. Đây có thể là một mảng gồm 2 mục, một chuỗi gồm hai số, v.v ... Hãy nhớ rằng câu trả lời có thể dài hơn 2 chữ số, do đó, trả về chuỗi "111" là không hợp lệ vì điều này không rõ ràng nếu điều này không rõ ràng có nghĩa là "Xóa một mục khỏi cột mười một" hoặc "Xóa mười một mục khỏi cột một". "1,11" hoặc "11,1" đều được chấp nhận.
Nếu không có câu trả lời, trả lại hoặc in một giá trị giả. Nếu ngôn ngữ của bạn chỉ có thể trả về một loại biến (một lần nữa, như C / C ++), một số âm cho cột hoặc 0 hoặc ít hơn cho số cần loại bỏ sẽ là giá trị falsey chấp nhận được.
Nếu số cột hoặc số cần loại bỏ quá lớn, đây được coi là đầu ra không hợp lệ.
Đầu vào / Đầu ra mẫu
[1, 2, 3, 4, 5]
---> [0, 1]
hoặc [4, 1]
hoặc[2, 1]
[1, 3, 5, 6]
---> [0, 1]
hoặc [1, 1]
hoặc[2, 1]
[1, 2, 0, 0, 5]
---> [4, 2]
[1, 2, 3]
---> ERROR
Nếu bạn chọn thực hiện một chức năng thay vì chương trình đầy đủ, thì bạn phải viết một chương trình đầy đủ để thể hiện chức năng đó trong thực tế. Điều này sẽ không được tính vào điểm số đầy đủ của bạn. Ngoài ra, các chương trình dự kiến sẽ chạy trong một khoảng thời gian hợp lý. Tôi không có kế hoạch nhập bất kỳ đầu vào quá lớn nào, miễn là chương trình của bạn không thực hiện tìm kiếm vũ phu trên toàn bộ cây trò chơi, bạn sẽ ổn thôi.
Như thường lệ, đây là môn đánh gôn, do đó, các vòng lặp tiêu chuẩn được áp dụng và các câu trả lời được tính bằng byte.
Bảng xếp hạng
Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.
Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:
# Language Name, N bytes
nơi N
là kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:
# Ruby, <s>104</s> <s>101</s> 96 bytes