Lý lịch
Menace ( M achine E ducable N oughts Một nd C Rosses E ngine) là một thuật toán học máy nông thô sơ cho noughts trò chơi và Crosses, được tạo ra bởi nhà khoa học máy tính người Anh Donald Michie trong những năm 1960. Ban đầu nó được thực hiện với 304 hộp diêm, mỗi hộp được dán nhãn vị trí bảng và chứa các hạt màu (với một trong chín màu, đại diện cho các bước di chuyển có thể). Michie tính toán rằng 304 hộp diêm này là đủ cho mọi sự kết hợp di chuyển trên bảng.
Toán học nhiều hơn trong số bạn có thể nhận ra rằng thực sự có 19.683 kết hợp Noughts, Crosses và Blanks có thể có trên bảng N & C; tuy nhiên, ông đã tính toán các cách để cắt giảm con số này (để tăng tốc thuật toán và có khả năng cắt giảm các hộp diêm!). Đầu tiên, anh ta loại bỏ tất cả các động thái không thể, chẳng hạn như:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(hai noughts và bốn cross)
Tiếp theo, anh bù đắp cho vòng quay. Chẳng hạn, nếu trên hộp diêm chúng ta thấy:
-------
| |0|0|
|X| |X|
| |0| |
-------
chúng ta có thể sử dụng cùng một hộp cho
-------
| |X| |
|0| |0|
| |X|0|
-------
Do đó, các hạt màu nói trên đại diện cho các vị trí tương đối, không phải là tuyệt đối. Chẳng hạn, nếu chúng ta nói rằng một hạt màu đỏ có nghĩa là trên cùng bên trái, thì chúng ta sẽ xem hình ảnh trên đỉnh hộp và xem:
-------
| |0|0|
|X| |X|
| |0| |
-------
Vì vậy, chúng tôi biết rằng trong trường hợp đây là bảng, thì hạt màu đỏ có nghĩa là:
-------
|R|0|0|
|X| |X|
| |0| |
-------
Nhưng nếu đây là bảng:
-------
| |X| |
|0| |0|
| |X|0|
-------
hạt màu đỏ có nghĩa là
-------
| |X|R|
|0| |0|
| |X|0|
-------
Những biến đổi này được áp dụng cho các phép quay và đảo ngược (theo mọi hướng, bao gồm cả đường chéo). Một lần nữa, bạn chỉ cần lưu từng hộp diêm một lần theo cách này: không tạo các hộp ảo riêng cho mỗi lần chuyển đổi!
Một đơn giản hóa khác mà Michie đã thực hiện là đảm bảo máy tính đi trước. Bằng cách này, anh ta có thể loại bỏ tất cả các bước di chuyển cấp một, loại bỏ khoảng một phần năm các hộp còn lại. Cuối cùng, anh ta xóa tất cả các hộp kết thúc trò chơi (vì không cần thêm 'nội dung' hoặc di chuyển trong các bước này).
Phải, bây giờ vào chính thuật toán (nó rất đơn giản):
- Đầu tiên, quyết định màu sắc của các hạt thể hiện. Bạn sẽ cần 9 màu để thể hiện từng khoảng trống trên bảng.
- Khi bắt đầu trò chơi, mỗi hộp diêm 304 đều chứa các hạt. Mặc dù các hạt có màu ngẫu nhiên (vì vậy các bản sao đều ổn), chúng nên có thể di chuyển (vì vậy nếu hình ảnh trạng thái bảng mô tả chữ 'O' ở giữa bên phải, thì bạn không thể sử dụng hạt đại diện cho phần giữa đúng).
- Mỗi khi đến lượt của MENACE (X), hãy tìm hộp diêm với vị trí bảng hiện tại (hoặc một số biến đổi của nó) được in trên đó.
- Mở hộp diêm và chọn bất kỳ hạt nào trong đó một cách ngẫu nhiên.
- Tìm cách chuyển trạng thái bảng để chuyển sang hình ảnh trên hộp diêm (ví dụ: xoay 90deg ngược chiều kim đồng hồ). Sau đó, áp dụng phép biến đổi đó cho chuỗi hạt (ví dụ: trên cùng bên trái trở thành bên trái).
- Đặt dấu X vào hình vuông đó. Loại bỏ các hạt đã chọn từ hộp diêm. Nếu hộp bị bỏ trống do đó, hãy đặt ba hạt ngẫu nhiên (có thể) vào hộp và chọn một trong số chúng để di chuyển.
- Lặp lại 3-6 cho đến khi trò chơi kết thúc.
- Nếu MENACE thắng trò chơi, hãy quay lại qua mọi hộp diêm mà MENACE đã lấy. Sau đó, theo dõi lại những hạt màu nó đã sử dụng trên di chuyển đó. Đặt hai màu của hạt đó vào hộp (để có hạt ban đầu + thêm một hạt nữa, do đó làm tăng khả năng của MENACE khiến cho lần di chuyển đó đến lần tiếp theo vào vị trí đó)
- Nếu MENACE thua trò chơi, không làm gì cả ( đừng thay thế các hạt đã lấy ra).
- Nếu MENACE vẽ trò chơi, sau đó thay thế chuỗi hạt được sử dụng trong mỗi lần di chuyển của nó, nhưng không thêm một lần nữa, để bạn còn lại với những gì bạn đã bắt đầu.
Điều này để lại cho chúng tôi một thuật toán rất đơn giản, nhưng khó thực hiện. Điều này tạo thành cơ sở cho thách thức của bạn.
Nếu bạn vẫn còn bối rối, hãy xem http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - đó là những gì tôi đọc khi lần đầu tiên biết về thuật toán này
Thử thách
Chơi một trò chơi Tic-Tac-Toe với máy tính. Ở mỗi bước, xuất nội dung của tất cả các hộp diêm.
Đầu vào
- Khi bắt đầu chương trình, một con số cho biết bạn muốn chơi bao nhiêu game với MENACE
- Sau đó, sau lượt đầu tiên của MENACE, bạn nhập di chuyển của mình dưới dạng một chuỗi hai ký tự, chữ cái đầu tiên là "L", "R" hoặc "M" (trái, phải hoặc giữa) đề cập đến trục Y. Sau đó, bạn nhập một chữ cái khác (một lần nữa, "L", "R" hoặc "M"), lần này đề cập đến trục X. Lặp lại cho tất cả các di chuyển và trò chơi.
Đầu ra
- Khi bắt đầu mỗi trò chơi mới, hãy xuất "trò chơi mới".
- Sau mỗi lần di chuyển của người chơi, hãy xuất bảng theo bất kỳ định dạng hợp lý nào. Nó không cần phải trông đẹp (ví dụ, một mảng các mảng đại diện cho các vị trí của bảng là tốt).
- Sau mỗi lần di chuyển của người chơi, MENACE nên thực hiện một động tác. Xuất bảng sau khi di chuyển của MENACE
- Sau mỗi trò chơi, xuất nội dung của tất cả 304 hộp diêm. Các hạt có thể được biểu thị bằng một chữ cái, tên của một màu, ký tự hoặc bất kỳ chuỗi hoặc số nguyên nào bạn thích (không có con trỏ, hàm ẩn danh, v.v.).
Quy tắc
- Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất bằng byte thắng.
- Tôi phải có thể nhập di chuyển sau khi thấy phản hồi của MENACE. Không 'chuyển tất cả các bước di chuyển của bạn vào chức năng này và xem cách trò chơi diễn ra'.
- Bảng phải được xóa giữa các trò chơi.
- Các hộp diêm không được xóa giữa các trò chơi (điều này sẽ thiết lập lại máy học)
- Bạn phải có 304 hộp diêm. Bất cứ ai cũng có thể thực hiện thuật toán này với tất cả 19.683 hộp diêm, nhưng việc học rất chậm (vì nó đòi hỏi rất nhiều trò chơi để có được tất cả chúng với nội dung hữu ích).
- Đầu ra có thể ở bất kỳ định dạng hợp lý nào và đầu vào có thể được lấy theo tiêu chuẩn PPCG (miễn là tuân thủ quy tắc 2). Nếu bạn cần điều chỉnh định dạng đầu vào (như được mô tả trong phần ' Đầu vào ') thì miễn là nó hợp lý.
- Trò chơi kết thúc khi người chơi thắng (bằng cách xếp ba hàng liên tiếp theo đường chéo, chiều ngang hoặc chiều dọc) hoặc nếu có một trận hòa (bảng đầy đủ và không có người chiến thắng)
- Mặc dù MENACE cần thực hiện các động tác có thể (và chỉ có các hạt khả dĩ bên trong mỗi hộp diêm), vì thách thức mà bạn không cần phải xác thực đầu vào của người dùng. Nếu họ gõ sai, chương trình của bạn có thể làm bất cứ điều gì (phát điên hoàn toàn, ném lỗi, v.v.) - bạn có thể cho rằng đầu vào là chính xác.
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.