क्या भेस में कोष्ठक हैं?


12

किसी ने हमें एक स्ट्रिंग दी है, लेकिन सभी ब्रैकेट जैसे चरित्रों को सामान्य लोगों में बदल दिया गया है, और हम नहीं जानते कि कौन से थे, या यहां तक ​​कि कितने थे। हम सभी जानते हैं कि यदि L1,L2,L3,...,LNअलग-अलग प्रकार के बाएँ कोष्ठक R1,R2,R3,...,RNथे और अलग-अलग प्रकार के दाएँ कोष्ठक थे, तो सभी विशिष्ट (2N अलग कोष्ठक वर्ण) होने के कारण, यदि यह (+ सामान्य स्ट्रिंग समाकलन) है तो एक स्ट्रिंग मान्य होगी।

  • L1+X+R1,, L2+X+R2..., LN+X+RNजहां Xएक वैध स्ट्रिंग है,

  • X+Y, जहां Xऔर Yमान्य तार हैं,

  • कोई भी एकल वर्ण जो ब्रैकेट वर्ण नहीं है।

  • खाली तार

हम जानते हैं कि उन्होंने ब्रैकेट बदलने से पहले एक वैध स्ट्रिंग के साथ शुरुआत की थी, और उन्होंने उन्हें किसी भी वर्ण में नहीं बदला जो पहले से ही स्ट्रिंग में मौजूद थे। प्रत्येक ब्रैकेट के लिए कम से कम एक जोड़ी मौजूद थी। क्या आप पुनर्निर्माण कर सकते हैं कि कौन से वर्ण मूल रूप से बाएं और दाएं ब्रैकेट जोड़े थे ( दिए गए शर्तों को देखें Liऔर Riउनका पालन करें)?

उन पात्रों के जोड़े को आउटपुट करें जो ब्रैकेट थे। उदाहरण के लिए, यदि (){}[]वास्तव में ब्रैकेट वर्ण थे , तो आप आउटपुट (){}[]या {}[]()या [](){}, आदि कर सकते हैं। स्ट्रिंग के लिए ऐसा करने के कई तरीके हो सकते हैं, आपको केवल एक को वापस करने की आवश्यकता है जैसे कि अधिक जोड़े के साथ कोई ब्रैकेट असाइनमेंट नहीं है (उदाहरण देखें)। ध्यान दें कि आउटपुट स्ट्रिंग में हमेशा एक समान लंबाई होनी चाहिए।

उदाहरण:

abcc- cएक ब्रैकेट नहीं हो सकता है, क्योंकि दो घटनाओं के साथ कोई अन्य चरित्र नहीं है, लेकिन abएक ब्रैकेट जोड़ी हो सकती है, इसलिए आप बिल्कुल आउटपुट करेंगे ab

fffff - अधिकांश एक वर्ण वाले किसी भी तार में ब्रैकेट नहीं हो सकते, इसलिए आप खाली स्ट्रिंग या आउटपुट कुछ भी नहीं लौटाएंगे।

aedbedebdcecdec - इस स्ट्रिंग में कोई ब्रैकेट नहीं हो सकता है क्योंकि 1 ए, 2 बीएस, 3 सीएस, 4 डीएस, और 5 एस है, इसलिए कोई भी दो अक्षर समान संख्या में नहीं होते हैं, जिसे ब्रैकेट्स की आवश्यकता होती है।

abcd- संभव कार्य कर रहे हैं ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcऔर bd, (और साथ ही खाली काम है, जो उन सभी को है के रूप में), लेकिन आप सबसे लंबे समय तक कार्य में से एक लौटना चाहिए, ताकि आप लौटना चाहिए abcd, cdab, adbc, या bcad

aabbcc, abc- इन दोनों ab, acऔर bcमान्य जोड़ों के रूप में। आपको इनमें से एक जोड़ी को वापस करना होगा, जो मायने नहीं रखता है।

abbac- ए और बी में एक ही वर्ण गणना है, लेकिन वे वास्तव में काम नहीं कर सकते हैं, क्योंकि उनमें से एक दूसरे के सभी घटनाओं के बाएं और दाएं दोनों में होता है। कुछ भी नहीं लौटाया।

aabcdb- cdऔर abसटीक दो ब्रैकेट जोड़े हैं, इसलिए उत्पादन या तो cdabया abcd

abcdacbd- केवल एक जोड़ी एक बार में प्राप्त किया जा सकता है, लेकिन ab, ac, bd, cd, और adसंभव जोड़े के सभी आप लौट सकते हैं कर रहे हैं। कोई फर्क नहीं पड़ता कि आप कौन सी जोड़ी चुनते हैं, इसका एक उदाहरण है जहां एक एकल अन्य वर्ण इसके भीतर है, जो किसी भी अन्य जोड़े को प्रतिबंधित करता है, सिवाय उस मामले में ad, जहां अन्य जोड़े bcऔर cbअकेले अकेले संभव नहीं हैं, और इसलिए यह संभव नहीं हो सकता है के साथ ad

यह कोड गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा कोड है। यदि आपकी भाषा के लिए इनपुट STDIN से संभव है। यदि यह संभव नहीं है, तो अपने उत्तर में इनपुट पद्धति को इंगित करें।


1
इनपुट के लिए abcd, आउटपुट adbcभी स्वीकार्य होगा, है ना?
पैट्रिक रॉबर्ट्स

हां, मैंने इसे उदाहरण में जोड़ा है।
फ्रिकटिव मेलन

जवाबों:


4

रूबी, 373 बाइट्स

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

यह स्टैक पार्सर के एक गोल्फ संस्करण का उपयोग करता है

शायद इसे और सरल बनाया जा सकता है, लेकिन मुझे नहीं लगता कि मेरा दिमाग किसी भी तरह से संभाल सकता है।

सभी परीक्षण मामले: http://ideone.com/gcqDkK

व्हॉट्सएप के साथ: http://ideone.com/pLrsHg

Ungolfed (ज्यादातर): http://ideone.com/oM5gKX

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.