क्या मैं अपने सभी डोरियों और एडेप्टर को एक साथ जोड़ सकता हूं?


30

मान लीजिए कि एक दिन आप अप्रयुक्त कंप्यूटर डोरियों और एडेप्टर (यूएसबी से यूएसबी मिनी, वीजीए से डीवीआई, आदि) के अपने बड़े बॉक्स के माध्यम से खुदाई कर रहे हैं। हर जगह उलझी हुई डोरियाँ हैं जो काफी गड़बड़ कर रही हैं, और आप आश्चर्य करते हैं कि क्या आप एक लंबे स्ट्रैंड में सभी डोरियों को एक साथ जोड़कर चीजों को सरल बना सकते हैं, और फिर बस इसे रोल कर सकते हैं।

सवाल यह है कि क्या इस तरह से एक लंबी लाइन में अपने सभी डोरियों और एडाप्टरों को जोड़ना संभव है? यह स्पष्ट रूप से हमेशा संभव नहीं है, उदाहरण के लिए, यदि आपके पास केवल दो तार हैं जो पूरी तरह से अलग प्लग के साथ हैं, तो वे एक साथ कनेक्ट नहीं हो सकते हैं। लेकिन अगर आपके पास एक तीसरा कॉर्ड था जो उन दोनों से जुड़ सकता है, तो आप अपने सभी डोरियों को एक साथ जोड़ सकते हैं।

आप इस बात की परवाह नहीं करते हैं कि ऑल-कॉर्ड स्ट्रैंड के सिरों पर किस प्रकार के प्लग हैं। लूप बनाने के लिए उन्हें एक दूसरे में प्लग करने की आवश्यकता नहीं है। आप केवल यह जानना चाहते हैं कि क्या ऑल-कॉर्ड स्ट्रैंड बनाना संभव है, और यदि यह है, तो यह कैसे करना है।

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें जो एक बहु-स्ट्रिंग स्ट्रिंग में होता है जहां हर पंक्ति आपके स्वयं के डोरियों में से एक को दर्शाती है। एक कॉर्ड एक या एक से अधिक डैश ( -) से बना होता है, जिसके दोनों छोर पर प्लग होता है। एक प्लग हमेशा 8 अक्षरों में से एक होता है ()[]{}<>

तो ये कुछ मान्य डोरियाँ हैं:

