पृष्ठभूमि
यह चुनौती अप्सिलर्स के सम्मान में है , जिन्होंने बेस्ट ऑफ पीपीसीजी 2016 में सर्वश्रेष्ठ के रूप में नहीं जीता है, उनकी चुनौती के साथ क्या मेरा 4-नोट संगीत बॉक्स उस गाने को खेल सकता है? बधाई हो!
उनके "मेरे बारे में" पृष्ठ पर, इस उपयोगकर्ता के पास गेम ऑफ लाइफ सेलुलर ऑटोमेटन के लिए एक बहुत साफ सिम्युलेटर है । (गंभीरता से, इसकी जांच करें।) दूसरी ओर, एस्पिलेरा शब्द "तीरंदाजी" के लिए स्पेनिश है। इन तथ्यों के प्रकाश में, यह चुनौती गेम ऑफ लाइफ में एरोलाइट्स के बारे में है।
गेम ऑफ लाइफ एरोलाइट्स
GoL में, हम एक ग्लाइडर द्वारा एक तीर , और एक दीवार को ब्लॉकों के अनुक्रम द्वारा दर्शाएंगे । एक एकल ग्लाइडर ऊपर से दीवार के पास पहुंचता है, और दीवार में एक अंतराल (एरोलीट) के माध्यम से उड़ान भरने की कोशिश करता है। आपका काम यह जांचना है कि ग्लाइडर तीर के माध्यम से गुजरता है या दीवार में क्रैश होता है।
इनपुट
आपका इनपुट बिट्स का एक ग्रिड है, जो एक गोएल कॉन्फ़िगरेशन का प्रतिनिधित्व करता है। आप इसे किसी भी उचित प्रारूप में ले सकते हैं (किसी भी दो डिस्टिक्ट प्रिंट करने योग्य ASCII वर्णों की बहुस्तरीय स्ट्रिंग, तार की सूची, पूर्णांक के 2 डी सरणी, बूलियन के 2 डी सरणी)। स्पष्टता के लिए, मैं .#
निम्नलिखित में वर्णों के बहुस्तरीय तारों का उपयोग करूंगा ।
इनपुट में कई गुण होने की गारंटी है। सबसे पहले, इसकी ऊंचाई कुछ एन and 6 के लिए 2N है , और इसकी चौड़ाई कम से कम 2N + 2 है । इनपुट सभी s होगा, सिवाय इसके कि शीर्ष तीन पंक्तियों में कहीं एक ग्लाइडर है, और दो मध्य पंक्तियों पर ब्लॉकों की एक दीवार है। ग्लाइडर दक्षिण-पश्चिम या दक्षिण-पूर्व की ओर जाएगा, और इसकी स्थिति ऐसी है कि यदि दीवारें हटा दी जाती हैं, तो यह नीचे के किनारे तक पहुंचने से पहले साइड किनारे से नहीं गुजरेगी (लेकिन यह ग्रिड के एक कोने तक पहुंच सकती है)। ग्लाइडर शुरू में कम से कम एक कदम से बाएं और दाएं किनारों से अलग होता है । यह किसी भी चरण में हो सकता है।.
.
दीवार में ब्लॉक होते हैं, जो .
एस के एक कॉलम से अलग होते हैं , एक जगह को छोड़कर, जहां वे .
एस के कम से कम दो कॉलम से अलग हो जाएंगे । ग्लाइडर की तरह, बाएं और दाएं ब्लॉक को भी .
एस के एक कदम से किनारों से अलग किया जाता है । हमेशा बाएं किनारे पर कम से कम एक ब्लॉक और दाएं किनारे पर एक ब्लॉक होगा।
यहां एक मान्य इनपुट ग्रिड का एक उदाहरण दिया गया है:
....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................
उत्पादन
जैसा कि कहा गया है, आपका कार्य यह निर्धारित करना है कि ग्लाइडर दीवार में टकराता है या दक्षिण किनारे से होकर जाता है। इस चुनौती के प्रयोजनों के लिए, क्रैश तब होता है जब कॉन्फ़िगरेशन में अब एकल ग्लाइडर और ब्लॉकों की दीवार नहीं होती है, चाहे सिमुलेशन में बाद में क्या हो। निम्नलिखित आरेख छोटे अंतराल दिखाते हैं कि दक्षिण-पूर्व ग्लाइडर दो अलग-अलग चरणों में दुर्घटनाग्रस्त हुए बिना गुजर सकता है (दक्षिण-पश्चिम ग्लाइडर के लिए स्थिति सममित है)।
...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##
...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##
यदि ग्लाइडर दीवार के माध्यम से उड़ता है, तो आप एक सत्य मूल्य, और अन्यथा एक मिथ्या मूल्य का उत्पादन करेंगे। ऊपर के उदाहरण के लिए, सही आउटपुट गलत है, क्योंकि ग्लाइडर दीवार के बाएं हिस्से में दुर्घटनाग्रस्त हो जाएगा।
इस चुनौती के प्रयोजनों के लिए, आप यह मान सकते हैं कि यदि आप 2 * (ऊंचाई - 3) चरणों के लिए इनपुट पर GoL का अनुकरण करते हैं , तो ग्लाइडर अपेक्षित स्थिति में नीचे की पंक्ति में है और दीवार बरकरार है, तो आउटपुट सत्य है ।
नियम और स्कोरिंग
आप एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं। सबसे कम बाइट गिनती जीतती है।
परीक्षण के मामलों
मैंने परीक्षण मामलों को एक GitHub रिपॉजिटरी में एकत्र किया है , क्योंकि वे काफी बड़े हैं। यहां अलग-अलग फ़ाइलों के लिंक दिए गए हैं: