खेल कभी किसी पहेली को हाथ से नहीं रचता। वह उसे एक अकेली संख्या से उगाता है, और फिर उस पहेली को स्वयं अपने ही विरुद्ध खेलता है ताकि आपके उसे देखने से पहले ही यह सुनिश्चित हो जाए कि वह न तो तुच्छ है और न ही असंभव।
अंग्रेज़ी में लिखा और संपादित। यह हिन्दी संस्करण मशीनी अनुवाद से तैयार किया गया है; जहाँ सटीकता महत्वपूर्ण हो, वहाँ अंग्रेज़ी मूल ही प्रामाणिक है। मूल अंग्रेज़ी में पढ़ें →
Contraption का कोई स्तर कहीं संग्रहीत नहीं होता। ऐसी कोई फ़ाइल नहीं है जिसमें दर्ज हो कि लक्ष्य कहाँ है या कगार कैसे सजे हैं। इसके बजाय पूरा स्तर, यानी गेंद का आरंभ-बिंदु, लक्ष्य की स्थिति, स्थिर दीवारों की संख्या और उनकी जगह, आपको थमाए गए भागों की सूची, सब कुछ सीड नामक एक अकेली प्रारंभिक संख्या से गणना करके निकाला जाता है। जनरेटर को वही सीड दें और आपको, बाइट-दर-बाइट, वही पहेली मिलेगी। 1
यह इसलिए संभव है क्योंकि जनरेटर के पास "यादृच्छिकता" का एकमात्र स्रोत एक छोटा-सा नियतात्मक छद्म-यादृच्छिक संख्या जनरेटर है। Contraption जिसका उपयोग करता है वह mulberry32 है, टॉमी एटिंगर द्वारा रचा गया एक संक्षिप्त 32-बिट जनरेटर; आप इसे उसके पहचान-चिह्न जैसे स्थिरांक 0x6d2b79f5 से पहचान सकते हैं, जो हर बार नई संख्या निकालने पर अवस्था में जोड़ा जाता है। 2 यह तेज़ है, कुछ पंक्तियों में समा जाता है, और, सबसे अहम बात, यह बिल्कुल भी यादृच्छिक नहीं है: यह एक निश्चित गणितीय अनुक्रम है जो केवल फेंटा हुआ दिखता है। इसे एक शुरुआत दें और यह सदा के लिए संख्याओं की वही धारा उत्पन्न करेगा। फिर जनरेटर उस धारा को पढ़कर तय करता है कि हर चीज़ कहाँ रखनी है।
Daily मोड कुछ सामाजिक करने के लिए इसी नियतात्मकता का सहारा लेता है। इसका सीड यादृच्छिक नहीं है, वह कैलेंडर से गढ़ा जाता है। खेल आज की तिथि सार्वभौमिक समय में लेता है, उसे "contraption:2026-7-28" जैसी एक छोटी स्ट्रिंग में लिखता है, और उस पाठ को एक हैश फ़ंक्शन से गुज़ारकर उसे निचोड़कर एक 32-बिट संख्या बना देता है। 1
वह हैश FNV-1a है, एक जाना-माना गैर-क्रिप्टोग्राफ़िक मिक्सर: यह एक निश्चित ऑफ़सेट से शुरू होता है, दशमलव 2166136261, यानी 0x811c9dc5, और हर अक्षर के लिए उस अक्षर को exclusive-or से मिला लेता है और फिर FNV अभाज्य संख्या 16777619 से गुणा करता है। 3 इससे ऐसी संख्या बचती है जो किसी दिए गए दिन के लिए स्थिर है और एक दिन से अगले दिन में बेतहाशा अलग, इसलिए तिथि में एक अक्षर का बदलाव सीड को पूरी तरह बिखेर देता है। चूँकि कैलेंडर सबके लिए एक ही है, इसलिए सीड भी एक ही है, और पहेली भी। दुनिया के विपरीत छोरों पर बैठे दो अजनबी Daily खोलते हैं और एक ही मैदान का सामना करते हैं, और ठीक यही बात स्कोर की तुलना को सार्थक बनाती है।
दैनिक चुनौती इसलिए न्यायपूर्ण नहीं है कि कोई सर्वर सबको एक ही स्तर भेजता है, बल्कि इसलिए कि हर किसी की प्रति उसी तिथि से स्वतंत्र रूप से उसी स्तर की दोबारा गणना करती है।
यादृच्छिक ज्यामिति आसान है; अच्छी यादृच्छिक ज्यामिति नहीं। एक जनरेटर जो बस एक लक्ष्य और कुछ कगार बिखेर देता है, कभी-कभी ऐसा स्तर बना देगा जहाँ ऊपर से गिराई गई गेंद बस अपने आप सीधे लक्ष्य में जा गिरती है। वह पहेली नहीं, वह एक कटसीन है। इसलिए किसी उम्मीदवार दुनिया को स्वीकार करने से पहले 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 के संस्करण को सुरुचिपूर्ण बनाने वाली बात यह है कि परीक्षण खेलने-योग्यता का कोई सस्ता स्थानापन्न नहीं है, वह स्वयं खेलने-योग्यता है। जनरेटर कगार गिनकर या दूरियाँ नापकर यह अनुमान नहीं लगाता कि स्तर न्यायसंगत है या नहीं। वह सचमुच स्तर को खेलता है, दो बार: एक बार खाली, यह पक्का करने के लिए कि वह मुफ़्त की जीत नहीं है, और एक बार एक टटोलने वाले रैंप के साथ, यह पक्का करने के लिए कि कोई रास्ता मौजूद है। वही नियतात्मक भौतिकी जो आपके समाधान का फ़ैसला करेगी, वही भौतिकी है जिसने पहेली को परखा। कोई अलग "स्तर सत्यापक" नहीं है जो असली नियमों से बेमेल हो सकता हो, क्योंकि नियमों का एक ही सेट है, जो हर चीज़ के लिए इस्तेमाल होता है।
और क्योंकि यह सब नियतात्मक है, यह ऑडिट दोनों दिशाओं में भाग्य से मुक्त है। दैनिक सीड किसी एक खिलाड़ी को दूसरे से आसान मैदान थमाने की साज़िश नहीं कर सकता, और किसी को अन्यायपूर्ण मैदान भी नहीं दे सकता, क्योंकि स्तर के चुनौती बनने से पहले ही वह खेले जाने की कसौटी से गुज़रकर बच निकला होता है, खेल द्वारा, स्वयं अपने ही विरुद्ध।