เกมนี้ไม่เคยออกแบบปริศนาด้วยมือเลย มันเพาะปริศนาขึ้นมาจากตัวเลขเพียงตัวเดียว แล้วเล่นปริศนานั้นแข่งกับตัวเองเพื่อให้แน่ใจว่ามันไม่ง่ายจนไร้ความหมายและไม่ยากจนเป็นไปไม่ได้ ก่อนที่คุณจะได้เห็นมันเสียอีก
เขียนและเรียบเรียงเป็นภาษาอังกฤษ ฉบับภาษาไทยนี้จัดทำขึ้นด้วยการแปลด้วยเครื่อง ในจุดที่ความแม่นยำมีความสำคัญ ให้ถือต้นฉบับภาษาอังกฤษเป็นหลัก อ่านต้นฉบับภาษาอังกฤษ →
ด่านของ Contraption ไม่ได้ถูกเก็บไว้ที่ไหนเลย ไม่มีไฟล์ที่ระบุว่าประตูอยู่ตรงไหนหรือหิ้งถูกจัดวางอย่างไร แต่ทั้งด่าน ทั้งจุดเริ่มต้นของลูกบอล ตำแหน่งของประตู จำนวนและตำแหน่งของกำแพงตายตัว รวมถึงคลังชิ้นส่วนที่คุณได้รับ ล้วนถูกคำนวณขึ้นจากตัวเลขตั้งต้นเพียงตัวเดียวที่เรียกว่าซีด (seed) ป้อนซีดเดียวกันให้ตัวสร้างด่าน แล้วคุณจะได้ปริศนาเดิมเป๊ะทุกไบต์ 1
ที่เป็นเช่นนั้นได้ก็เพราะแหล่ง "ความสุ่ม" เพียงแหล่งเดียวของตัวสร้างด่านคือตัวสร้างเลขสุ่มเทียมแบบกำหนดได้ขนาดเล็กตัวหนึ่ง ตัวที่ Contraption ใช้คือ mulberry32 ตัวสร้างขนาด 32 บิตอันกะทัดรัดที่เขียนโดยทอมมี เอตทิงเจอร์ (Tommy Ettinger) คุณสังเกตมันได้จากค่าคงที่อันเป็นเอกลักษณ์ 0x6d2b79f5 ซึ่งถูกบวกเข้ากับสถานะทุกครั้งที่สุ่มค่า 2 มันเร็ว เขียนได้ในไม่กี่บรรทัด และที่สำคัญที่สุดคือมันไม่ได้สุ่มเลยแม้แต่น้อย มันคือลำดับทางคณิตศาสตร์ที่ตายตัวซึ่งเพียงแค่ดูเหมือนถูกสับเท่านั้น ให้จุดเริ่มต้นแก่มัน แล้วมันจะผลิตสายตัวเลขเดิมออกมาตลอดไป จากนั้นตัวสร้างด่านก็อ่านสายตัวเลขนั้นเพื่อตัดสินใจว่าจะวางทุกอย่างไว้ตรงไหน
โหมดรายวัน (Daily) อาศัยความกำหนดได้นี้เพื่อทำสิ่งที่เป็นเรื่องของสังคม ซีดของมันไม่ได้มาจากการสุ่ม แต่ถูกผลิตขึ้นจากปฏิทิน เกมนำวันที่ของวันนี้ตามเวลาสากลมาเขียนเป็นสตริงสั้น ๆ อย่าง "contraption:2026-7-28" แล้วส่งข้อความนั้นผ่านฟังก์ชันแฮชเพื่อเคี่ยวให้เหลือตัวเลข 32 บิตเพียงตัวเดียว 1
แฮชที่ใช้คือ FNV-1a ตัวผสมค่าแบบไม่เข้ารหัสลับที่รู้จักกันดี มันเริ่มจากค่าออฟเซ็ตตายตัวคือเลขฐานสิบ 2166136261 หรือ 0x811c9dc5 แล้วสำหรับอักขระแต่ละตัวก็นำตัวอักษรนั้นมาผสมเข้าไปด้วยการ exclusive-or จากนั้นคูณด้วยจำนวนเฉพาะ FNV คือ 16777619 3 ผลที่ได้คือตัวเลขที่คงที่สำหรับวันหนึ่ง ๆ แต่แตกต่างกันอย่างสุดขั้วจากวันหนึ่งไปอีกวันหนึ่ง ดังนั้นการเปลี่ยนอักขระเพียงตัวเดียวในวันที่ก็ทำให้ซีดกระจัดกระจายไปโดยสิ้นเชิง และเพราะปฏิทินเป็นแบบเดียวกันสำหรับทุกคน ซีดจึงเหมือนกัน และปริศนาก็เหมือนกันด้วย คนแปลกหน้าสองคนที่อยู่คนละซีกโลกเปิดโหมดรายวันขึ้นมาแล้วเจอสนามเดียวกันทุกประการ ซึ่งนั่นแหละคือสิ่งที่ทำให้การเปรียบเทียบคะแนนมีความหมาย
ความท้าทายรายวันยุติธรรมไม่ใช่เพราะมีเซิร์ฟเวอร์ส่งด่านเดียวกันให้ทุกคน แต่เพราะสำเนาเกมของทุกคนต่างคำนวณด่านเดียวกันขึ้นมาใหม่ด้วยตัวเองจากวันที่เดียวกัน
เรขาคณิตแบบสุ่มนั้นง่าย แต่เรขาคณิตแบบสุ่มที่ดีนั้นไม่ง่ายเลย ตัวสร้างด่านที่แค่โปรยประตูกับหิ้งสองสามอันลงไปจะสร้างด่านที่ลูกบอลซึ่งถูกปล่อยจากด้านบนตกลงไปในประตูเองตรง ๆ ออกมาบ้างในบางครั้ง นั่นไม่ใช่ปริศนา แต่เป็นฉากคัตซีน ดังนั้นก่อนที่ Contraption จะยอมรับโลกที่เป็นตัวเลือก มันจะรันการทดสอบเงียบ ๆ ที่โค้ดเรียกว่า preSolved นั่นคือมันจำลองด่านนั้นโดยไม่วางชิ้นส่วนใดเลย แล้วตรวจว่าลูกบอลเปล่า ๆ ไปถึงประตูได้ด้วยแรงโน้มถ่วงเพียงอย่างเดียวหรือไม่ ถ้าถึง ด่านนั้นจะถูกโยนทิ้งและตัวสร้างด่านจะสุ่มใหม่อีกครั้ง 1
นี่คือการกลับด้านอย่างแยบยลของวิธีที่คุณมักคิดถึงเอนจินฟิสิกส์ ฟังก์ชัน simulate() ตัวเดียวกันที่ใช้เล่นเครื่องจักรของคุณกำลังถูกหันกลับเข้าด้านใน ณ ขณะสร้างด่าน เพื่อตรวจสอบระดับความยากของด่านนั้นเอง เอนจินจึงเป็นทั้งกรรมการตัดสินคำตอบของคุณและผู้ตรวจสอบคุณภาพของปริศนาไปพร้อมกัน
การปฏิเสธด่านที่ง่ายเกินไปเป็นเพียงครึ่งหนึ่งของงาน อีกอันตรายหนึ่งคือด่านที่เป็นไปไม่ได้ ประตูที่ซ่อนอยู่ในที่ซึ่งไม่มีการจัดวางชิ้นส่วนแบบใดเข้าถึงได้ Contraption ป้องกันเรื่องนี้ด้วยตัวแก้ปริศนาแบบลองทุกทางขนาดเล็กที่ชื่อ plausiblySolvable มันไม่ได้คิดอย่างชาญฉลาด มันแค่ลองไปเรื่อย ๆ 1
พูดให้เจาะจงคือ มันกวาดทางลาดเพียงอันเดียวไปตามตารางตำแหน่งทั่วสนาม และที่แต่ละจุดก็ลองเอียงมันสี่แบบต่างกัน สำหรับการทดลองวางแต่ละครั้ง มันรันการจำลองเต็มรูปแบบแล้วถามว่า ทางลาดอันเดียวนั้นพาลูกบอลกลับบ้านได้ไหม ทันทีที่การวางแบบใดสำเร็จ ด่านนั้นจะถูกประกาศว่าแก้ได้และส่งมาถึงคุณ ถ้าไม่มีแบบใดสำเร็จเลยหลังจากกวาดครบทั้งหมด ตัวสร้างด่านจะเลือกทิ้งด่านนั้นแล้วลองซีดใหม่
| พารามิเตอร์การกวาด | ช่วง | ความหมาย |
|---|---|---|
| ทางลาด X | 15 → 85 ทีละ 14 | คอลัมน์ตามแนวขวางของสนาม |
| ทางลาด Y | 30 → 120 ทีละ 18 | แถวไล่ลงมาตามสนาม |
| มุมที่ลอง | 4 | ±0.45 และ ±0.8 เรเดียน |
| การทดสอบต่อการวางหนึ่งครั้ง | การจำลองเต็มรูปแบบ 1 ครั้ง | ลูกบอลไปถึงประตูหรือไม่ |
ควรพูดตรง ๆ ว่าสิ่งนี้พิสูจน์อะไรได้บ้าง เพราะโค้ดเองก็พูดตรง ๆ เช่นกัน คอมเมนต์ในโค้ดเรียกมันว่า "การตรวจความเป็นไปได้แบบประหยัด … ไม่ครอบคลุมทุกกรณี" ด่านที่ผ่านย่อมมีคำตอบแบบทางลาดเดียวอย่างหยาบ ๆ อย่างน้อยหนึ่งแบบแน่นอน ส่วนด่านที่ไม่ผ่านอาจยังแก้ได้ด้วยพัดลม เกียร์ หรือทางลาดที่วางอย่างฉลาดกว่าซึ่งตารางไม่เคยลอง ดังนั้นตัวสร้างด่านจึงไม่ถือว่าความล้มเหลวเป็นข้อพิสูจน์ว่าเป็นไปไม่ได้ มันเก็บโลกแรกที่ไม่ง่ายจนไร้ความหมายที่หาเจอไว้เป็นตัวสำรอง และถ้าผ่านไปสี่สิบครั้งแล้วยังไม่เจอคำตอบแบบชิ้นส่วนเดียวที่สะอาดหมดจด มันจะส่งตัวสำรองนั้นมาแทนที่จะวนลูปไปตลอดกาล ผลลัพธ์คือหลักประกันเชิงปฏิบัติ ไม่มีชัยชนะแบบได้เปล่า เกือบทุกครั้งมีเส้นทางเข้าถึงได้จริง และไม่มีการรอคอยไม่รู้จบเพื่อด่านที่ "สมบูรณ์แบบ" 1
ถอยออกมามองสักก้าว แล้วตัวสร้างด่านของ Contraption ก็คือตัวอย่างอันชัดเจนของรูปแบบการแก้ปัญหาที่เก่าแก่และกว้างขวางมาก นั่นคือสร้างแล้วทดสอบ เสนอตัวเลือกขึ้นมาแบบสุ่ม ตรวจสอบกับข้อกำหนดของคุณ เก็บไว้ถ้าผ่าน ทิ้งแล้วเสนอใหม่ถ้าไม่ผ่าน นี่คือลูปที่อยู่เบื้องหลังเนื้อหาแบบสร้างตามขั้นตอนในเกมนับไม่ถ้วน เบื้องหลังการคำนวณเชิงวิวัฒนาการส่วนใหญ่ และถ้ามองเผิน ๆ ก็อยู่เบื้องหลังการคัดเลือกโดยธรรมชาติเองด้วย การกลายพันธุ์เสนอ สิ่งแวดล้อมทดสอบ ผู้รอดชีวิตคงอยู่ต่อไป 4
สิ่งที่ทำให้เวอร์ชันของ Contraption สง่างามก็คือ การทดสอบนั้นไม่ใช่ตัวแทนแบบประหยัดของความสามารถในการเล่นได้ แต่มันคือความสามารถในการเล่นได้นั้นเอง ตัวสร้างด่านไม่ได้ประเมินว่าด่านยุติธรรมหรือไม่ด้วยการนับหิ้งหรือวัดระยะทาง มันเล่นด่านนั้นจริง ๆ สองครั้ง ครั้งแรกเล่นแบบว่างเปล่าเพื่อให้แน่ใจว่าไม่ใช่ของแจกฟรี และอีกครั้งเล่นด้วยทางลาดหยั่งเชิงเพื่อให้แน่ใจว่ามีเส้นทางอยู่จริง ฟิสิกส์แบบกำหนดได้ชุดเดียวกันที่จะตัดสินคำตอบของคุณคือฟิสิกส์ที่ตรวจรับรองปริศนานั้นมาแล้ว ไม่มี "ตัวตรวจสอบด่าน" แยกต่างหากที่อาจคลาดเคลื่อนไปจากกติกาจริง เพราะมีกติกาอยู่เพียงชุดเดียว และใช้กับทุกสิ่ง
และเพราะทั้งหมดนี้กำหนดได้ การตรวจสอบจึงปลอดจากโชคทั้งสองทาง ซีดรายวันไม่อาจสมคบคิดเพื่อยื่นสนามที่ง่ายกว่าให้ผู้เล่นคนหนึ่งมากกว่าอีกคน และไม่อาจยื่นสนามที่ไม่ยุติธรรมให้ใครได้ เพราะก่อนที่ด่านจะกลายเป็นความท้าทาย มันได้ผ่านการถูกเล่นมาแล้ว โดยตัวเกมเอง แข่งกับตัวมันเอง