पर्ल 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 1
s से अधिक) हैं तो भूलभुलैया को काट दिया जाता है । यह रेगेक्स का उपयोग करके जांचा जा सकता है /\B/
(यह पुराने पर्ल संस्करणों पर 0
बदले देता है 1
। यह तर्कपूर्ण है कि कौन सा गलत है)। दुर्भाग्य से अगर यह मेल नहीं खाता है तो इसके बजाय एक खाली स्ट्रिंग देगा 0
। हालांकि s:|.: code :seg
हमेशा कर एक से तो एक विषम संख्या लौटने के लिए डिजाइन किया गया था &
के साथ /\B/
इस दे देंगे 0
या 1
।
जो कुछ बचा है वह पूरे इनपुट ऐरे से चल रहा है और प्रत्येक चलने योग्य स्थिति के साथ z
और जुड़े हुए हथियारों की गिनती कर रहा है। यह आसानी से किया जाता है:
s%b%$_="$`z$'"; code %eg
एकमात्र समस्या यह है कि गैर-चलने योग्य पदों में पुराने मूल्य को बरकरार रखा जाता है। चूंकि हमें 0
वहां एस की जरूरत है, जिसका अर्थ है कि मूल प्रतिस्थापन में 0
गैर-चलने योग्य पदों और 0
मैचों \w
में मूल इनपुट सरणी होना चाहिए और बाढ़-भराव को ट्रिगर करेगा। इसलिए मैं \pL
इसके बजाय (केवल पत्र मिलान) का उपयोग करता हूं ।