>->
(--[
}-{
<-----]
(---)

लेकिन ये नहीं हैं:

-->
(--
)--
[{
---

डोरियों को जोड़ने पर, केवल समान ब्रैकेट प्रकार के साथ प्लग को एक साथ जोड़ा जा सकता है।

तो ये कुछ मान्य कॉर्ड कनेक्शन हैं:

...---((---...
...---))---...
...---]]---...
...---{{---...
...---<<---...

और ये अमान्य हैं:

...---()---...
...---)(---...
...---{]---...
...---{[---...
...---><---...
...--->)---...

यदि इनपुट में सभी डोरियों को एक लंबी स्ट्रैंड में एक साथ पुनर्व्यवस्थित और संलग्न किया जा सकता है, तो आउटपुट जो स्ट्रैंड को एक लाइन पर (एक वैकल्पिक अनुगामी न्यूलाइन के साथ)। जब कई समाधान होते हैं तो आप उनमें से किसी एक को आउटपुट के लिए चुन सकते हैं। यदि एकल स्ट्रैंड बनाना संभव नहीं है, तो आउटपुट कुछ नहीं (या वैकल्पिक अनुगामी न्यूलाइन के साथ एक खाली स्ट्रिंग आउटपुट)।


उदाहरण के लिए, यदि इनपुट है

[-->
{---]
>----{

आउटपुट हो सकता है

[-->>----{{---]

जहां सभी डोरियों को एक साथ रखा गया है।

हालांकि अगर इनपुट थे

[-->
{---]

डोरियों को जोड़ा नहीं जा सकता है इसलिए कोई आउटपुट नहीं होगा।


ध्यान दें कि कनेक्शन बनाने के लिए डोरियों को अधिक से अधिक चारों ओर फ़्लिप किया जा सकता है। उदाहरण के लिए [-->और <--]प्रभावी रूप से एक ही कॉर्ड हैं क्योंकि वे एक ही प्रकार के कनेक्शन बना सकते हैं। कुछ आउटपुट इनपुट कॉर्ड को फ़्लिप करने पर निर्भर हो सकते हैं।


उदाहरण के लिए

(-[
}--]

उत्पादन हो सकता है

(-[[--{

जहाँ दूसरा कॉर्ड फ़्लिप किया जाता है, या

}--]]-)

जहाँ पहले कॉर्ड फ़्लिप किया जाता है।

(ध्यान दें कि सामान्य रूप से पूरे आउटपुट को फ़्लिप करना मान्य है क्योंकि यह शुरू में हर कॉर्ड को व्यक्तिगत रूप से फ़्लिप करने के समान है।)


आउटपुट में डोरियों की लंबाई निश्चित रूप से संबंधित इनपुट डोरियों की लंबाई से मेल खाना चाहिए। लेकिन डोरियों को फिर से विभाजित किया जा सकता है और चारों ओर जितना संभव हो उतना फ़्लिप किया जा सकता है ताकि ऑल-कॉर्ड स्ट्रैंड बना सकें। इनपुट में हमेशा कम से कम एक कॉर्ड होगा।

बाइट्स में सबसे छोटा कोड जीतता है।

परीक्षण के मामलों

उत्पादन के साथ मामले:

[-->
{---]
>----{
gives
[-->>----{{---]
or
[---}}----<<--]

(-[
}--]
gives
(-[[--{
or
}--]]-)

(-)
gives
(-)

[--{
gives
[--{
or
}--]

[-]
]-[
gives
[-]]-[
or
]-[[-]

[----->
)------------[
{--<
}---)
could give
[----->>--}}---))------------[
or
>--}}---))------------[[----->
or
}---))------------[[----->>--}
or
{--<<-----]]------------((---{
etc.

>-->
>->
>--->
could give
>-->>->>--->
or
>--->>-->>->
or
>->>-->>--->
or
<--<<---<<-<
etc.

(-]
]->
>-}
}-)
)-[
[-<
<-{
{-(
could give
(-]]->>-}}-))-[[-<<-{{-(
or
{-((-]]->>-}}-))-[[-<<-{
or
<-{{-((-]]->>-}}-))-[[->
etc.

उत्पादन के बिना मामले:

[-->
{---]

[-]
[-]

(-]
]->
}-)

>->
>-->
]---]

[-------------------]
]-------------------[
[-----------------]
[-----------------]

{--[
]--}

6
अप्रयुक्त कंप्यूटर डोरियों और एडेप्टर का बड़ा बॉक्स जो मुझे बेहतर महसूस कराता है - मैं अकेला नहीं हूं। वास्तव में मेरे पास इनमें से कई बॉक्स हैं।
डिजिटल ट्रॉमा

लेकिन क्या होगा यदि आप एक कॉर्ड को अपने आप में प्लग करते हैं?
अनोकस्क्लेरेल

तार कर रहे हैं गारंटी सभी के लिए मान्य हो सकता है?
आर। काप

@ R.Kap हां वे हैं
केल्विन के शौक

जवाबों:


10

अपठनीय , 3924 बाइट्स

यह पहली बार है जब मैंने अपठनीय में कुछ कॉल-स्टैक जैसी संरचना को लागू किया।

(इस का पहला संस्करण 5300 बाइट्स से अधिक था, बस यह अंदाजा लगाने के लिए कि मैंने इसे कितना गढ़ा है।)

' "" "" "'" " '" "" "" "'" "" "" " '" ""' "" ' ""' "" ' ""' "" ' ""' "" "" "" "" "" ' "" "" ""' "" ' "" "" "" "" "" "" "'" "" "" "" "" "" "" " "" "" "" ' ""' "" ' ""' "" ' ""' "" "" "" "" "" ' "" "" "'" "" "" """" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' ""' "" ' "" "" "" "" ""' "" "" """ "" " '" "" "" "" "" ""' "" "" "" "" "" "" " '" "'" " '" "'" " '" "" ' "" "" "" "" "'" " '" "" "" "" "" "'" "" "" "" " '" "" "" "" "" "'" " '" "" "" "" ""' "" "" "" "" "" ' "" "" "'" "" "" " '" "'" "" ' "" """ "" "" "" "" "" "" ' "" "" "" "" ""' "" ' ""' "" ' "" "" "" "" ""' "" "" "" "" " '" "" "" "'" " '" ""' "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""' """ "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ ' ""' "" "" "" "" "" "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "" ' ""' "" "" "" "" "" "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "" "' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" ""' "" ' "" "" "" "" "" "" "" "" ""' "" ' "" "'""" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "'" ""' "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " ' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" """ "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" " '" ""' "" ' ""' "" "" "" "" "" "" "" "" " '" "'" " '" "" "" ""' "" "" "" "" "" ' ""' "" ' "" "" "" "" "" "" "" "" "'" "" "" "" " '"" "" "" "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" "" ' "" "" ""' "" "" " '" "'" "" "" "" "" " '" "" "" "" "'" " '" "'" "" "" "" "" " ' "" "" "" "" "" "" "" "" "" "" "" "" " '" "" "" "" "" "" "" "" "'"" "" "" "" "" ' "" "" "" "" "" "" ""' "" ' ""' "" ' "" "'" "" "" "" " "" "" "" ' "" "'" " '" "" "" "" "" "'" "" "" "" "" "" "" "" "" ' "" ' ""' "" "" "" "" "" "" "" "" " '" "'" " '" ""' "" "" "" "" " '" "" '" "" "" "" "" "" "" "" "" "'" "" ' ""' "" ' ""' "" ' ""' "" "" "" " ' "" "" "" "" "" "" "" "" "" "" " '" "'" " '" "'" "" "" "" "" " '" ""' "" "" "" "" ' ""' "" " '" "" "" "" "" ""' "" "" "" "" " '" "" "" ""'"" ' ""' "" "" "" "" " '" "'" " '" "'" "" ' "" "" "" "" "" "'" "" "" " "" ' "" "" "" "" "'" "" "" "" "" "" "" " '" "'" "" "" "" "" "" "" "" ' "" "" "" "" "'" " '" "'" " '" "'" " '" "" "" "" "" "'" "" "" "" ""' "" "" "" "" "'" " '" "'" " '" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' ""' "" "" "" "" "" " '" "" "" " '" "" "" "" "" ""' "" "" "" "" " '" "'" "" "" "" "" "" """" ' "" "" "" "" "'" "" ' "" "" "" ""' "" ' "" "'" " '" "" "" "" "" "" "" "" "" ' "" "" "" "" "'" "" "" "" "" "" ' ""' "" ' "" "'" "" "" "" " ' "" "" "" "" " '" "'" "" ' "" "" "" "" "" "" "" "" "'" "" "" "" " '"" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "'" "" "" " '" "" "" "'" "" ' "" "" "" "" "" "" ""' "" ' ""' "" " '" "" "" "" "" "" ""' "" ' "" " ' "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "" " '" "'" "" ' """" "" "" "" "" ' ""' "" " '" "'" "" "" "" "" ' "" "'" "" "" "" "" "" " " '" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " " '" "'" " '" "'" " '" "'" "" "" "" "" " '" "" "" "" "" "" "" "" "'"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ' "" "" "" "" "" "" ' "" "" "" "" "'" "" "" "" "" "" "" ' ""' "" " '" "" "" "" "" "" "" "" ' ""' "" "" "" "" " '" "'" " '" "'" " '" "" "" "" "" "'" "" "" "' "" "" "" "" "'" "" "" "" "" ' ""' "" ' "" "" "" "" ""' "" ' ""' "" ' " " '" "'" " '" "'" " '" "'" "" "" "" "" " '" "" "" "" "" "" "" "" "" "' "" "" "" "" "" " '" "" "" "" "'" " '" "'" "" ' "" "" "" "" "" "'" """ "" "" "" "" "" "" "" " '" "" ""' "" "" "" "" "" "" "" "" "" "" " ' "" "" " '" "" "" "" "" "'" "" "" "" " '"' "" "" "" "" "" "" "" "" " "" "" "" " '" "" ""' "" ' "" "" ""' "" ' "" "" "" "" "" "" "" "" "' "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" ' "'" "" "" "" ' ""' "" ' ""' "" ' "" "'" ' "" "" "" "" "'" " '" "" "" "" "" "" "" "'" "" ' "" "' "" "" "" "" "'" " '" "'" " '" ""' " '" "" "" "" ""' "" ' "" "" "" "'" "" "" "" "" " '" ""' "" "" "" "" "'" " '" "'" " '" ""' " '" "" "" "" ""' "" ' "" "" "" "'" "" "" "" "" " '" ""

व्याख्या

इस उदाहरण इनपुट पर विचार करें:

>--{
[---}

निष्पादन के अधिकांश के दौरान, टेप को निम्नानुसार रखा गया है:

  • कक्ष 0 से 5 विभिन्न चरों के लिए स्थान हैं।

  • सेल 6 के बाद आपके बॉक्स में केबल के सेट के बारे में सभी जानकारी होती है:

    टेप लेआउट उदाहरण

  • "शून्य टर्मिनेटर" के बाद शेष कोशिकाओं में स्टैक होता है। प्रत्येक "स्टैकफ्रेम" एक एकल कोशिका है जो केबल के पहले सेल ("स्टार्ट प्लग" सेल) को इंगित करता है। उपरोक्त उदाहरण में, जब प्रोग्राम तय करता है कि उसने एक समाधान ढूंढ लिया है, तो स्टैक में 6 ( >--{पहली केबल का उल्लेख करते हुए) और 21 ( {---]दूसरी केबल का दर्पण) का उल्लेख होगा ।

कार्यक्रम तीन मुख्य चरणों में आगे बढ़ता है:

  1. पूरे इनपुट को पढ़ें और उपरोक्त संरचना को उत्पन्न करें, जिसमें सभी प्रतिबिंबित केबल शामिल हैं।
  2. सभी संयोजनों को आज़माएं (लेकिन यदि समाधान मिल जाए तो रोक दें)।
  3. यदि कोई समाधान पाया गया था, तो उसे आउटपुट करें।

पहला चरण (इनपुट पढ़ें और केबल संरचना उत्पन्न करें) केवल कोशिकाओं का उपयोग करता है # 1 (जिसे मैं कॉल करूंगा p) और # 2 (जिसे मैं कॉल करूंगा ch) और थोड़ी देर के लूप में निम्नानुसार काम करता हूं :

  • जबकि हालत: p6 से वृद्धि , अगले चरित्र (प्रारंभ प्लग) को सेल में पढ़ें *p, और जांचें कि यह -1(ईओएफ) नहीं है।

  • बाद के पात्रों को पढ़ें *(p+2), और उन्हें गिनें *(p+1), जब तक कि हम -(हाइफ़न) के अलावा किसी और चीज़ का सामना न करें । उस बिंदु पर, *(p+1)हाइफ़न की संख्या (केबल की लंबाई) और *(p+2)अंतिम गैर-हाइफ़न वर्ण (अंत प्लग) होगा। (हम हाइफ़न वर्णों को भी सेल # 5 में कॉपी करते हैं ताकि हम इस ASCII कोड को बाद में आउटपुट चरण में एक्सेस कर सकें।)

  • थोड़ी देर के लूप में, दर्पण प्लग को ढूंढें और इसे स्टोर करें *(p+3), फिर p2 से वृद्धि करें , जब तक *pकि शून्य न हो। लूप इस तरह दिखता है pseudocode में:

    while (ch = *p) {
        *(p+3) = (ch -= 40) ? (ch -= 1) ? (ch -= 19) ? (ch -= 31) ? ch-32 ? *p-2 : *p+2 : *p+2 : *p+2 : *p-1 : *p+1
        p += 2
    }
    
  • यह लूप हमेशा दो पुनरावृत्तियों (प्रारंभ प्लग और अंत प्लग) का प्रदर्शन करेगा और इस केबल के चौथे और छठे सेल में परिणामों को संग्रहीत करेगा। अब, अगर आपने ध्यान दिया, तो आपको पता चलता है कि छठी सेल वास्तव में मिररेड एंड प्लग के लिए सही स्थान है, लेकिन मिरर किया हुआ स्टार्ट प्लग "सेल में मूल केबल को इंगित करता हुआ" लेबल में है। यह ठीक है क्योंकि हमें केवल एक शून्य-शून्य मान के लिए इस सेल की आवश्यकता है।

  • चूँकि pअभी कुल ४ की वृद्धि हुई है, यह अब "बूलियन संकेत केबल उपयोग में है" नामक सेल पर इंगित कर रहा है। *(p+3)के मान पर सेट करें *(p-1)। यह सही जगह पर मिरर किया हुआ स्टार्ट प्लग डालता है।

  • एक और चरित्र पढ़ें (त्यागें) और (जो हम एक नई रेखा बनने की उम्मीद करते हैं, लेकिन कार्यक्रम उस के लिए जाँच नहीं करता है)।

pशुरू में 0 पर शुरू होता है, लेकिन 6 की वृद्धि की स्थिति के अंदर वृद्धि होती है, इस प्रकार केबल डेटा सेल # 6 से शुरू होता है। pलूप बॉडी के अंदर 4 द्वारा वृद्धि की जाती है, और इस प्रकार प्रत्येक केबल के लिए कुल 10, जो कि हमें ठीक चाहिए।

दूसरे चरण के दौरान कोशिकाओं # 0-4 चर रहा करता है कि मैं फोन करता हूँ a, p, q, m, और notdone। (सेल # 5 अभी भी हाइफ़न के ASCII कोड को याद करता है।)

चरण 2 के लिए तैयार होने के लिए, हमें *p0 पर वापस सेट करना होगा (सेल को "शून्य टर्मिनेटर" कहा जाता है) ताकि यह केबलों की सूची के लिए टर्मिनेटर के रूप में कार्य कर सके; हम भी सेट करते हैं q(जो हमारा स्टैक पॉइंटर है) p+1(यानी "शून्य टर्मिनेटर" के बाद सेल; यह वह जगह है जहां स्टैक शुरू होता है); *q1 (स्टैक पर पहला आइटम; क्यों 1 बाद में स्पष्ट हो जाएगा); और notdone1. यह सब एक बयान में किया जाता है:

*p = (notdone = *(q = p+1) = 1)-1

दूसरा चरण भी एक समय लूप है। इसकी शर्त बस है notdone। लूप करते समय उस के प्रत्येक पुनरावृत्ति में, निम्नलिखित चार चीजों में से कोई भी एक हो सकती है:

  1. हम पाते हैं कि सभी केबल "उपयोग में" चिह्नित हैं। इसका मतलब है कि हमें एक समाधान मिला है (जो वर्तमान स्टैक सामग्री द्वारा दर्शाया गया है)।
  2. हम *qएक और पात्र केबल के लिए अग्रिम कर सकते हैं (जिसे हम तुरंत इसके जुड़वां के साथ "उपयोग में" के रूप में चिह्नित करते हैं) और फिर पुनरावृत्ति (यानी एक नया स्टैकफ्रेम बनाते हैं)।
  3. हम *qआगे नहीं बढ़ सकते हैं क्योंकि कोई और योग्य केबल मौजूद नहीं है, इसलिए हमें पीछे हटने की जरूरत है (एक स्टैकफ्रेम हटाएं और पिछले केबल और उसके ट्विन को "उपयोग में" के रूप में चिह्नित करें)।
  4. हम *qआगे नहीं बढ़ सकते क्योंकि कोई और योग्य केबल मौजूद नहीं है और हम पीछे नहीं हट सकते क्योंकि हम स्टैक के नीचे तक पहुँच चुके हैं। इसका मतलब कोई उपाय नहीं है।

लूप बॉडी इस क्रम में इन चार स्थितियों में से प्रत्येक के लिए जाँच करता है। यहाँ विवरण हैं:

  1. सेट mऔर p1 और थोड़ी देर के लूप में, p5 से वेतन वृद्धि (इस प्रकार केबलों के माध्यम से पुनरावृत्ति) और जांचें कि क्या *(p+4)("उपयोग में") सेट है। यदि यह नहीं है, तो m0. पर सेट करें। उस लूप के अंत में, mहमें बताता है कि क्या सभी केबल उपयोग में हैं। यदि हां, तो notdoneमुख्य लूप को समाप्त करने के लिए 0 पर सेट करें। अन्यथा, नीचे चरण 2 पर जारी रखें।

  2. सेट pकरें *q(स्टैक के शीर्ष पर केबल) और थोड़ी देर के लूप में ऊपर के समान, pकेबलों के माध्यम से 5 से बढ़ाना । शुरू करने से पहले *qहम केवल उन लोगों पर विचार करते हैं जिन्हें हमने पहले ही नहीं माना है; हालाँकि, याद रखें कि एक नई स्टैकफ्रेम के लिए प्रारंभिक मान 1 है, इसलिए पहली बार देखा गया सेल 6 पर एक है, जो वास्तव में पहला केबल है।

    प्रत्येक केबल के लिए, हमें *(p+4)यह सुनिश्चित करने के लिए जांचने की आवश्यकता है कि यह पहले से उपयोग में नहीं है, और यह भी कि या तो *(q-1) शून्य है (मतलब हम स्टैक के नीचे स्थित हैं, इसलिए स्टार्ट प्लग पर कोई बाधा नहीं है), या *p (केबल की शुरुआत) प्लग) बराबर है *(*(q-1)+2)(स्टैक पर नीचे केबल के अंत प्लग)। हम निर्धारित करके समानता के लिए जाँच aकरने के लिए *(*(q-1)+2)और mकरने के लिए *p+1और फिर थोड़ी देर के पाश में दोनों decrementing। ऐसा +1इसलिए है क्योंकि mथोड़ी देर की स्थिति में अंदर डिक्रिप्टेड किया जाता है, इसलिए इसे एक बार से अधिक घटाया जाता है a। यदि aइसके अंत में शून्य है, तो दो प्लग समान हैं।

    इस प्रकार, यदि या तो *(q-1)शून्य था या समानता तुलना सफल हुई, तो केबल पात्र है। सेट *qकरने के लिए pनए के साथ ढेर के शीर्ष पर केबल की जगह; सेट mएक ही है कि हम उससे मिलते-जुलते केबल पाया इंगित करने के लिए; और फिर गिरावट p। उस कमी को कम करने के लिए थोड़ी देर की चाल है, जबकि लूप (केबलों के माध्यम से पुनरावृत्ति) जल्दी समाप्त करने के लिए; यह p5 से फिर से बढ़ेगा , इस प्रकार इस केबल के "इन यूज़" झंडे वाले सेल में ले जाएगा, और हम जानते हैं कि यह शून्य है क्योंकि हमने अभी-अभी जाँच की है। अंत में, लूप करते समय केबल-पुनरावृत्ति के बाद, हम जांचते हैं कि mक्या गैर-शून्य है। यदि ऐसा है, तो हमें एक मिलान केबल मिला है और pउस मिलान केबल के लिए "इन-उपयोग" ध्वज की ओर इशारा कर रहा है। उपयोग के रूप में चिह्नित करने के लिए इसे 1 पर सेट करें। भी सेट करें*(*(p-1) ? p+5 : p-5)उपयोग के रूप में अपने जुड़वां को चिह्नित करने के लिए 1 से। अंत में, वृद्धि qऔर *qएक नया स्टैकफ्रेम बनाने के लिए नए को 1 पर सेट करें ।

  3. यदि, लूप करते समय केबल-पुनरावृत्ति के बाद, हम mशून्य पाते हैं, तो अधिक मिलान वाले केबल नहीं हैं, इसलिए हमें पीछे हटने की आवश्यकता है। qस्टैक को नीचे ले जाने और अगर यह अभी भी एक केबल (एक गैर-शून्य मान) की ओर इशारा कर रहा है, तो जांच करने का निर्णय । यदि हां, तो उस केबल और उसके जुड़वां को चिह्नित करें जो अब उपयोग में नहीं है। (हम का मूल्य की दुकान *qमें pइस अभिव्यक्ति कोड में कम करने के लिए।)

  4. यदि, घटने के बाद q, हम पाते हैं कि यह शून्य मान पर इंगित करता है, तो यह "शून्य टर्मिनेटर" है, जिसका अर्थ है कि हम स्टैक से गुजर चुके हैं। हम निष्कर्ष निकालते हैं कि कोई समाधान नहीं है। हमने notdoneमुख्य लूप को समाप्त करने के लिए 0 पर सेट किया है।

तीसरा चरण आउटपुट स्टेज है। दो चीजें हो सकती हैं:

  • मुख्य लूप ने एक समाधान पाया जिसे हमें आउटपुट करने की आवश्यकता है, या
  • मुख्य लूप का निष्कर्ष है कि कोई समाधान नहीं है और हम कुछ भी नहीं उत्पादन करते हैं।

आसानी से, अगर कोई समाधान नहीं था, तो pशून्य है क्योंकि हमने इसे शून्य से *qपहले जांचने के मूल्य पर सेट किया है; और अगर कोई समाधान था , pतो "शून्य टर्मिनेटर" की ओर इशारा किया जाता है क्योंकि यह सिर्फ केबलों के माध्यम से पुनरावृत्त होता है, इसलिए हम अब pस्टैक के माध्यम से पुनरावृति का उपयोग कर सकते हैं । तो बस स्टैक के माध्यम से पुनरावृत्त करें, प्रत्येक केबल के लिए स्टार्टिंग प्लग ( *(*p)), हाइफ़न ( *(*p+1)थोड़ी देर में लूप में decrementing द्वारा ; और सेल # 5 में संग्रहीत हाइफ़न ASCII कोड का उपयोग करके), और अंत प्लग ( *(*p+2))। कोई बात नहीं कि यह केबल-लंबाई की जानकारी को नष्ट कर देता है; हमें अब इसकी आवश्यकता नहीं है।


3

सीजेएम, 67

qN%e!{_,2,m*\f{.{_{"()[]{}<>--"_@#1^=}%W%?}_2ew{~\W=#}%0-{;}&}~}%1<

इसे ऑनलाइन आज़माएं

नोट: लिंक रिपॉजिटरी से नवीनतम कोड का उपयोग कर रहा है (धक्का दिया गया है लेकिन अभी तक जारी नहीं किया गया है), क्योंकि इसमें बग फिक्स है।

स्पष्टीकरण:

कार्यक्रम बस सभी क्रमपरिवर्तन और डोरियों के सभी झुकाव की कोशिश करता है।

qN%             read the input and split into lines
e!              generate all permutations
{…}%            map each permutation of cords
  _,            get the number of cords (n)
  2,m*          generate all patterns of n bits (cartesian power of [0 1])
  \f{…}         for each bit pattern and the cord permutation
    .{…}        apply the block to each bit and cord (flipping cords for bit 0)
      _         duplicate the cord
      {…}%      map each character of the cord
        "…"_    push the string of all the plugs (and 2 dashes) and duplicate it
        @#      get the index of the character in the string
        1^      XOR with 1
        =       get the character at this new index (plugs get toggled)
      W%        reverse the cord
                 the stack now has the bit, the original cord and the flipped cord
      ?         if the bit is 1, use the original cord, else use the flipped one
    _           duplicate the array of cords
    2ew         get all pairs of adjacent cords
    {…}%        map each pair of cords
      ~\        dump the 2 cords on the stack and swap them
      W=        get the right plug of the first cord
      #         find its position in the second cord (if 0, we have a match)
    0-          remove all the zeros
    {…}&        if the array is not empty (i.e. we have a mismatch)
      ;         pop the array of cords
  ~             dump all the results for this permutation on the stack
                 (to avoid nested arrays)
1<              get the first result (if any) from the array of all results

शायद यह कैसे काम करता है की एक व्याख्या?
टिमवी

@ टिम्मी ओके, मैंने इसे थोड़ा और भी गढ़ा
aditsu

यह समाधान अमान्य है क्योंकि यह इनपुट के लिए कोई आउटपुट नहीं देता है (-] ]-> >-} }-) )-[ [-< <-{ {-(
आर। काप

@ R.Kap यह उस इनपुट को हल करता है, लेकिन उस विशेष ऑनलाइन दुभाषिया का समय समाप्त हो गया है (और इसके बारे में काफी चुप है)। आप इसके बजाय इसे यहाँ आज़मा सकते हैं (और इसे कई मिनट दे सकते हैं) या जावा इंटरप्रेटर (सबसे तेज़) का उपयोग करें
aditsu

वास्तव में, मैंने जो व्याख्याकार ऊपर जोड़ा है, उस इनपुट को हल करने में शायद एक लंबा समय लगेगा। जावा दुभाषिया को हल करती है यह मेरे कंप्यूटर पर कम से कम 1.5 मिनट में।
एडिट्स

2

जावास्क्रिप्ट (ईएस 6), 206

पुनरावर्ती कार्य

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

अधिक पठनीय

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>
  l[0]?
  l.some((b,i)=>
     r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])]
     .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)
     &&(l=[...l],l[i]=r,f(l))
    )?r:''
 :a

परीक्षा

f=(l,a=l.pop(),x=x=>(z='<>[]{}()')[z.indexOf(x)^1])=>l[0]?l.some((b,i)=>r=[b,x([...b].pop())+b.slice(1,-1)+x(b[0])] .some(b=>r=a[0]==[...b].pop()?b+a:b[0]==[...a].pop()?a+b:0)&&(l=[...l],l[i]=r,f(l)))?r:'':a

console.log=(...x)=>O.textContent+=x+'\n'

;[
 //OK
 ['[-->','{---]','>----{']
,['(-[','}--]']
,['(-)']
,['[--{']
,['[-]',']-[']
,['[----->',')------------[','{--<','}---)']
,['>-->','>->','>--->']
,['(-]',']->','>-}','}-)',')-[','[-<','<-{','{-(']
 //KO
,['[-->','{---]']
,['[-]','[-]']
,['(-]',']->','}-)']
,['>->','>-->',']---]']
,['[-------]',']-------[','[-------]','[---------]'] // shortened a little,
,['{--[',']--}']
].forEach(t=>{
  console.log(t+' : "'+f(t)+'"\n')
})
<pre id=O></pre>


1

जावास्क्रिप्ट, 800 बाइट्स

एक अनुकूलित समाधान से दूर है, लेकिन यहां जावास्क्रिप्ट में एक त्वरित हैक (कोई फैंसी ecma5 या कुछ भी नहीं है, क्योंकि मुझे नहीं पता है)।

function a(r){function t(r,t){var n=r.slice();return n.splice(t,1),n}function n(r){var t,n={"[":"]","]":"[",">":"<","<":">","(":")",")":"(","{":"}","}":"{"},e=r.split("").reverse();for(t=0;t<e.length;t++)n.hasOwnProperty(e[t])&&(e[t]=n[e[t]]);return e.join("")}function e(r,t){return r.unshift(t),r}var h,u,f=[];if(1==r.length)return r[0];for(h=0;h<r.length;h++){var l=r[h],i=t(r,h),c=l.charAt(0),g=l.charAt(l.length-1);for(u=0;u<i.length;u++){var o=i[u],s=o.charAt(0),p=o.charAt(o.length-1);c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o)),o=n(o),s=o.charAt(0),p=o.charAt(o.length-1),c==p&&f.push(e(t(i,u),o+l)),g==s&&f.push(e(t(i,u),l+o))}}if(f.length<1)return!1;for(h=0;h<f.length;h++){if(1===f[h].length)return f[h][0];f[h]=a(f[h])}for(h=0;h<f.length;h++)if(f[h]!==!1)return f[h];return!1}

Ungolfed, यहाँ यह है ... मुझे यकीन है कि कम से कम 2 छोरों के लिए यहाँ अनावश्यक हैं और यह कि शीर्ष पर एक एकल तत्व इनपुट के लिए जाँच कर रहा है और तल पर एक एकल तत्व मेल खाने योग्य है ... लेकिन यह काम करने लगता है परीक्षण आदानों को संसाधित करता है।

function a(inputs)
{
	var i, ii, matches = [];
	if (inputs.length == 1) {
		return inputs[0];
	}
	// For each of the elements in inputs (e1)
	for (i = 0; i < inputs.length; i++) {
		var e1 = inputs[i],
			others = except(inputs,i),
			e1s = e1.charAt(0),
			e1e = e1.charAt(e1.length-1);
		// Compare to each of the other elements in inputs (e2)
		for (ii = 0; ii < others.length; ii++) {
			// get the start and end of the elements to compare (e1s,e1e,e2s,e2e)
			var e2 = others[ii],
				e2s = e2.charAt(0),
				e2e = e2.charAt(e2.length-1);
			// if any of them match up (e1s == e2e || e1s == e2s || e1e == e2s || e1e = e2e)
			// Make a new array of inputs containing the joined elements (as a single element) and all other elements which might join with them
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
			e2 = flip(e2);
			e2s = e2.charAt(0);
			e2e = e2.charAt(e2.length-1);
			if (e1s == e2e) {
				matches.push(addTo(except(others,ii),e2+e1));
			}
			if (e1e == e2s) {
				matches.push(addTo(except(others,ii),e1+e2));
			}
		}
	}

	if (matches.length < 1) {
		return false;
	}

	for (i = 0; i < matches.length; i++) {
		if (matches[i].length  === 1) {
			return matches[i][0];
		} else {
			matches[i] = a(matches[i]);
		}
	};

	for (i = 0; i < matches.length; i++) {
		if (matches[i] !== false) {
			return matches[i];
		}
	};

	return false;

	function except(list,idx)
	{
		var newList = list.slice();
		newList.splice(idx,1);
		return newList;
	}
	function flip(s) {
		var replacements = {
			'[':']',
			']':'[',
			'>':'<',
			'<':'>',
			'(':')',
			')':'(',
			'{':'}',
			'}':'{'
		}, i, a = s.split('').reverse();
		for (i = 0; i < a.length; i++) {
			if (replacements.hasOwnProperty(a[i])) {
				a[i] = replacements[a[i]];
			}
		}

		return a.join('');
	}
	function addTo(arr,newEl)
	{
		arr.unshift(newEl);
		return arr;
	}
}


1
आप कुछ बाइट्स को बचाने के लिए फ़ंक्शन का नाम बदल सकते हैं। stackoverflow.com/questions/6156319/…
noɐɹƆz

1
जावास्क्रिप्ट के किसी भी संस्करण में .charAt से बचें। s.charAt(x)===s[x]
edc65

1

पायथन 3, 217 बाइट्स

from itertools import*
a='()[]{}<>'
all(any(c[-1]!=d[0]for c,d in zip(q,q[1:]))or print(''.join(q))for p in permutations(open(0))for q in product(*[(c[:-1],a[a.find(c[-2])^1]+c[-3:0:-1]+a[a.find(c[0])^1])for c in p]))

( Ideone पर डेमो )


यह कैसे इनपुट लेता है?
आर। काप

@ R.Kap स्टड पर, प्रति पंक्ति एक कॉर्ड।
एंडर्स कासोर्ग

ऐसा नहीं लगता, कम से कम जब मैंने इसे चलाया।
आर। काप

इसके अलावा, इसके लिए सही उत्तर कितनी तेजी से मिल सकता है (-] ]-> >-} }-) )-[ [-< <-{ {-(?
आर। काप

@ R.Kap इनपुट और उत्पादन आउटपुट लेने के एक उदाहरण के लिए Ideone पर डेमो देखें। (यह विंडोज पर काम नहीं कर सकता है, अगर आप ऐसा करने की कोशिश कर रहे हैं?) यह आपके परीक्षण के मामले में तुरंत चलता है। हालांकि ऐसे कई मामले हैं जो समय के साथ तेजी से घटेंगे।
एंडर्स कासोर्ग

0

लुआ, 477 बाइट्स

function r(s)return s:reverse():gsub("[()%[%]{}<>]",{["("]=")",[")"]="(",["["]="]",["]"]="[",["{"]="}",["}"]="{",["<"]=">",[">"]="<"})end
function a(c,b)for i, v in next,b do
m=c:sub(-1,-1)n=v:sub(1,1)o=r(c):sub(-1,-1)p=r(v):sub(1,1)l=table.remove(b,i)if m==n then
return a(c..v,b)elseif o==n then
return a(r(c)..v,b)elseif m==p then
return a(c..r(v),b)elseif o==p then
return a(r(c)..r(v),b)end
table.insert(b,i,l)end
return#b>0 and""or c
end
print(a(table.remove(arg,1),arg))

आदेश पंक्ति तर्क के रूप में डोरियों को स्वीकार करता है


0

पायथन 3.5, 448 432 427 424 286 311 बाइट्स:

( ५१ ( चूंकि एक बग था जहां उत्पादन कुछ इनपुट से अधिक होना चाहिए )

def g3(z):
 B=z.split();M='i[::-1].translate({41:40,40:41,125:123,123:125,62:60,60:62,93:91,91:93})';f=B+[eval(M)for i in B if eval(M)not in B];d=[f.pop(0)]
 for h in d:
  try:[d.append([f.pop(f.index(c))for c in f if h[-1]==c[0]][0])if len(d)<len(B)else E]
  except:break
 return''.join(d)if len(d)>=len(B)else''

अच्छी तरह से काम! 7 या अधिक मूल्यों वाले इनपुट को छोड़कर । उन लोगों के लिए एक लंबा समय लगता है , सबसे अधिक संभावना है क्योंकि यह इनपुट के उन सभी क्रमपरिवर्तन के माध्यम से जाना चाहिए साथ ही इनपुट उलट हो जाता है । मैं इसे तब और जब मैं कर सकता हूं, ठीक करने की कोशिश करूंगा, लेकिन अभी के लिए यह काफी अच्छा लग रहा है। सब अब अच्छा है! अगर केवल मैं किसी तरह उस try-exceptब्लॉक का उपयोग सूची बोध में कर सकता हूं , तो यह थोड़ा छोटा हो सकता है, और बहुत अच्छा लग सकता है । बहरहाल, यह अब सभी परीक्षण मामलों के लिए काम करता है , और, सबसे अच्छा, यह कोई आयात नहीं करता है! :)

इसे ऑनलाइन आज़माएं! (Ideone) (284 बाइट्स यहाँ)

(टिप: इसे आज़माने के लिए, बस "कांटा" चुनें, और फिर अपनी पसंद इनपुट करें, अंतरिक्ष से अलग हो जाएं , और "रन" चुनें)

व्याख्या

असल में, क्या हो रहा है ...

  1. एक सूची, Bइनपुट से बनाई गई है जो इसे व्हाट्सएप पर अपने घटक "डोरियों" में विभाजित करती है।
  2. Mएक स्ट्रिंग है जिसे मैंने बनाया है, जब मूल्यांकन किया जाता है, तो एक सूची देता है Bजिसके आधार पर सभी डोरियां होती हैं, लेकिन इस बार पीछे
  3. से बनाई गई सूची Mअंततः "डोरियों" के सभी संभावित झुकावों के साथ B, एक सूची बनाने के लिए स्वयं के साथ घनीभूत होती है f
  4. एक अन्य सूची dबनाई गई है, जिसे पहले मूल्य (मूल्य f[0]) के साथ आरंभ किया जाएगा f
  5. अंत में, सभी मान इसके dमाध्यम से पुनरावृत्त होते हैं, और प्रत्येक मान के अंतिम वर्ण की तुलना प्रत्येक तत्व के पहले वर्ण से की जाती है f, और जब कोई मैच मिलता है, तो वह वर्ण पॉपप (या हटा दिया गया) होता है और सूची से वापस आ जाता है f। ऐसा तब तक होता है जब तक IndexErrorकि उठाया नहीं जाता है, या सूची की लंबाई dअधिक हो जाती है Bऔर NameErrorकॉल के बाद उठाया जाता है E, दोनों को संभाला जाता है, और फिर सूची dकी सामग्री को एक स्ट्रिंग में शामिल किया जाता है और जब तक सूची की लंबाई dअधिक होती है सूची की लंबाई के बराबर या उससे अधिक B। अन्यथा, एक खाली स्ट्रिंग लौटा दी गई है ( ''), चूंकि dलंबाई समान नहीं Bहै जो यह दर्शाता है कि सूची में सभी "डोरियां" हैंB एक लंबे "कॉर्ड" में शामिल नहीं किया जा सकता है।

@ केनीलाऊ आपने क्या बदला? मैं जो देख सकता हूं, आपने अभी जोड़ा <!-- language: lang-python -->है। वह क्या बदलता है?
आर। काप

जो आपके कोड के लिए सिंटैक्स हाइलाइटिंग को सक्षम कर सकता है।
लीक नून

@ केनीलाऊ वाह, यह अच्छा है। मैं सोच रहा था कि पीपीसीजी पर मैं ऐसा कैसे करूंगा। अब मुझे पता है! धन्यवाद! :)
आर। काप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.