怠zyな括弧を終了する


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))ていません
    • 必要に応じて、コードを短くする場合は、余分な不要な括弧を追加できます

    • 文字列リテラルなどを心配する必要はありません。すべての括弧のバランスを取る必要があると仮定してください

  • 括弧をバランスさせて各行を出力します

これはなので、バイト単位の最短コードが勝ちます!


あなただけに関係している()他のブラケットは括弧、または実行{}[]<>、などの必要性は十分と考えるべきでは?
デジタル外傷14

@DigitalTraumaいや、唯一()
ドアノブ

テストケースはありますか?
ピーターテイラー14

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!'); })()))))))))))))))))))))))))))))))))))))

追伸 このコードをオンラインでテストすることもできます


4
これは、私がLispでプログラムしていたときのことを思い出させます...括弧の海で数ビットのコードが失われました。
タコナッツ

7

Perl、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))
((()))((()))
(())
(())

ゴルフをしていない:

アルゴリズムは単純で、見つかった括弧ごとに対応するものを追加するだけです。

$_ =                     # $_ 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)
((()))((()))
(())
(())

ゴルフをしていない:

$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

Perl 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)
((()))((()))
(())
(())

ゴルフをしていない:

# 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
うわー、それはほとんどゴルフスクリプトのように見えます;-)
デジタル外傷14

@HeikoOberdiek最初のバージョンではどのperlを使用していますか?これは、に起因する18.1で動作するようには思えない'('x/\)/g...「(」常に等しい
Mouq

@Mouq:ありがとう、括弧をカウントするy///代わりに使用するようになりm//gました。
ヘイコオベルディク14

4

Pythonの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!'); })()))

これは、複数行の入力をとっていないようです。つまり、印刷には入力の行が散在しています。しかし、素晴らしいアルゴリズムのアイデア、私はそれを考えていませんでした;)
Doorknob

python2 balanced_parenthesis.py < input.txt 2>/dev/null私が書いた出力を取得しますが、インタラクティブに実行しながら複数行の入力が必要な場合は、数バイトかかります。ちょっと待って、私は何かを理解します
地下

ああ、大丈夫、気にしないで。うまくいきます!
ドアノブ

2文字を保存:while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
ジャスティン14

@quiああ、すごい。私はそれを理解することに非常に近づきましたが、あなたができることに気づきませんでしたc=s.count。私は、あなたがしなければならなかったと思いましたc=ss.c()。ありがとう!
地下

1

Pure Bash、72バイト

@undergroundmonorailの答えと同じアルゴリズムを使用します。

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!'); })()))
$ 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.