संकुचित मस्तिष्क-विस्तार का विस्तार करें


26

यह चुनौती अप्रैल 2018 लोटम चैलेंज के हिस्से के रूप में पोस्ट की गई थी , साथ ही ब्रेन-फ्लैक के दूसरे जन्मदिन के लिए भी


मैं इस बारे में सोच रहा था कि मस्तिष्क-फ्लैक कार्यक्रमों को एन्कोड करने का सबसे कुशल तरीका क्या होगा। स्पष्ट बात यह है कि, केवल 8 मान्य वर्ण हैं, प्रत्येक वर्ण को 3-बिट अनुक्रम में मैप करना है। यह निश्चित रूप से बहुत प्रभावी है, लेकिन यह अभी भी बहुत बेमानी है। ब्रेन-फ्लैक कोड की कुछ विशेषताएं हैं जिनका उपयोग हम एन्कोडिंग को छोटा करने के लिए कर सकते हैं।

  • निलाड्स, जो सभी 2 मिलान वाले ब्रैकेट द्वारा दर्शाए जाते हैं, वास्तव में 2 के बजाय सूचना की एक एकल इकाई के रूप में कार्य करते हैं। यदि हम प्रत्येक ब्रैकेट को एक एकल बाइट चरित्र के साथ बदल देते हैं, तो यह बिना किसी डेटा को खोए एन्कोडिंग को बहुत छोटा कर देगा।

  • यह एक कम स्पष्ट है, लेकिन भिक्षुओं के समापन बाइट्स भी बेमानी हैं। सोचें कि आप अनुमान लगा सकते हैं कि '?'निम्नलिखित स्निपेट में कौन से अक्षर हैं?

     {(({}?<>?<>?
    

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

ये दो ट्रिक हमें निम्नलिखित एल्गोरिथ्म के माध्यम से मस्तिष्क-फ्लैक कोड को संपीड़ित करने देंगे:

  1. एक मठ के हर समापन कोष्ठक से बदलें |। या दूसरे शब्दों में, प्रत्येक समापन कोष्ठक को बदलें जो कि बार के साथ मैच खोलने से पहले नहीं है । इसलिए...

    (({})<(()()())>{})
    

    बन जाएगा

    (({}|<(()()()||{}|
    
  2. इसे बंद करने वाले ब्रैकेट के साथ प्रत्येक निलाद को बदलें। इसलिए, उनमें से कुछ नहीं के साथ मिलान किए गए कोष्ठक निम्नलिखित मानचित्रण का उपयोग करते हैं:

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

    अब हमारा अंतिम उदाहरण बन गया है:

    ((}|<()))||}|
    
  3. अनुगामी |वर्ण निकालें । क्योंकि हम जानते हैं कि सलाखों की कुल संख्या को ({[<वर्णों की कुल संख्या के बराबर होना चाहिए , यदि अंत में बार गायब हैं, तो हम उन्हें अनुमान लगा सकते हैं। तो एक उदाहरण की तरह:

    ({({})({}[()])})
    

    बन जाएगा

    ({(}|(}[)
    

आज के लिए आपकी चुनौती इस प्रक्रिया को उलट देना है।

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

इनपुट में अनुगामी |वर्ण नहीं होंगे । इन्हें संदर्भ से अलग होना चाहिए।

हमेशा की तरह, आप या तो एक पूर्ण कार्यक्रम या एक फ़ंक्शन सबमिट कर सकते हैं, और इनपुट / आउटपुट प्रारूप अनुमत हैं। और चूंकि यह एक , इसलिए आपके कोड को बाइट्स में स्रोत कोड की लंबाई से स्कोर किया जाएगा, स्कोर जितना छोटा होगा उतना बेहतर होगा।

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

यहाँ कुछ परीक्षण मामले हैं। यदि आप अधिक चाहते हैं, तो आप इस अजगर स्क्रिप्ट और ब्रेन-फ्लैक विकी के साथ अपने स्वयं के परीक्षण मामलों को उत्पन्न कर सकते हैं , जहां इन परीक्षण मामलों में से अधिकांश आते हैं।

#Compressed code
#Original code

())))
(()()()())


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

({(}|(}[)|||}
({({})({}[()])}{})


(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}

4
प्रतिभा। बिल्कुल प्रतिभाशाली। आपको एक व्युत्पन्न भाषा बनानी चाहिए।
एनएच।

8
@NH। निजी तौर पर, मुझे ऐसी भाषाएं आती हैं जो केवल एन्कोडिंग में भिन्न होती हैं, वास्तव में उबाऊ होती हैं।
DJMcMayhem

1
@dj लेकिन यह कम बाइट लेगा और इसलिए गोल्फिंग के लिए बेहतर होगा।
एनएच।

5
ब्रेन-फ्लैक गोल्फिंग में अच्छा बनने के लिए नहीं बनाया गया था।
DJMcMayhem

जवाबों:


32

ब्रेन-फ्लैक , 952 916 818 बाइट्स

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

खरोंच के बजाय अपेक्षाकृत ब्रैकेट की तुलना करके 360 बाइट्स की बचत की (जैसे ')'= के '(' + 1बजाय (((5 * 2) * 2) * 2) + 1)

DJMcMayhem से कुछ प्रत्यक्ष प्रतिस्थापन के साथ 34 बाइट्स सहेजे गए

>]}हैंडलिंग कोड को ओवरलैप करके 10 बाइट्स सहेजे गए

रोल को घटाकर 118 बाइट्स बचाए

पहले रोल को आसान बनाने के लिए खाली स्टैक का फायदा उठाकर 40 बाइट्स बचाए

EOF को -1 से चिह्नित करके 48 बाइट्स बचाए, जिससे अधिक संक्षिप्त रोल कोड सक्षम हो सके

स्टॉक का उपयोग करके 36 बाइट्स की बचत की, मेरे बजाय तर्क के बराबर है

जो किंग को आउटपुट बनाने के लिए एक अधिक कुशल तरीका खोजने के लिए 98 बाइट्स के लिए धन्यवाद बचा

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

ब्रेन-फ्लैक में पहली बार गोल्फिंग, इसलिए शायद कुछ बहुत बड़े सुधार हैं, लेकिन यह काम करता है। प्रति बहुत / प्रत्येक ब्रैकेट प्रकार संभाल करने के लिए पेस्ट, और करने के लिए बहुत बहुत धन्यवाद स्वत: पूर्णांक जनरेटर और रोल से झलकी यहाँ

यहाँ स्पष्टीकरण , TIO इसे और अधिक आसानी से प्रारूपित करता है

बोनस उत्तर:

संकुचित मस्तिष्क-फ्लैक 583 बाइट्स

{((}|[((()))))|}|}|}||(){[)|(<}|||}|{}((}|)>|(>||}(>|>((}|[((()))|}|})|{(}[)|||}||(){[)|(<}|||}|(}>}|>((}|[(((()))))|}|}||}}||(){[)|(<}|||}|(}>}|>((}|[((((()))))|}|}|})||}}||(){[)|(<}|||}|(}>}|{}(<(>(}|))>||||}>((}|[((()))))|}|}|})||(){[)|(<}|||}|{}((}|[)||(>|>(<(}<{(}>|>|}||||>{(}>|>|}(>||}(>|>((}|[((((()))))|}||}})||}}||(){[)|(<}|||}|(}>}|>((}|[(((()))))|}|}|)|}}||(){[)|(<}|||}|(}>}|>((}|[((((()))))|}|}|})|)|}}||(){[)|(<}|||}|(}>}|{}>(<((}|[))||(>|>(<(}<{(}>|>|}||||>{(}>|>|}|||}>((}|[((((()))))|}|}|)|}}|}||(){[)|(<}|||}|{}}(<(>}>||||}(>|>(<(}<{(}>|>|}||||>{(}>|>|}>|}{(}>|>|>

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

(ध्यान दें कि उपरोक्त लिंक इसलिए नहीं चलता है क्योंकि TIO में एक संपीडित मस्तिष्क-फ्लैक दुभाषिया नहीं है। आप यहां ब्रेन-फ्लैक के लिए एक ट्रांसपिलर पा सकते हैं )

मैंने जाँच की है कि यह इस उपकरण का उपयोग करके ब्रेन-फ्लैक को ट्रांसप्लिंग करके वैध है , अब पर्याप्त कुशल है कि समय समाप्त होने की संभावना नहीं है।


4
पहली बार ब्रेन-फ्लैक में गोल्फिंग, और परिणाम यह है? वाह।
आउटगोल्फर

आप हमेशा के <>(<()>)साथ बदल सकते हैं (<>)। इसके अलावा, आप बदल सकते हैं (<>{}<>)(<()>)करने के लिए(<(<>{}<>)>)
DJMcMayhem

1
@ जेकिंग मैं नहीं जानता कि कैसे, मैं मुश्किल से लूप के अंत में रोल निकालने में कामयाब रहा, इसके बजाय हर एक ब्लॉक में एक अतिरिक्त होने पर
कामिल दकरी

1
यह गोल्फ से परे है .. यह शुद्ध पागलपन है। बधाई हो !
आर्थर अटूट

1
@JoKing परिवर्तन मेरी अपेक्षा से अधिक आसान और प्रभावी था, और अब उत्तर में शामिल है
कामिल दकरी

7

रेटिना 0.8.2 , 103 98 बाइट्स

[])}>]
$&;
T`])}>|`[({<;
r`(.*)((;)|(?<-3>.))*
$&$.1$*;
(?<=(.)((;)|(?<-3>.))*);
;$1
T`;-{`_>-}`;.

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। संपादित करें: @MartinEnder से प्रेरणा के साथ 5 बाइट्स सहेजे गए। स्पष्टीकरण:

[])}>]
$&;
T`])}>|`[({<;

;प्रत्येक करीबी ब्रैकेट के बाद रखो और उन सभी को कोष्ठक खोलने के लिए बदलें, और |एस को ;भी एस में बदलें ।

r`(.*)((;)|(?<-3>.))*
$&$.1$*;

बेजोड़ खुले कोष्ठकों की संख्या की गणना करें और उन्हें कई ;एस जोड़ें ।

(?<=(.)((;)|(?<-3>.))*);
;$1

प्रत्येक मिलान ब्रैकेट को उसके मिलान के लिए कॉपी करें ;

T`;-{`_>-}`;.

कॉपी किए गए ब्रैकेट को फ्लिप करें और एस हटाएं ;


1
यदि आप |किसी चीज का अनुवाद करते हैं तो आप सभी बची हुई सलाखों से बच सकते हैं !। यदि आप अनुवाद >-}करते हैं <-{(जो मुझे लगता है कि यह देता zहै |) तो बाइट की लागत भी नहीं होगी ।
मार्टिन एंडर

@MartinEnder मुझे यकीन नहीं है कि मैं आपकी बात को समझ सकता हूँ, zलेकिन मैं वैसे भी कुछ और बाइट्स शेव करने के तरीके के साथ आया हूँ।
नील

5

टीआईएस , 670 666 बाइट्स

वापस कूदने के लिए कूदने के लिए -4 बाइट्स

कोड:

@0
MOV UP RIGHT
@1
MOV ANY ACC
SUB 41
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV ACC DOWN
@2
NOP
MOV 124 LEFT
@3
MOV ANY DOWN
@4
MOV UP ACC
JGZ O
MOV 40 LEFT
JLZ (
MOV 41 LEFT
JRO 3
O:SUB 21
MOV ACC DOWN
JRO -8
(:MOV 41 RIGHT
@5
MOV ANY DOWN
@6
MOV ANY DOWN
@7
MOV UP ACC
JGZ O
MOV 60 LEFT
JLZ <
MOV 62 LEFT
JRO 3
O:SUB 31
MOV ACC DOWN
JRO -8
<:MOV 62 RIGHT
@8
MOV ANY DOWN
@9
MOV ANY DOWN
@10
S:MOV UP ACC
JGZ O
MOV 91 LEFT
JLZ [
MOV 93 LEFT
JRO 3
O:SUB 31
MOV ACC DOWN
JRO -8
[:MOV 93 RIGHT
@11
MOV ANY DOWN
@12
MOV ANY DOWN
@13
MOV UP ACC
JEZ |
MOV 123 LEFT
JLZ {
MOV 125 LEFT
JRO 2
|:MOV DOWN LEFT
JRO -7
{:MOV 125 RIGHT
@14
MOV ANY DOWN
@15
MOV UP DOWN
@16
MOV UP LEFT

लेआउट:

6 3
CCCCCCCCCCCCCCCCSC
I0 ASCII -
O0 ASCII -

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

मुझे संदेह है कि यह सबसे छोटा है, लेकिन मुझे इसे छोटा बनाने का कोई रास्ता नहीं दिख रहा है। दुर्भाग्य से, सभी NOPसमय के लिए आवश्यक लगते हैं, और मैं उस स्टैक को नहीं रख सकता जहां @14वर्तमान में पढ़ने की वजह से ANYहै @11

इस समाधान की संरचना इस प्रकार है:

Input
  |
  V
  0    1:synchro  2:EOF
  3    4:parens     5
  6    7:angles     8
  9   10:squares   11
 12   13:curlies   14
 15      stack     16
  |
  V
Output

एक खुले ब्रेस को देखने पर, खुले को आउटपुट होने के लिए बाएं कॉलम के साथ भेजा जाता है, और स्टैक के दाहिने कॉलम के साथ पास भेजा जाता है।

एक नज़दीकी ब्रेस को देखकर, खुले और पास दोनों को आउटपुट होने के लिए बाएँ कॉलम के साथ भेजा जाता है।

एक पाइप को देखने पर, स्टैक पॉप हो जाता है और आउटपुट पर भेज दिया जाता है।

EOF @1से @2, इनपुट स्ट्रीम के बजाय से पढ़ना शुरू कर देगा @0@2पाइपों की एक अंतहीन धारा पैदा करता है, इसलिए ढेर को सूखा जाएगा।

एक बार इनपुट और स्टैक दोनों समाप्त हो जाने के बाद, प्रोग्राम रुक जाता है।

चेतावनी: TIS की सीमाओं के कारण, स्टैक का आकार 15 तक सीमित है। यदि किसी चीज को इससे अधिक नेस्टेड किया गया है, तो यह कार्यान्वयन गलत परिणाम देगा।


4

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

वर्णों के एक सरणी के रूप में इनपुट लेता है। एक स्ट्रिंग लौटाता है।

a=>a.map(c=>(n=(S='|()[]{}<>').indexOf(c))?n&1?(s=[S[n+1],...s],c):S[n-1]+c:s.shift(),s=[]).join``+s.join``

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


एक चरित्र सरणी वापस करके भी 102 बाइट्स
झबरा

@ शगुन थैंक्स! लेकिन क्या वास्तव में 1-चरित्र और 2-वर्ण स्ट्रिंग्स को एक साथ मिश्रित करने की अनुमति है?
अरनौलड

हम्म ... हाँ, शायद यह "अनुमति" आउटपुट पर जोर दे रहा है।
झबरा

@DJMcMayhem क्या आप कृपया नए आउटपुट प्रारूप पर एक नज़र डालेंगे और हमें बताएं कि क्या यह स्वीकार्य है?
अरनौलड

1
@arnauld हुह, किसी कारण से जिसने मुझे पिंग नहीं किया। मुझे लगता है कि मैं नहीं कहूंगा। पात्रों में से एक सरणी या एक स्ट्रिंग दोनों मानक प्रारूप हैं, लेकिन तार की एक सरणी मेरे लिए मान्य नहीं लगता
DJMcMayhem


3

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

a=[];$<.chars{|c|r="|[{(<>)}]";i=r.index(c);i<1||(i<5?a:$>)<<r[-i];$>.<<i<1?a.pop: c};$><<a.reverse.join

यह एक पूर्ण प्रोग्राम है जो कंसोल को आउटपुट करता है। (i<5?a:$>)<<r[-i]मैं अब तक किए गए सबसे अच्छे गोल्फों में से एक बन गया हूं।

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

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

->s{a=[];(s.chars.map{|c|r="|>)}][{(<";d=r[-i=r.index(c)];i<5||a<<d;i<1?a.pop: i<5?d+c:c}+a.reverse).join}

यह मेरा पहला उपाय है। एक अनाम लंबो फ़ंक्शन जो स्ट्रिंग्स लेता है और लौटाता है।

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


3

ब्रेन-फ्लैक , 606 548 496 418 394 390 बाइट्स

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

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

इसकी शुरुआत मैंने कामिल दकरी के जवाब से की थी , लेकिन यह मुझसे दूर हो गया, जहां मैंने इसे एक अलग उत्तर के रूप में पोस्ट करने का फैसला किया।

स्पष्टीकरण:

{ #While input on stack
	((({})))(<>)	#Preserve copy of the character
	(((((		#Push the differences between start bracket characters
	((([(())()()()]){}){}){}())	#Push -31, 1
	(()))				#Push -30, 1
	(((())()())()){}{})		#Push -19, 1
	){}[()])			#Push -39
	({<(({}<>{}[()]))>(){[()](<{}>)}{}<>}{}<><{}>)	#If the character is any of the start brackets
	{({}({})<>)(<>)}{}					#Push the current character + TOS to the other stack

	({}<>)(<>)
	(((((		#Push the differences between end bracket characters
	((([(())()()()]){}){}){}())	#Push -31, 1
	(()))				#Push -30, 1
	(((())()){}()){})		#Push -19, 1
	){})				#Push -40
	({<(({}<>{}[()]))>[()]{()(<{}>)}{}<>}{}<>)	#If the character is any of the end brackets
	{(<({}(<()>)<>({})<{({}<>)<>}>)>)<>{({}<>)<>}}{}	#Push the character + TOS to the output

	({}()<>)	#If the character is not a |
	{{}({}<>)((<>))}{}	#Move current character to the other stack and push a zero
	{}		#Pop the top value of the stack, either the | or a 0
	<>(<({}(<()>)<><{({}<>)<>}>)>)<>{({}<>)<>}{}<>	#And push top of other stack to the output
}{}
{({}{}<>)<>}<>	#Reverse output and append the excess end brackets

और निश्चित रूप से...

संकुचित मस्तिष्क-परत, 285 बाइट्स:

{(((}|||(>|(((((((([()|)))||}|}|})|()||((()|))|)|}}||}[)||({<((}>}[)||||){[)|(<}|||}>|}><}||{(}(}|>|(>||}(}>|(>|(((((((([()|)))||}|}|})|()||((()|)|})|}||}|({<((}>}[)||||[)|{)(<}|||}>|}>|{(<(}(<)||>(}|<{(}>|>|||||>{(}>|>||}(})>|{}(}>|((>|||}}>(<(}(<)||><{(}>|>|||||>{(}>|>|}>|}{(}}>|>|>

1
बहुत प्रभावशाली गोल्फ! मैं अपने आप को इस बात पर ध्यान नहीं देने के लिए निराश हूं कि मुझे यह कैसे काम करना है, यह समझने के लिए बाद में इसे तूल देना पड़ेगा।
कामिल दकरी

2

जावा 10, 424 बाइट्स

s->{int i=0;for(var c:s.toCharArray()){if("(<[{".indexOf(c)>-1)i++;if(c=='|')i--;}for(;i-->0;)s+='|';s=s.replace(")","()").replace(">","<>").replace("]","[]").replace("}","{}");char[]c=s.toCharArray(),r=new char[124];r[40]=41;r[60]=62;r[91]=93;r['{']='}';var o="";for(;++i<c.length ;){if(c[i]=='|'){c[i]=o.charAt(0);o=o.substring(1);}if("(<[{".indexOf(c[i])>-1&")>]}".indexOf(i+1<c.length?c[i+1]:0)<0)o=r[c[i]]+o;}return c;}

यह लंबा है, लेकिन मैं यह नहीं समझ पाया कि इसे और छोटा कैसे किया जाए। हालांकि यह एक अच्छी चुनौती है।

इसे यहाँ ऑनलाइन आज़माएँ ।

Ungolfed संस्करण:

s -> { // lambda taking a String argument and returning a char[]
    int i = 0; // used for counting the number of '|'s that have been removed at the end of the input
    for(var c : s.toCharArray()) { // look at every character
        if("(<[{".indexOf(c) > -1) // if it's an open monad character
            i++; // we will need one more '|'
        if(c == '|') // if it's a close monad character
            i--; // we will need one '|' less
    }
    for(; i-- > 0; ) // add as many '|'
        s += '|';    // as necessary
    s = s.replace(")", "()").replace(">", "<>").replace("]", "[]").replace("}", "{}"); // replace compressed nilads with their uncompressed versions
    char[] c = s.toCharArray(), // from now on working on a char[] is more efficient since we will only be comparing and replacing
    r = new char[124]; // map open monad characters to their counterparts:
    r[40] = 41;   // '(' to ')'
    r[60] = 62;   // '<' to '>'
    r[91] = 93;   // '[' to ']'
    r['{'] = '}'; // '{' to '}'
    var o = ""; // we use this String as a kind of stack to keep track of the last open monad character we saw
    for(; ++i < c.length ;) { // iterate over the length of the expanded code
        if(c[i] == '|') { // if the current character is a close monad character
            c[i] = o.charAt(0); // replace it with the top of the stack
            o = o.substring(1); // and pop the stack
        }
        if("(<[{".indexOf(c[i]) > -1 // if the current character is an open monad/nilad character
         & ")>]}".indexOf(i+1 < c.length ? c[i+1] : 0) < 0) // and it's not part of a nilad (we need to test for length here to avoid overshooting)
            o = r[c[i]]+o; // using the mapping we established, push the corresponding character onto the stack
    }
    return c; // return the uncompressed code
}

2

पायथन 2, 188 184 180 177 174 173 बाइट्स

p,q='([{<',')]}>'
d,s,a=dict(zip(p,q)),[],''
for c in input():
 if c in d:a+=c;s+=[c]
 elif'|'==c:a+=d[s.pop()]
 else:a+=dict(zip(q,p))[c]+c
for c in s[::-1]:a+=d[c]
print a

सहेजे गए 4 बाइट्स DJMcMayhem के लिए धन्यवाद।
इसे ऑनलाइन आज़माएं!



168 बाइट्स अंतिम पंक्ति के लिए 2 के साथ खिलवाड़ द्वारा
DJMcMayhem

@DJMcMayhem केवल तभी काम करता है जब sखाली समाप्त होता है। अन्यथा, आप गलत अंत में अतिरिक्त पात्रों के साथ समाप्त होते हैं।


1

हास्केल , 152 बाइट्स

fst.p
m c="> < ] [)(} {"!!mod(fromEnum c-6)27
p(c:r)|elem c")]}>",(s,t)<-p r=(m c:c:s,t)|c/='|',(s,'|':t)<-p$r++"|",(u,v)<-p t=(c:s++m c:u,v)
p e=("",e)

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करेंpएक पुनरावर्ती पार्सर को लागू करता है, जो सरल व्याकरण के लिए खत्म हो सकता है।


1
mमिलान ब्रैकेट खोजने के लिए अच्छा कार्य ।
नीमी

1

पायथन 2 , 244 बाइट्स

s=input()
B='([{<'
C=')]}>'
Z=zip(B,C)
P=sum(map(s.count,B))-s.count('|')
for i,j in Z:s=s.replace(j,i+j)
s+=P*'|'
b=[0]
for i in s:[b.pop()for j,k in Z if j==b[-1]<k==i];b+=[i][:i in B];s=i=='|'and s.replace(i,C[B.find(b.pop())],1)or s
print s

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

इस काम को करने में एक या दो घंटे से अधिक का समय लगा ...

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