พื้นหลัง
Menace ( M achine E ducable N oughts ครั้งC Rosses E ngine) เป็นขั้นตอนวิธีการเรียนรู้เครื่องตื้นพื้นฐานสำหรับเอกซ์เกมและไม้กางเขนที่สร้างขึ้นโดยนักวิทยาศาสตร์คอมพิวเตอร์ชาวอังกฤษโดนัลด์ Michie ในปี 1960 แต่เดิมมันถูกนำไปใช้กับ 304 กลักไม้ขีดไฟแต่ละป้ายที่มีตำแหน่งกระดานและมีลูกปัดสี (กับหนึ่งในเก้าสีแสดงถึงการเคลื่อนไหวที่เป็นไปได้) Michie คำนวณว่า 304 matchboxes เหล่านี้เพียงพอสำหรับทุกการเคลื่อนไหวบนกระดาน
ในทางคณิตศาสตร์มากขึ้นในหมู่คุณอาจรู้ว่ามีการรวมกันที่เป็นไปได้ของ Noughts, Crosses และ Blanks บนกระดาน N&C 19,683 อย่างไรก็ตามเขาคำนวณวิธีที่จะลดจำนวนนี้ (เพื่อเพิ่มความเร็วของอัลกอริทึมและมีแนวโน้มที่จะลดจำนวนในกล่องจับคู่!) ประการแรกเขาลบการเคลื่อนไหวที่เป็นไปไม่ได้ทั้งหมดเช่น:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(สองเอกซ์และสี่ครอส)
ถัดไปเขาชดเชยการหมุน ตัวอย่างเช่นหากอยู่ในกลักไม้ขีดไฟเราจะเห็น:
-------
| |0|0|
|X| |X|
| |0| |
-------
เราสามารถใช้กล่องเดียวกันสำหรับ
-------
| |X| |
|0| |0|
| |X|0|
-------
ดังนั้นลูกปัดสีดังกล่าวจึงแสดงถึงตำแหน่งที่สัมพันธ์กันไม่ใช่เม็ดสีที่แน่นอน ตัวอย่างเช่นถ้าเราบอกว่าลูกปัดสีแดงหมายถึงบนซ้ายเราจะดูภาพที่ด้านบนของกล่องและดู:
-------
| |0|0|
|X| |X|
| |0| |
-------
ดังนั้นเราจึงรู้ว่าในกรณีที่เป็นกระดานจากนั้นเม็ดสีแดงจะหมายถึง:
-------
|R|0|0|
|X| |X|
| |0| |
-------
แต่ถ้าเป็นกระดาน:
-------
| |X| |
|0| |0|
| |X|0|
-------
ลูกปัดสีแดงจะหมายถึง
-------
| |X|R|
|0| |0|
| |X|0|
-------
การแปลงเหล่านี้ใช้สำหรับการหมุนและการกลับด้าน (ในทุกทิศทางรวมถึงแนวทแยงมุม) อีกครั้งคุณจะต้องบันทึกเฉพาะกล่องไม้ขีดแต่ละครั้งด้วยวิธีนี้: อย่าสร้างกล่องเสมือนแยกสำหรับการแปลงแต่ละครั้ง!
ความเรียบง่ายอีกอย่างของ Michie คือการทำให้แน่ใจว่าคอมพิวเตอร์ไปก่อน ด้วยวิธีนี้เขาสามารถลบการเคลื่อนย้ายระดับแรกทั้งหมดลบประมาณหนึ่งในห้าของกล่องที่เหลือ ในที่สุดเขาก็ลบกล่องจบเกมทั้งหมด (เนื่องจาก 'เนื้อหา' หรือการย้ายถูกต้องในขั้นตอนเหล่านี้)
ตอนนี้มาถึงอัลกอริทึม (มันง่ายมาก):
- ก่อนอื่นให้ตัดสินใจว่าสีของลูกปัดนั้นหมายถึงอะไร คุณจะต้องมี 9 สีเพื่อเป็นตัวแทนของแต่ละช่องว่างบนกระดาน
- ในช่วงเริ่มต้นของการแข่งขัน 304 matchbox แต่ละอันจะมีเม็ดบีด ในขณะที่เม็ดมีสีแบบสุ่ม (ดังนั้นจึงซ้ำกันได้ดี) พวกเขาควรจะเคลื่อนไหวได้ (ดังนั้นหากภาพสถานะของบอร์ดแสดงให้เห็นว่า 'O' อยู่ตรงกลางขวาคุณจะไม่สามารถใช้ลูกปัดที่แทนค่ากลาง - ขวา).
- ทุกครั้งที่มีการหมุน (X) ของ MENACE ให้ค้นหา matchbox ที่มีตำแหน่งกระดานปัจจุบัน (หรือการเปลี่ยนแปลงของมัน) ที่พิมพ์ลงบน
- เปิดกลักไม้ขีดไฟและเลือกลูกปัดใด ๆ ที่นั่นโดยการสุ่ม
- ค้นหาว่าสถานะของบอร์ดได้รับการเปลี่ยนแปลงอย่างไรเพื่อไปยังภาพบนกลักไม้ขีดไฟ (เช่นหมุนทวนเข็มนาฬิกา 90deg) จากนั้นใช้การแปลงนั้นกับลูกปัด (เช่นซ้ายบนกลายเป็นซ้ายซ้าย)
- วาง X ในตารางนั้น นำ bead ที่เลือกออกจากกลักไม้ขีดไฟ หากกล่องถูกปล่อยว่างเปล่าให้ใส่ลูกปัดสามเม็ด (เป็นไปได้) ลงในกล่องแล้วเลือกหนึ่งเม็ดเพื่อย้าย
- ทำซ้ำ 3-6 จนกว่าเกมจะจบลง
- หาก MENACE ชนะเกมให้ย้อนกลับไปในทุก ๆ แมทช์ที่ MENACE ใช้ จากนั้นย้อนกลับไปที่เม็ดสีที่ใช้กับการเคลื่อนไหวนั้น ใส่ลูกปัดสองสีนั้นลงในกล่อง (เพื่อให้มีลูกปัดดั้งเดิม + อีกหนึ่งเม็ดซึ่งจะเป็นการเพิ่มความเป็นไปได้ที่ MENACE จะทำเช่นนั้นในครั้งต่อไปที่ได้รับตำแหน่งนั้น)
- หาก MENACE แพ้ในเกมอย่าทำอะไรเลย ( อย่าเปลี่ยนเม็ดที่เอาออกไป)
- หาก MENACE ดึงเกมออกมาให้เปลี่ยนเม็ดที่ใช้ในการเคลื่อนไหวแต่ละครั้ง แต่ไม่ต้องเพิ่มเม็ดเสริมเพื่อให้คุณเหลือสิ่งที่คุณเริ่ม
สิ่งนี้ทำให้เรามีอัลกอริทึมที่ง่ายมาก แต่ยากที่จะใช้งาน สิ่งนี้เป็นพื้นฐานของความท้าทายของคุณ
หากคุณยังสับสนอยู่ให้ดูhttp://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - เป็นสิ่งที่ฉันอ่านเมื่อฉันเรียนรู้เกี่ยวกับอัลกอริทึมนี้เป็นครั้งแรก
ท้าทาย
เล่นเกม Tic-Tac-Toe ด้วยคอมพิวเตอร์ ในแต่ละขั้นตอนให้ส่งออกเนื้อหาของกล่องจับคู่ทั้งหมด
ปัจจัยการผลิต
- ในช่วงเริ่มต้นของโปรแกรมจะมีตัวเลขบอกว่ามีกี่เกมที่คุณต้องการเล่นกับ MENACE
- จากนั้นหลังจากเลี้ยวแรกของ MENACE คุณป้อนการเคลื่อนไหวของคุณเป็นสตริงอักขระสองตัวอักษรตัวแรกคือ "L", "R" หรือ "M" (ซ้าย, ขวาหรือกลาง) อ้างอิงถึงแกน Y จากนั้นคุณป้อนตัวอักษรอื่น (อีกครั้ง, "L", "R" หรือ "M") ในครั้งนี้อ้างถึงแกน X ทำซ้ำสำหรับทุกการเคลื่อนไหวและเกม
เอาท์พุท
- ในช่วงเริ่มต้นของแต่ละเกมใหม่เอาท์พุท "เกมใหม่"
- หลังจากผู้เล่นย้ายแต่ละครั้งให้เอาบอร์ดออกในรูปแบบที่เหมาะสม ไม่จำเป็นต้องดูสวย (เช่นอาร์เรย์ที่แสดงตำแหน่งของบอร์ดได้ดี)
- หลังจากการเคลื่อนไหวของผู้เล่นแต่ละครั้ง MENACE ควรทำการเคลื่อนที่ เอาท์พุทบอร์ดหลังจากการเคลื่อนไหวของ MENACE
- หลังจากแต่ละเกมให้ส่งเนื้อหาของการแข่งขัน 304 ทั้งหมด ประคำสามารถแสดงด้วยตัวอักษรชื่อของสีอักขระหรือสตริงหรือจำนวนเต็มใด ๆ ที่คุณชอบ (ไม่มีตัวชี้ฟังก์ชันที่ไม่ระบุชื่อ ฯลฯ )
กฎระเบียบ
- นี่คือcode-golfดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
- ฉันต้องสามารถป้อนข้อมูลการเคลื่อนไหวหลังจากเห็นการตอบสนองของ MENACE ไม่ 'ผ่านการเคลื่อนไหวทั้งหมดของคุณไปยังฟังก์ชั่นนี้และดูว่าเกมเล่นอย่างไร'
- กระดานจะต้องล้างระหว่างเกม
- กล่องไม้ขีดไฟจะต้องไม่ถูกล้างระหว่างเกม (สิ่งนี้จะรีเซ็ตการเรียนรู้ของเครื่อง)
- คุณต้องมี 304 matchboxes ทุกคนสามารถใช้อัลกอริทึมนี้กับกล่องตรงกัน 19,683 ทั้งหมด แต่การเรียนรู้ช้า (เนื่องจากต้องใช้เกมจำนวนมากในการรับเนื้อหาทั้งหมดที่มีประโยชน์)
- เอาต์พุตสามารถอยู่ในรูปแบบที่สมเหตุสมผลและอินพุตสามารถใช้ตามมาตรฐาน PPCG (ตราบใดที่เป็นไปตามกฎ 2) หากคุณต้องการปรับรูปแบบการป้อนข้อมูล (ตามที่อธิบายไว้ในส่วน 'การป้อนข้อมูล ') ก็ถือว่าใช้ได้ตราบใดที่เหมาะสม
- เกมจะจบลงเมื่อผู้เล่นชนะ (โดยได้สามแถวติดต่อกัน, แนวนอนหรือแนวตั้ง) หรือหากมีการเสมอ (กระดานเต็มและไม่มีผู้ชนะ)
- ในขณะที่ MENACE ต้องการให้มีการเคลื่อนไหวที่เป็นไปได้ (และมีเม็ดบีดที่เป็นไปได้ภายในแต่ละกลักไม้ขีดไฟ) เพื่อความท้าทายที่คุณไม่จำเป็นต้องตรวจสอบอินพุตของผู้ใช้ หากพวกเขาพิมพ์สิ่งผิดปกติโปรแกรมของคุณสามารถทำอะไรก็ได้ (ไปอย่างสมบูรณ์บ้าคลั่งโยนความผิดพลาด ฯลฯ ) - คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้อง
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
เช่นถ้าคุณเลือกที่จะเป็นตัวแทนของตัวเลขลูกปัด: