पृष्ठभूमि
हादसा एक काफी असामान्य प्रोग्रामिंग भाषा है, जिसमें टोकन की अपनी सूची पूर्व निर्धारित नहीं है, बल्कि इनपुट से अनुमान लगाया गया है। जैसे, एक हादसा कार्यक्रम को टोकन देना काफी मुश्किल हो सकता है, खासकर यदि आप इतनी कुशलता से करना चाहते हैं। यह कार्य वह स्वयं करने के बारे में है।
काम
आपके प्रोग्राम को इनपुट के रूप में एक स्ट्रिंग दी जाएगी। यहाँ एल्गोरिथ्म है कि हादसा टोकन का उपयोग करता है:
- सभी स्ट्रिंग्स को पहचानें जो इनपुट के विकल्प के रूप में ठीक तीन तरीकों से होते हैं (यानी इनपुट के भीतर उस स्ट्रिंग के बिल्कुल तीन घटनाएँ हैं)।
- इन तार कि एक और इस तरह के तार का एक स्ट्रिंग के किसी भी त्यागें (जैसे इनपुट के लिए
ababab
, केवल शेष स्ट्रिंग होगाab
, नहींa
याb
, क्योंकिa
औरb
दोनों सबस्ट्रिंग हैंab
)। - इनपुट के भीतर ओवरलैप करने वाले किसी भी तार को छोड़ दें। (उदाहरण के लिए,
aaaa
इसमें ठीक तीन प्रतियां शामिल हैंaa
, लेकिन ये प्रतियां दूसरे और तीसरे वर्ण पर ओवरलैप होती हैं, इसलिए इसे छोड़ दिया जाएगा। इसी तरह,abababa
तीन प्रतियों कीab
और तीन प्रतियां हैंba
, लेकिन दूसरे से छठे वर्ण हैं। एक का ओवरलैपab
और एकba
, दोनों बहुतab
औरba
खारिज कर दिया जाएगा)। - इस बिंदु पर बने रहने वाले कोई भी तार कार्यक्रम द्वारा उपयोग किए जाने वाले टोकन हैं। इन टोकन के अनुक्रम में मूल इनपुट को टोकन करें (पिछले चरण में त्यागने के कारण, इसे करने का केवल एक ही तरीका होगा)। इनपुट में कोई भी वर्ण जो किसी भी टोकन का हिस्सा नहीं है उसे टिप्पणियों के रूप में माना जाता है और खारिज कर दिया जाता है।
आपके प्रोग्राम को इनपुट के रूप में एक स्ट्रिंग लेनी है, और आउटपुट के रूप में स्ट्रिंग (टोकन की एक सूची, जिनमें से प्रत्येक को स्ट्रिंग के रूप में व्यक्त किया गया है) के संगत टोकन वापस करना है। इसके अतिरिक्त, यह कम से कम कुशलता से किया जाना है; विशेष रूप से, कार्यक्रम को द्विघात समय ("O (n") ") या बेहतर में चलाना है । (संयोग से, यह लगभग निश्चित रूप से द्विघात से तेज जाना संभव है, लेकिन यह सबसे तेज-एल्गोरिथ्म नहीं है , इसलिए बेझिझक एल्गोरिदम का उपयोग करने के लिए स्वतंत्र महसूस करें जो आप पा सकते हैं कि जटिलता सीमा के भीतर फिट बैठता है।)
स्पष्टीकरण
- हालांकि हादसे के कार्यक्रम में कोई भी 256 ऑक्टेट शामिल हो सकते हैं, यह आपके प्रोग्राम के लिए इस चुनौती के उद्देश्य से स्वीकार्य है कि केवल मुद्रण योग्य ASCII (अंतरिक्ष सहित), प्लस न्यूलाइन और टैब से बाहर किए गए इनपुट को संभाल सकें। (सभी ज्ञात हादसे कार्यक्रम खुद को इस सबसेट तक सीमित रखते हैं)। ध्यान दें कि स्पेस / न्यूलाइन / टैब विशेष नहीं हैं और टोकन के बीच में दिखाई दे सकते हैं; हादसा सभी 256 ओकटेट्स को अपारदर्शी मानता है।
- "द्विघात समय" की परिभाषा है "यदि इनपुट का आकार दोगुना हो जाता है, तो प्रोग्राम धीमी गति से चलेगा और स्थिर 4 से अधिक कारक नहीं होगा", अर्थात यदि t ( x ) आपके कार्यक्रम को अधिकतम समय लेता है तो आकार x के इनपुट की प्रक्रिया करें , फिर कुछ स्थिर k होना चाहिए जैसे कि t (2 x ) <4 t ( x ) + k सभी x के लिए । यह ध्यान रखें कि स्ट्रिंग्स की तुलना स्ट्रिंग्स की लंबाई के लिए आनुपातिक होती है।
- आपके प्रोग्राम को सैद्धांतिक रूप से किसी भी लम्बाई के इनपुट प्रोग्राम्स को संभालने में सक्षम होना चाहिए यदि आपकी भाषा में (संभवतः काल्पनिक) संस्करण है जिसमें असीमित मेमोरी है और अनबाउंड पूर्णांक का उपयोग करता है (यह ठीक है यदि प्रोग्राम अभ्यास के कारण चलने पर इस लक्ष्य को प्राप्त करने में विफल रहता है भाषा का पूर्णांक या मेमोरी वास्तव में बहुत बड़ी है)। आप मान सकते हैं (जटिलता की गणना के उद्देश्य से) कि पूर्णांक जो इनपुट की लंबाई से अधिक नहीं हैं, उनकी तुलना निरंतर समय में की जा सकती है (हालांकि ध्यान रखें कि यदि आप बड़े मूल्यों का उपयोग करते हैं, जैसे इनपुट को एक में परिवर्तित करने के कारण। एकल पूर्णांक, वे अंकों की संख्या की तुलना करने के लिए समय की एक लंबाई लेंगे जो उनके पास है)।
- आप किसी भी एल्गोरिथ्म का उपयोग कर सकते हैं जो जटिलता सीमा के भीतर फिट बैठता है, भले ही यह ऊपर वर्णित एल्गोरिथ्म के समान चरणों का पालन नहीं करता है, इसलिए जब तक यह एक ही परिणाम नहीं देता है।
- यह पहेली इनपुट को टोकन देने के बारे में है, वास्तव में आउटपुट को प्रारूपित करने के बारे में नहीं है। यदि आपकी भाषा में किसी सूची को आउटपुट करने का सबसे प्राकृतिक तरीका एक अस्पष्ट प्रारूप शामिल है (उदाहरण के लिए जब न्यूलाइन-अलग हो जाते हैं जब तार शाब्दिक newlines, या तार के बीच सीमांकक के बिना) होते हैं, तो इस तथ्य के बारे में चिंता न करें कि आउटपुट अस्पष्ट है। जब तक सूची वास्तव में निर्मित है)। आप अपने सबमिशन का दूसरा संस्करण बनाना चाहते हैं, जो परीक्षण में सहायता के लिए असंदिग्ध आउटपुट का उत्पादन करता है, लेकिन मूल संस्करण वह संस्करण है जो स्कोरिंग के लिए मायने रखता है।
परीक्षण का मामला
निम्नलिखित इनपुट स्ट्रिंग के लिए:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
आपके प्रोग्राम को निम्न आउटपुट सूची तैयार करनी चाहिए:
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
विजय की स्थिति
यह कोड-गोल्फ है , इसलिए सबसे छोटा मान्य (यानी सही इनपुट / आउटपुट व्यवहार और निष्पादित करने के लिए पर्याप्त रूप से तेज़), बाइट्स में मापा जाता है, जीतता है।