आलसी कोष्ठक समाप्त करें


17

मेरे कीबोर्ड पर कोष्ठक सभी खराब हो चुके हैं, और मैं उनका यथासंभव उपयोग करने से बचना चाहता हूं। आपकी चुनौती प्रत्येक पंक्ति के पहले और बाद में उन्हें जोड़कर कोष्ठक युक्त एक पंक्ति को संतुलित करना है।

यह TI-Basic के ऑटोमैटिक कोष्ठक और स्ट्रिंग क्लोजर (यानी Output(1, 1, "Hello, World!) के समान है। यह एक प्रोग्राम से कीमती बाइट्स भी बचाता है!

उदाहरण इनपुट:

This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(

उदाहरण (संभव) आउटपुट:

This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()

विशिष्टता:

  • इनपुट की प्रत्येक पंक्ति के लिए,

    • पंक्ति के अंत में कोष्ठक को संतुलित करने के लिए आवश्यकतानुसार कई खुले कोष्ठकों को शुरुआत और करीब कोष्ठक में जोड़ें।

      • "संतुलन" की परिभाषा है:

        • की एक ही राशि (और )लाइन में

        • स्ट्रिंग की शुरुआत से शुरू होने वाले हर विकल्प के लिए, इस विकल्प में कोष्ठक खोलने की तुलना में अधिक समापन कोष्ठक नहीं होना चाहिए

          • उदाहरण के लिए, (foo))(barसंतुलित नहीं है क्योंकि (foo))कोष्ठक खोलने की तुलना में अधिक समापन कोष्ठक हैं
    • यदि आप अपने कोड को छोटा बनाना चाहते हैं, तो आप अतिरिक्त अनावश्यक कोष्ठक जोड़ सकते हैं

    • आपको स्ट्रिंग शाब्दिक या इस तरह की किसी भी चीज़ के बारे में चिंता करने की आवश्यकता नहीं है, यह मान लें कि सभी कोष्ठक में संतुलन की आवश्यकता है

  • कोष्ठक संतुलित के साथ प्रत्येक पंक्ति आउटपुट

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाएगा!


तुम सिर्फ लेकर चिंतित हैं ()कोष्ठक, या ऐसा अन्य कोष्ठक {}, [], <>, आदि की जरूरत है और साथ ही विचार किया जाना?
डिजिटल ट्रामा

@DigitalTrauma नहीं, केवल (और )
दरवाज़े

क्या आपके पास कोई परीक्षण मामले हैं?
पीटर टेलर

1
@Peter हाँ, वे वहीं पोस्ट में हो ...
दरवाज़े

जवाबों:


21

GolfScript, 23 बाइट्स

n/{"()"1/{.2$\-,*}%*n}/

मैं जिस शोषण का शिकार हो रहा हूं वह है सत्तारूढ़:

यदि आप अपने कोड को छोटा बनाना चाहते हैं, तो आप अतिरिक्त अनावश्यक कोष्ठक जोड़ सकते हैं

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

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

This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(

इस कार्यक्रम का उत्पादन होगा:

((((((((((((((((((((((((((((This line has no parentheses))))))))))))))))))))))))))))
(((((((((((((((((alert(Math.max(1, 2)))))))))))))))))))
(((((((((((((((((1+1)*2).toString())))))))))))))))
(((((((((((((((((((((((((((((((((((((function() { alert('Hello, World!'); })()))))))))))))))))))))))))))))))))))))

Ps। आप इस कोड का ऑनलाइन परीक्षण भी कर सकते हैं ।


4
यह मुझे याद दिलाता है कि जब मैं लिस्प में प्रोग्राम करता था ... कोष्ठक के एक समुद्र में कोड के कुछ बिट खो गए।
ताकोनुत

7

पर्ल, 32 = 31 + 1 या 73 = 72 + 1 (न्यूनतम कोष्ठक)

अतिरिक्त अनावश्यक कोष्ठक के साथ 32 = 31 + 1:

संपादन:

  • ठीक करें, कोष्ठक अब साथ गिना जाता है y///
  • अनावश्यक चर $aहटाया गया।
$_="("x y/)//.s|$|")"x y/(//|er

इसका उपयोग रन-टाइम स्विच -p(+1 बाइट) के साथ किया जाता है ।

परीक्षण फ़ाइल input.txt:

This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(
(foo))(bar
)))(((
((
))

कमांड लाइन:

perl -p script.pl <input.txt

या

perl -pe '$_="("x y/)//.s|$|")"x y/(//|er' <input.txt

परिणाम:

This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
(((foo))(bar))
((()))((()))
(())
(())

Ungolfed:

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

$_ =                     # $_ is provided as input by switch `-p` and
                         # it is printed afterwards as output.
                         # y/X// is used to count the character 'X' in $_
    '(' x y/)//          # add opening parentheses for each closing parentheses
    . s|$|')' x y/(//|er # go right before the end of line and insert
                         # closing parentheses for each opening parentheses
                         # in the original string

73 = 72 + 1: न्यूनतम संख्या में कोष्ठक जोड़ना

यह स्क्रिप्ट संतुलित आउटपुट प्राप्त करने के लिए केवल न्यूनतम संख्या में कोष्ठक जोड़ता है ।

$a=y/()//cdr;1while$a=~s/\(\)//g;$_=$a=~y/)(/(/dr.$_;s|$|$a=~y/()/)/dr|e

इसका उपयोग रन-टाइम स्विच -p(+1 बाइट) के साथ किया जाता है ।

perl -pe "$a=y/()//cdr;1while$a=~s/\(\)//g;$_=$a=~y/)(/(/dr.$_;s|$|$a=~y/()/)/dr|e" <input.txt

परिणाम:

This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()
((foo))(bar)
((()))((()))
(())
(())

Ungolfed:

$a = y/()//cdr;            # filter parentheses and store in $a
1 while $a =~ s/\(\)//g;   # remove matching parentheses
$_ = $a =~ y/)(/(/dr . $_; # add missing opening parentheses at start of string
s|$|$a=~y/()/)/dr|e        # insert missing closing parentheses at end of string

81 = 80 + 1: कोष्ठक की न्यूनतम संख्या को जोड़ना

यह संतुलित आउटपुट के लिए न्यूनतम संख्या में कोष्ठक जोड़ने की एक पुरानी विधि है।

my($l,$r);s/[()]/($&eq")"&&($r&&$r--||++$l))||$r++/ger;$_="("x$l.$_;s/$/")"x$r/e

यह पर्ल 5.14 (गैर-विनाशकारी प्रतिस्थापन मॉडिफायर के कारण) और रन-टाइम स्विच -p(+1 बाइट) का उपयोग करता है।

perl -p script.pl <input.txt

परिणाम:

This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()
((foo))(bar)
((()))((()))
(())
(())

Ungolfed:

# The while loop is added by option "-p".
LINE:
while (<>) {

    # $_ contains the current line
    my ($l, $r); # initializes $l and $r (to undef/kind of indirect 0)
    # Modifiers for the following substitution of $_:
    # /g: process all parentheses
    # /e: evaluate code
    # /r: does not change the original input string $_ (Perl 5.14)
    s/[()]/
        # $& contains the matched parentheses
        # $r is a balance level counter; at the end $r contains
        #    the number of needed closing parentheses
        # $l is the number of needed opening parentheses;
        #    if $r would go negative, then an opening parentheses
        #    is missing and $l is increases and $r remains zero.
        (  
            $& eq ")" &&   # case ")"
            ($r && $r--    # close a parentheses group and update balance counter
                || ++$l)   # or update $l if an opening parentheses is needed
        )
        || $r++            # case "(": increase balance counter
    /ger;
    $_ = "(" x $l . $_;    # add opening parentheses at the begin of line
    s/$/")" x $r/e         # add closing parentheses before the line end

# the remainder is added by run-time switch "-p"
} continue {
    print or die "-p destination: $!\n";
}

2
वाह, यह लगभग गोल्फ की तरह दिखता है ;-)
डिजिटल ट्रॉमा

@HeikoOberdiek पहले संस्करण के लिए आप किस पर्ल का उपयोग कर रहे हैं? यह '('x/\)/gहमेशा बराबर होने के कारण 18.1 पर काम नहीं करता है '(' ...
मूक

@Mouq: धन्यवाद, कोष्ठक की गिनती y///के m//gलिए उपयोग करने के बजाय अब तय किया गया।
हेइको ओबर्डिएक

4

पायथन 2.7 3: 62 60 58 बाइट्स

while 1:s=input();c=s.count;print('('*c(')')+s+')'*c('('))

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

प्रत्येक पंक्ति के लिए, आउटपुट (* लाइन की संख्या ), फिर लाइन, फिर )* की संख्या( । यदि मैं नियमों को सही ढंग से समझता हूं, तो यह हमेशा मान्य आउटपुट प्रदान करेगा।

जिस तरह से मैंने इनपुट किया था, उसके परिणामस्वरूप एक अपवाद को फेंककर बाहर निकलता है। (इनपुट हमेशा इन समस्याओं का एक कठिन हिस्सा है।) यदि यह स्वीकार्य नहीं है, तो मुझे ठीक करने के लिए कुछ बाइट्स खर्च करने होंगे, हालांकि मुझे अभी तक यकीन नहीं है कि कितने हैं।

उदाहरण आउटपुट:

This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))

