एक स्ट्रिंग को अंदर बाहर करें


21

एक संतुलित स्ट्रिंग कोष्ठक का एक तार है ()ताकि हर कोष्ठक को दूसरे के साथ मिलान किया जा सके। और अधिक कठोरता से वे इस व्याकरण द्वारा फैलाए गए तार हैं:

S → (S)S | ε

हम एक स्ट्रिंग "अंदर बाहर" द्वारा बदल सकते हैं:

  • की सभी घटनाओं की स्विचिंग (और )एक दूसरे के साथ

  • स्ट्रिंग के सामने से पीछे तक पात्रों को तब तक ले जाना जब तक स्ट्रिंग फिर से संतुलित न हो जाए।


एक उदाहरण देते हैं।

हम संतुलित स्ट्रिंग के साथ शुरू करते हैं:

(()(())())

हम तो बनाने के लिए Parens स्विच

))())(()((

फिर स्ट्रिंग के सामने से स्ट्रिंग के पीछे तक वर्णों को स्थानांतरित करें जब तक कि स्ट्रिंग संतुलित न हो जाए।

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

हमारे परिणाम Thats!


ध्यान दें कि कुछ तारों को कई तरीकों से अंदर बाहर किया जा सकता है, उदाहरण के लिए स्ट्रिंग

(()())

जब अंदर से बाहर निकला तो या तो हो सकता है:

()(())

या

(())()

हालांकि हर स्ट्रिंग में कम से कम एक समाधान होता है

कार्य

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

यह एक प्रतियोगिता है, इसलिए आपको अपने स्रोत कोड के आकार को कम करने का लक्ष्य रखना चाहिए, जैसा कि बाइट्स द्वारा मापा जाता है।

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

(()())     -> ()(()), (())()
(()(())()) -> (()(())())
((())())() -> (()(()()))

क्या यह गारंटी है कि हमेशा एक समाधान है?
लुइस मेंडू

@LuisMendo हाँ, मैंने यह साबित कर दिया है। यदि आप प्रमाण देखना चाहते हैं, तो बेझिझक मुझे चैट में पिंग करें।
गेहूं जादूगर

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

जवाबों:


9

हास्केल , 124 120 119 117 113 110 110 109 106 105 104 101 98 बाइट्स

4 बाइट्स ने बार्टवेल के लिए धन्यवाद बचाया!

3 बाइट्स ने जर्ब को धन्यवाद दिया

1 बाइट ने पीटर टेलर को धन्यवाद दिया

यहाँ एक समाधान है जो मैंने हास्केल में काम किया था। इसके ठीक अभी कुछ मदद मैं प्राप्त करने के लिए काफ़ी अच्छा धन्यवाद, लेकिन मैं, इस कम करने के लिए तो प्रतिक्रिया / सुझाव की सराहना की कर रहे हैं रहा हूँ।

until(!0)g.map d
_!1=1<0
('(':a)!x=a!(x-1)
(_:a)!x=a!(x+1)
_!_=1>0
g(a:b)=b++[a]
d '('=')'
d _='('

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

व्याख्या

यह कार्यक्रम 4 कार्यों को परिभाषित करता है, पहला (!)निर्धारित करता है कि क्या एक स्ट्रिंग संतुलित है। इसकी परिभाषा इस प्रकार है:

_!1=1<0
('(':a)!x=a!(x-1)
(_:a)!x=a!(x+1)
_!_=1>0

यह जाँच मानती है कि इनपुट में पीटर टेलर के एक सुझाव की बदौलत समान संख्या में खुले और नज़दीकी पार्न हैं।

अगला gएक बार स्ट्रिंग को घुमाएगा।

g(a:b)=b++[a]

फिर हमारे पास dजो बस एक परन ले जाता है और उसे दर्पण करता है

d '('=')'
d _='('

अंत में हमारे पास वह फंक्शन है जिससे हम चिंतित हैं। यहाँ हम का एक pointfree प्रतिनिधित्व का उपयोग until(!0)gके साथ बना map dहै, जो नक्शे dइनपुट करने के लिए और लागू होता है gजब तक परिणाम संतुलित किया जाता है। यह प्रश्न में वर्णित सटीक प्रक्रिया है।

until(!0)g.map d

1
आप कुछ बाइट्स को स्क्रैप कर सकते हैं g x@(a:b)|x!0=x|1>0=g$b++[a]और पार्न्स को हटा सकते हैं d '('=')'
बर्टवेल

@bartvelle dकंपाइलर त्रुटि के कारण पार्न्स को हटाना , मुझे विश्वास है कि मैंने कोशिश की है। लेकिन पहला सुझाव स्वागत योग्य है। धन्यवाद!
गेहूं जादूगर

1
आप एक और बाइट बचा सकते हैं !क्योंकि आपको उन मामलों को संभालने की ज़रूरत नहीं है जहां स्ट्रिंग में खुले और करीब कोष्ठक की एक असमान संख्या है, इसलिए आप पहले दो मामलों की अदला-बदली कर सकते हैं और_!1=1<0 []!_=0<1
पीटर टेलर

1
untilछोटा करने के लिए उपयोग करें g: TIO
ज़र्गब

2
मुझे लगता है कि बनाने के द्वारा एक सभ्य बचत होना चाहिए dनक्शा '('करने के लिए (-1)और करने के लिए कुछ और 1, और फिर दोनों में से सबसे लंबे समय तक मामलों !को जोड़ा जा सकता है (i:a)!x=a!(x+i)। शीर्ष स्तर की संरचना को फिर map dसे untilस्थिति में धकेलने के लिए आवश्यक है, और मुझे दौड़ना होगा इसलिए मुझे अभी यह पता लगाने के लिए समय नहीं मिला है कि सभी को एक साथ गोंद करने के लिए कंबाइनेटर की क्या आवश्यकता है।
पीटर टेलर

7

SOGL V0.12 , 12 11 बाइट्स

↔]»:l{Ƨ()øŗ

यह कोशिश करो!

स्पष्टीकरण:

↔            mirror characters
 ]           do ... while the top of stack is truthy
  »            put the last letter at the start
   :           duplicate it
    l{         length times do
      Ƨ()        push "()"
         ø       push ""
          ŗ      replace ["()" with ""]
             if the string left on stack is empty (aka all matched parentheses could be removed), then stop the while loop

नोट: के l{साथ प्रतिस्थापित किया जा सकता है ( 10 बाइट्स के लिए, लेकिन, दुख की बात है, इसे लागू नहीं किया गया है।


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

1
@ ओल्मैन का उद्देश्य पात्रों को उलटना था , लेकिन (जो यहां बाइट बचाता है!)। गर्त बदलने के लिए यह V0.13s लाइन-अप पर है। उदाहरण
dizima

5

CJam (20 वर्ण)

q1f^0X${~_}%_:e>#)m<

ऑनलाइन डेमो

या उसी चार गिनती के लिए

q1f^_,,{0W$@<~}$W=m<

ऑनलाइन डेमो

विच्छेदन

दो संस्करणों में एक सामान्य शीर्ष लेख और पाद लेख है

q1f^    e# Read input and toggle least significant bit of each character
        e# This effectively swaps ( and )

m<      e# Stack: swapped_string index
        e# Rotates the string to the left index characters

फिर बीच में बिट स्पष्ट रूप से गणना करता है कि इसे कितनी दूर घुमाने के लिए आवश्यक है। वे दोनों मूल्यांकन का उपयोग करते हैं और (सीजेएम )वेतन वृद्धि ऑपरेटर होने और वेतन वृद्धि ऑपरेटर होने पर भरोसा करते हैं ।

0X$     e# Push 0 and a copy of the swapped string
{~_}%   e# Map: evaluate one character and duplicate top of stack
        e# The result is an array of the negated nesting depth after each character
_:e>    e# Copy that array and find its maximum value
#       e# Find the first index at which that value occurs
)       e# Increment

बनाम

_,,     e# Create array [0 1 ... len(swapped_string)-1]
{       e# Sort with mapping function:
  0W$@  e#   Rearrange stack to 0 swapped_string index
  <~    e#   Take first index chars of swapped_string and evaluate
}$      e# The result is an array of indices sorted by the negated nesting depth
W=      e# Take the last one

3

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

(सहेजे गए 2 बाइट्स @CraigAyre के लिए, 2 बाइट्स @PeterTaylor की बदौलत, 2 बाइट्स @Shaggy की बदौलत।)

s=>(r=[...s].map(c=>'()'[c<')'|0])).some(_=>r.push(r.shift(i=0))&&!r.some(c=>(i+=c<')'||-1)<0))&&r.join``

Ungolfed:

s=>(
  r=[...s].map(c=>'()'[c<')'|0]),  //switch "(" and ")"
  r.some(_=>(
    r.push(r.shift(i=0)),          //move last element to beginning of array, initialize i
    !r.some(c=>(i+=c<')'||-1)<0)   //check if balanced (i should never be less than 0)
  )),
  r.join``
)

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


3

रेटिना , 46 38 बाइट्स

T`()`)(
(.*?)(((\()|(?<-4>\)))+)$
$2$1

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण के मामले शामिल हैं। संपादित करें: @MartinEnder की मदद से 8 बाइट्स सहेजे गए। पहला चरण केवल कोष्ठकों को स्थानांतरित करता है, जबकि दूसरा चरण सबसे लंबे समय तक प्रत्यय के लिए दिखता है जो कि एक वैध संतुलित उपसर्ग है, जो स्पष्ट रूप से रोटेशन के पूरी तरह से संतुलित होने के लिए एक पर्याप्त स्थिति है। संतुलन समूहों का उपयोग करके संतुलन का पता लगाया जाता है। निर्माण ((\()|(?<-4>\)))+के किसी भी संख्या से मेल खाता है (रों प्लस के किसी भी संख्या )जब तक कि हम पहले से ही (राशि के रूप में <-4>) कई के रूप में देखा (है। चूंकि हम केवल एक वैध उपसर्ग की तलाश में हैं, इसलिए हमें शेष )s से मेल नहीं खाना है ।


आम तौर पर, आप दोनों कोष्ठक को दोहराने के बजाय, उन्हें सिर्फ एक विकल्प में रखते हैं, जो एक बाइट को बचाता है ((\()|(?<-2>\)))। लेकिन आपके प्रयास ने मुझे एक नए दृष्टिकोण को खोजने के लिए प्रेरित किया जो एक और दो को बचाता है (?<-1>(\()*\))+:। यह निश्चित रूप से भविष्य में काम आएगा, इसलिए धन्यवाद। :)
मार्टिन एंडर

यह पहला प्रत्यय मिलान करके रोटेशन को निर्धारित करने के लिए कम है, जिसके माध्यम से आप एक नकारात्मक स्टैक गहराई प्राप्त किए बिना स्ट्रिंग के अंत तक पहुंच सकते हैं: tio.run/…
मार्टिन

@MartinEnder मैंने मूल रूप से एक विकल्प की कोशिश की, लेकिन मैं इसे समय पर काम नहीं कर पाया, लेकिन मैं यह देखने में विफल रहा कि कैसे (?<-1>(\()*\))+ यह काम करता है, क्योंकि यह 1वास्तव में कुछ भी मिलान होने से पहले स्टैक से पॉप करना चाहता है ...
नील

@MartinEnder जैसा कि ऐसा होता है, जब वैकल्पिक उपसर्गों के मिलान की बात आती है, तो वैकल्पिक संस्करण गोल्फर लगता है।
नील

1
वास्तविक पॉपिंग समूह के अंत में होती है, शुरुआत नहीं। डुप्लिकेट से बचने के लिए वैकल्पिक के साथ अच्छा बिंदु\(*हालांकि ।
मार्टिन एंडर

2

PHP, 110 108 बाइट्स

for($s=$argn;;$p?die(strtr($s,"()",")(")):$s=substr($s,1).$s[$i=0])for($p=1;$p&&$c=$s[$i++];)$p-=$c<")"?:-1;

पाइप के रूप में चलाएं -nRया इसे ऑनलाइन परीक्षण करें

टूट - फूट

for($s=$argn;               # import input
    ;                       # infinite loop
    $p?die(strtr($s,"()",")(")) # 2. if balanced: invert, print and exit
    :$s=substr($s,1).$s[$i=0]   #    else: rotate string, reset $i to 0
)                               # 1. test balance:
    for($p=1;                   # init $p to 1
        $p&&$c=$s[$i++];)       # loop through string while $p is >0
        $p-=$c<")"?:-1;             # increment $p for ")", decrement else


2

ऑक्टेव, 62 बाइट्स

@(s)")("(x=hankel(s,shift(s,1))-39)(all(cumsum(2*x'-3)>=0)',:)

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

एक फ़ंक्शन जो स्ट्रिंग को इनपुट के रूप में लेता है और सभी परिणामों को प्रिंट करता है।

स्पष्टीकरण:

           hankel(a,shift(a,1))                                % generate a matrix of n*n where n= length(s) and its rows contain incresing circulraly shifted s
         x=...                 -39                             % convert matrix of "(" and ")" to a mtrix of 1 and 2
    ")("(x                        )                            % switch the parens
                                               2*x'-3          % convert [1 2] to [-1 1]
                                        cumsum(      )         % cumulative sum along the rows
                                    all(              >=0)'    % if all >=0
                                   (                       ,:) % extract the desired rows

2

गणितज्ञ, 78 बाइट्स

""<>{"(",")"}[[2ToCharacterCode@#-81//.x_/;Min@Accumulate@x<0:>RotateLeft@x]]&

1

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

f=(s,t=s,u=t.replace(')(',''))=>u?t==u?f(s.slice(1)+s[0]):f(s,u):s.replace(/./g,c=>c<')'?')':'(')

इनपुट स्ट्रिंग को आवर्ती रूप से घुमाने से काम करता है जब तक कि उसका संक्रमण संतुलित नहीं होता है, तब इसे स्थानांतरित करना।


बस सुंदर।
रिक हिचकॉक

1

एपीएल (डायलॉग यूनिकोड) , 35 30 बाइट्स

@ Adám की बदौलत एक नया दृष्टिकोण तैयार किया

1⌽⍣{2::01∊⍎⍕1,¨⍺}')('['()'⍳⎕]

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

गोल्फ चल रहा है।

व्याख्या

'()'⍳⎕              Find the index of each character of the input in the string '()'
                    (this is 1-indexed, so an input of '(())()' would give 1 1 2 2 1 2)
')('[...]           Find the index of the vector in the string ')('
                    This essentially swaps ')'s with '('s and vice versa
                   On this new string, do:
 1                   rotate it one to the left
                    Until this results in 1:
 1,¨⍺                 Concatenate each element of the argument with a 1
                      This inserts 1 one before each parenthesis
                     Stringify it
                     And evaluate it, if the parentheses are balanced, this produces no errors
 1                   Check if 1 belongs to evaluated value
                      If the parentheses were not matches during ⍎, this causes a syntax error
 2::0                 This catches a syntax error and returns 0
                      Essentially this code checks if the brackets are balanced or not

0

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

r=[0];S=''
for c in input():b=c>'(';r+=[r[-1]+2*b-1];S+=')('[b]
n=r.index(min(r))
print S[n:]+S[:n]

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

आसान परीक्षण मामलों के लिए कार्य रूप में:

अजगर 2 , 108 बाइट्स

def f(s):
 r=[0];S=''
 for c in s:b=c>'(';r+=[r[-1]+2*b-1];S+=')('[b]
 n=r.index(min(r))
 return S[n:]+S[:n]

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

यह थोड़ा अलग दृष्टिकोण का उपयोग करता है - स्ट्रिंग को फिर से घुमाने के बजाय, अगर हम परेंसियों को वेतन वृद्धि के रूप में सोचते हैं और कुछ बैलेंस काउंटर को घटाते हैं, तो एक संतुलित स्ट्रिंग में कुल वेतन वृद्धि - घटाव नहीं होना चाहिए जो 0 से कम है।

तो हम लेते हैं

(()(())())

Parens पलटना:

))())(()((

और इसे वेतन वृद्धि / गिरावट की रकम की सूची में परिवर्तित करें:

[-1,-2,-1,-2,-3,-2,-1,-2,-1,0]

सूचकांक 4 (शून्य आधारित) पर -3 न्यूनतम है; इसलिए हम उस इंडेक्स + 1 से शिफ्ट करना चाहते हैं। यह गारंटी देता है कि संचयी वेतन वृद्धि / गिरावट कभी 0 से कम नहीं होगी; और 0 का योग करेगा।


मेरे फोन पर तो मैं परीक्षण नहीं कर सकता, लेकिन क्या आप इसके r=0,बजाय कर सकते हैं r=[0]?
साइओस

आप के साथ @ Cyoce के सुझाव लिए जा रहे हैं, तो आप को बदलने के लिए की आवश्यकता होगी r+=[r[-1]+2*b-1]के साथ r+=r[-1]+2*b-1,के रूप में अच्छी तरह से
OVS

0

क्लोजर, 118 बाइट्स

#(loop[s(map{\(\)\)\(}%)](let[s(conj(vec(rest s))(first s))](if(some neg?(reductions +(map{\( 1\) -1}s)))(recur s)s)))

वर्णों का क्रम लौटाता है, इसलिए मैं इसे इस तरह कहूंगा:

(apply str (f "(()(())())"))
; "(()(())())"

पहले कोष्ठक फ़्लिप करता है, फिर जब तक अनुक्रम के कुछ बिंदु पर कोष्ठक गणना का संचयी योग ऋणात्मक हो जाता है।


0

ब्रेनफक , 82 बाइट्स

,[++[->->++<<]-[--->+>-<<]>-->+[-[-<<+>>>>+<<]],]+[<<]>>>[.[-]>>]<[<<]<[<<]>>[.>>]

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

व्याख्या

प्रत्येक चरित्र को पढ़ने के साथ, एक काउंटर निम्नानुसार संशोधित किया जाता है:

  • काउंटर 0 से शुरू होता है।
  • प्रत्येक के बाद ), काउंटर 1 से बढ़ता है।
  • एक के बाद एक ( , काउंटर 1 से घटता है, जब तक कि काउंटर 0 नहीं था, जिस स्थिति में काउंटर अपरिवर्तित है।

प्रत्येक उपसर्ग एक संतुलित स्ट्रिंग (उलटा के बाद) का एक वैध प्रत्यय है यदि और केवल अगर यह काउंटर 0. है तो यह कोड आउटपुट बनाने के लिए सबसे लंबे समय तक ऐसे उपसर्ग का उपयोग करता है।

,[                   Take input and start main loop
                     The cell one space right is the output cell (0 at this point),
                     and two spaces right is a copy of the previous counter value
  ++                 Add 2 to input
  [->->++<<]         Negate into output cell, and add twice to counter
  -[--->+>-<<]       Add 85 to output cell, and subtract 85 from counter
  >-->+              Subtract 2 from output cell and add 1 to counter
                     The output cell now has (81-input), and the counter has been increased by (2*input-80)
  [-[-<<+>>>>+<<]]   If the counter is nonzero, decrement and copy
,]
+[<<]                Go to the last position at which the counter is zero
>>>                  Go to following output character
[.[-]>>]             Output from here to end, clearing everything on the way
                     (Only the first one needs to be cleared, but this way takes fewer bytes)
<[<<]                Return to the same zero
<[<<]>>              Go to beginning of string
[.>>]                Output remaining characters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.