पर्ल 5 , -p0 105 101 96 93 90 89 बाइट्स
इनपुट के bबजाय उपयोग करता है 1।
सुनिश्चित करें कि STDIN पर मैट्रिक्स एक नई रेखा के साथ समाप्त हो गया है
#!/usr/bin/perl -p0
s%b%$_="$`z$'";s:|.:/
/>s#(\pL)(.{@{-}}|)(?!\1)(\pL)#$&|a.$2.a#se&&y/{c/z />0:seg&/\B/%eg
इसे ऑनलाइन आज़माएं!
प्रतिस्थापन के 3 स्तरों का उपयोग करता है!
यह 87 बाइट संस्करण इनपुट और आउटपुट प्रारूप दोनों में व्याख्या करना आसान है, लेकिन प्रतिस्पर्धा नहीं है क्योंकि यह आउटपुट में 3 अलग-अलग वर्णों का उपयोग करता है:
#!/usr/bin/perl -0p
s%b%$_="$`z$'";s:|.:/
/>s#(\w)(.{@{-}}|)(?!\1)(\w)#$&|a.$2.a#se&&y/{c/z />0:seg&/\B/%eg
इसे ऑनलाइन आज़माएं!
sपंक्ति के टर्मिनेटर (न्यूलाइन के बजाय) के रूप में कुछ अलग (गैर-अल्फ़ान्यूमेरिक) वर्ण का उपयोग करके दोनों संस्करणों में एक और बाइट (रेगेक्स संशोधक) को सहेजना आसान है , लेकिन यह फिर से इनपुट को काफी अपठनीय बनाता है।
यह काम किस प्रकार करता है
प्रतिस्थापन पर विचार करें
s#(\w)(.{columns}|)(?!1)(\w)#c$2c#s
इससे दो अक्षर मिलेंगे जो अलग-अलग और एक-दूसरे के क्षैतिज या लंबवत होते हैं और उनके द्वारा प्रतिस्थापित होते हैं c। एक चक्रव्यूह में जिसके पथ पूरी तरह से अक्षर bसे बने होते हैं, क्योंकि पत्र समान होते हैं, लेकिन जैसे ही अक्षरों में से एक को दूसरे से बदल दिया जाता है (जैसे z) उस पत्र और एक पड़ोसी को बदल दिया जाएगा cऔर दोहराया आवेदन एक है cबीज से जुड़े घटक का बाढ़-भराव z।
हालांकि इस मामले में मैं पूरी तरह से बाढ़ नहीं भरना चाहता। मैं केवल एक पड़ोसी को भरना चाहता हूं z, इसलिए पहले चरण के बाद मैं zचला गया चाहता हूं । यह पहले से ही c$2cप्रतिस्थापन के साथ काम करता है , लेकिन मैं बाद में एक ही बिंदु से शुरू होने वाली एक और भुजा के साथ बाढ़-भरण को फिर से शुरू करना चाहता हूं और मुझे नहीं पता कि cमूल रूप से कौन सा था z। इसलिए इसके बजाय मैं उपयोग करता हूं
s#(\w)(.{columns}|)(?!\1)(\w)#$&|a.$2.a#se
b | aहै c, b | cहै cऔर z | aहै {। तो पहले चरण में बने रास्तों के साथ एक भूलभुलैया में bऔर एक बीज zको bजगह मिल जाएगी cऔर zवह बदल जाएगा {जिसके द्वारा एक पत्र नहीं है और मेल नहीं खाता है \wऔर इसलिए आगे भरने का कारण नहीं होगा। cहालांकि जा रहा एक और बाढ़ भरण रखेंगे और बीज में से एक पड़ोसी हाथ भर जाता है। जैसे शुरू
b c
b c
bbzbb becomes bb{bb
b b
b b
मैं तो कुछ गैर पत्र (जैसे द्वारा सभी ग की जगह ले सकता -है) और की जगह {से zफिर से बाढ़ भरण पुनः आरंभ करने की:
- -
- -
bbzbb becomes cc{bb
b b
b b
और इस प्रक्रिया को तब तक दोहराएं जब तक बीज के सभी पड़ोसी परिवर्तित नहीं हो जाते। अगर मैं तो एक बार फिर बदलने के {द्वारा zऔर बाढ़ से भरना:
- -
- -
--z-- stays --z--
- -
- -
zअंत में पीछे बनी हुई है क्योंकि के साथ एक परिवर्तन करने के लिए कोई पड़ोसी है। यह स्पष्ट करता है कि निम्नलिखित कोड के टुकड़े में क्या होता है:
/\n/ >
पहली नईलाइन खोजें। प्रारंभिक ऑफसेट अब अंदर है@-
s#(\w)(.{@{-}}|)(?!\1)(\w)#$&|a.$2.a#se
रेगेक्स ऊपर @{-}स्तंभों की संख्या के रूप में चर्चा करता है (चूंकि सादा @-पर्ल पार्सर को भ्रमित करता है और ठीक से स्थानापन्न नहीं करता है)
&&
/\n/हमेशा सफल होता है और प्रतिस्थापन जब तक हम अभी भी बाढ़ से भरना कर सकते हैं सच है। &&यदि एक हाथ की बाढ़-भरण हो जाए तो उसके बाद का भाग निष्पादित होता है। यदि नहीं बाईं ओर एक खाली स्ट्रिंग का मूल्यांकन करता है
y/{c/z / > 0
बाढ़-भरण को फिर से शुरू करें और यदि पिछले बाढ़-भरण ने कुछ किया हो तो 1 लौटें। और खाली स्ट्रिंग वापस करें। इस पूरे कोड को अंदर लपेटा गया है
s:|.: code :seg
इसलिए अगर इसे बीज की स्थिति में एक प्रारंभिक स्ट्रिंग पर निष्पादित किया $_जाता है z, तो अंदर कोड का टुकड़ा कई बार निष्पादित किया जाएगा, जिसमें ज्यादातर कुछ भी नहीं लौटता है, लेकिन 1हर बार पड़ोसी के हाथ में बाढ़ आ जाती है। प्रभावी रूप $_से नष्ट हो जाते हैं और 1उनकी जगह ले ली जाती है क्योंकि इसमें जुड़े हुए घटक जुड़े होते हैं z। ध्यान दें कि लूप को घटक आकार + हथियारों की संख्या के योग तक निष्पादित करने की आवश्यकता होती है, लेकिन यह ठीक है क्योंकि यह "नए वर्णों सहित वर्णों की संख्या * 2 + 1" बार होगा।
यदि कोई 1's (खाली स्ट्रिंग, एक पृथक शीर्ष) नहीं है या यदि 1 से अधिक भुजाएँ (2 1s से अधिक) हैं तो भूलभुलैया को काट दिया जाता है । यह रेगेक्स का उपयोग करके जांचा जा सकता है /\B/(यह पुराने पर्ल संस्करणों पर 0बदले देता है 1। यह तर्कपूर्ण है कि कौन सा गलत है)। दुर्भाग्य से अगर यह मेल नहीं खाता है तो इसके बजाय एक खाली स्ट्रिंग देगा 0। हालांकि s:|.: code :segहमेशा कर एक से तो एक विषम संख्या लौटने के लिए डिजाइन किया गया था &के साथ /\B/इस दे देंगे 0या 1।
जो कुछ बचा है वह पूरे इनपुट ऐरे से चल रहा है और प्रत्येक चलने योग्य स्थिति के साथ zऔर जुड़े हुए हथियारों की गिनती कर रहा है। यह आसानी से किया जाता है:
s%b%$_="$`z$'"; code %eg
एकमात्र समस्या यह है कि गैर-चलने योग्य पदों में पुराने मूल्य को बरकरार रखा जाता है। चूंकि हमें 0वहां एस की जरूरत है, जिसका अर्थ है कि मूल प्रतिस्थापन में 0गैर-चलने योग्य पदों और 0मैचों \wमें मूल इनपुट सरणी होना चाहिए और बाढ़-भराव को ट्रिगर करेगा। इसलिए मैं \pLइसके बजाय (केवल पत्र मिलान) का उपयोग करता हूं ।