यह मल्टीलाइन इनपुट लेने के लिए प्रकट नहीं होता है, यानी प्रिंट इनपुट की लाइनों के साथ इंटरसेप्टर होते हैं। ); लेकिन अच्छा एल्गोरिथ्म विचार है, मुझे लगता है कि नहीं सोचा था
दरवाज़े

python2 balanced_parenthesis.py < input.txt 2>/dev/nullमेरे द्वारा लिखा गया आउटपुट मिलता है, लेकिन यदि आप इसे मल्टीलाइन इनपुट चाहते हैं, तो इसे अंतःक्रियात्मक रूप से करते हुए मुझे कुछ बाइट्स खर्च करने होंगे। मुझे एक सेकंड दो, मैं कुछ पता
भूमिगत

आह, ठीक है, फिर कभी मन नहीं। वह काम करेगा!
दरवाज़े

2 चरों को बचाएं:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
जस्टिन

@qui ओह, वाह। मैं उस का पता लगाने के लिए इतना करीब आया, लेकिन मुझे एहसास नहीं था कि आप कर सकते हैं c=s.count। मैंने सोचा था कि तुम क्या करने के लिए किया था c=s, s.c()। धन्यवाद!
अंडरग्राउंडोरेल

1

शुद्ध बैश, 72 बाइट्स

उसी एल्गोरिथ्म का उपयोग करता है, जो @ भूमिगत समपर्क के उत्तर के रूप में है:

while read a;do
o=${a//[!(]}
c=${a//[!)]}
echo ${c//)/(}$a${o//(/)}
done

आउटपुट:

$ ./lazyparens.sh < input.txt
This line has no parentheses
alert(Math.max(1, 2))
(((1+1)*2).toString())
(((function() { alert('Hello, World!'); })()))
$ 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.