मान लीजिए कि एक दिन आप अप्रयुक्त कंप्यूटर डोरियों और एडेप्टर (यूएसबी से यूएसबी मिनी, वीजीए से डीवीआई, आदि) के अपने बड़े बॉक्स के माध्यम से खुदाई कर रहे हैं। हर जगह उलझी हुई डोरियाँ हैं जो काफी गड़बड़ कर रही हैं, और आप आश्चर्य करते हैं कि क्या आप एक लंबे स्ट्रैंड में सभी डोरियों को एक साथ जोड़कर चीजों को सरल बना सकते हैं, और फिर बस इसे रोल कर सकते हैं।
सवाल यह है कि क्या इस तरह से एक लंबी लाइन में अपने सभी डोरियों और एडाप्टरों को जोड़ना संभव है? यह स्पष्ट रूप से हमेशा संभव नहीं है, उदाहरण के लिए, यदि आपके पास केवल दो तार हैं जो पूरी तरह से अलग प्लग के साथ हैं, तो वे एक साथ कनेक्ट नहीं हो सकते हैं। लेकिन अगर आपके पास एक तीसरा कॉर्ड था जो उन दोनों से जुड़ सकता है, तो आप अपने सभी डोरियों को एक साथ जोड़ सकते हैं।
आप इस बात की परवाह नहीं करते हैं कि ऑल-कॉर्ड स्ट्रैंड के सिरों पर किस प्रकार के प्लग हैं। लूप बनाने के लिए उन्हें एक दूसरे में प्लग करने की आवश्यकता नहीं है। आप केवल यह जानना चाहते हैं कि क्या ऑल-कॉर्ड स्ट्रैंड बनाना संभव है, और यदि यह है, तो यह कैसे करना है।
चुनौती
एक प्रोग्राम या फ़ंक्शन लिखें जो एक बहु-स्ट्रिंग स्ट्रिंग में होता है जहां हर पंक्ति आपके स्वयं के डोरियों में से एक को दर्शाती है। एक कॉर्ड एक या एक से अधिक डैश ( -
) से बना होता है, जिसके दोनों छोर पर प्लग होता है। एक प्लग हमेशा 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.
उत्पादन के बिना मामले:
[-->
{---]
[-]
[-]
(-]
]->
}-)
>->
>-->
]---]
[-------------------]
]-------------------[
[-----------------]
[-----------------]
{--[
]--}