ブラケットバランス


20

括弧([{()}])およびその他の文字(A- Za- z0- 9、句読点)を含む(おそらく空の)文字列が与えられます。次のルールに準拠しているかどうかを確認する必要があります。

  • 括弧以外の文字は無視されます。
  • すべての開いたブラケット[{(には閉じブラケットがあり)}]ます。だから、[](許可されていません。
  • ブラケットは適切にネストされています。[(])許可されていません。
  • 中括弧に角括弧を含めることはできません。単純な括弧には、中括弧または角括弧を含めることはできません。ですから[({})][{[]}]および({})許可されていません。ブラケットは同様のブラケットでネストできるため、使用[[{((()))}{{(())}}]()]{()}できます。

出力は、選択に応じた単一の真実/偽の値です。

最短のコードが優先されます。


テストケース

b[[a{(/)}(())+={{}-}],] ->有効

([h][e][l][l][o]) ->無効

[///[{(\/(arg()))}1{{((-)-2)}}]()]{()} ->有効

hi ->有効



9
@FUZxxlそれははるかに難しい課題のように見えます。しかし、どこかに別のduがあるように感じます。
マーティンエンダー

@MartinBüttnerはい、できます。テストケースをいくつか追加しました。そして、あなたが探していた複製を見つけましたか?
ghosts_in_the_code

1
@MartinBüttner:この挑戦はあなたが考えていたものかもしれません。
イルマリカロネン

1
他の質問はこれの複製として閉じるべきだと思います。ボーナスが少ないため、これは優れています。
リルトシアスト

回答:


5

網膜、84バイト

^([^][}{)(]|()\(|(?<-2>)\)|(?!\2)((){|(?<-4>)}|(?!\4)(()\[|(?<-6>)])))*$(?!\2|\4|\6)

オンラインでお試しください。

これは、基本的な括弧チェックの.NET正規表現のかなり単純な(ただし、ゴルフの)拡張です

これはバランスのとれたグループではかなり可能ですが、Perlの再帰は間違いなくここで優位に立ちます。ただし、いずれかのアプローチは、Digital Traumaのsed answerが行うように、繰り返される置換を介して入力を徐々に減らすことを支持して、単一の正規表現一致の優雅さを捨てることによって打ち負かされます。これはRetinaで34バイトで実装できますが、アイデアを思い付かなかったので、自分でコードを投稿するのをためらっています。


5

網膜、34

第一に、クレジットが支払われるべきクレジット:

私は独立して(後で)sed同じアプローチを思いついたので、これを投稿することでつま先(大きなまたはそれ以外)を踏んでいないことを願っています:

[^][(){}]

+`\(\)

+`{}

+`\[]

^$

だから今でsudo apt-get install mono-completegit clone https://github.com/mbuettner/retina.git私は私のUbuntuのVMに取り組んで網膜を持っています。テスト出力は次のとおりです。

$ while read; do echo "Input: \"$REPLY\", Ouput: $( mono Retina.exe -s brbal.ret <<< "$REPLY" )" ; done < ../brbal.txt 
Input: "[[{((()))}{{(())}}]()]{()}", Ouput: 1
Input: "b[[a{(/)}(())+={{}-}],]", Ouput: 1
Input: "[///[{(/(arg()))}1{{((-)-2)}}]()]{()}", Ouput: 1
Input: "hi", Ouput: 1
Input: "", Ouput: 1
Input: "", Ouput: 1
Input: "([h][e][l][l][o])", Ouput: 0
Input: "[](", Ouput: 0
Input: "[(])", Ouput: 0
Input: "[({})]", Ouput: 0
Input: "[{[]}]", Ouput: 0
Input: "({})", Ouput: 0
$ 

@ThomasKwaテスト出力を参照してください。コードが正しく、すべてのテストケースが合格していると思います。コードに見られる特定の問題、または失敗すると思われる特定のテストケースがありましたか?
デジタル外傷

@ThomasKwa私は彼らのコードを移植しませんでした、なぜならESMINのどの部分が何をするのかわからないからです。私はこのコードを、それどのように見えるかに基づいて記述したので、これには同じバグがあるはずだという理由はないと思います。
マーティンエンダー

うわー、@MartinBüttner、あなたはそれを正しかった!ええ、私は再帰的に一致する括弧を完全に置き換えることが最も論理的だと思いました。コード仕様に合わせて簡単に調整することで機能しました。
ママファンロール

3

セッド、53

s/[^][(){}]//g
:;s/()//;t
:b;s/{}//;tb
:c;s/\[\]//;tc

ここでsedは、実際には真実/偽の概念がないため、空の文字列は真実を意味し、他のすべての文字列は偽を意味すると定義しています。

それが受け入れられない場合は、次のように数行追加できます。

セッド、66

s/[^][(){}]//g
:;s/()//;t
:b;s/{}//;tb
:c;s/\[\]//;tc
/./c0
/^$/c1

これは、falseの場合は0、trueの場合は1を出力します。


まったく同じソリューションのRetinaバージョン(34バイト、印刷0または1)に対するmolemanfulの回答に関する私のコメントを参照してください。誰がそれを投稿すべきかは言えませんが、おそらく二人のうちの一人でしょう。
マーティンエンダー

3

CJam、27 26バイト

"(){}[]"q1$f&_,@2/e*{/s}/!

これは、1(真)または0(偽)を出力します。オンラインでお試しください!または、すべてのテストケースを確認します。

使い方

"(){}[]"                    Push that string.
        q                   Read all input and push it on the stack.
         1$                 Copy the bracket string.
           f&               Intersect each input character with the bracket string.
                            This pushes an array of singleton and empty strings.
             _,             Get the length of the array (L), i.e., the number of
                            characters in the original input.
               @            Rotate the bracket string on top of the stack.
                2/          Split it into ["()" "{}" "[]"].
                  e*        Repeat each character pair L times.
                    {  }/   For each character pair.
                     /      Split the string on the stack at occurrences of that
                            character pair. This dosn't work properly the first
                            time, since there's a string array on the stack.
                      s     Flatten the resulting array of strings.
                         !  Apply logical NOT.

3

𝔼𝕊𝕄𝕚𝕟、43文字/ 62バイト

!Մ(Մ(Մ(ïċ/⁅⬮[\]{}]⌿),`⬮`,⬯),`{}`,⬯),`[]`,⬯)

Try it here (Firefox only).

いや。


ただし、新しく実装された機能を使用する場合、28文字/ 47バイトまで取得できます。

!ïċ/⁅⬮[\]{}]⌿)ė`⬮”ė`{}”ė`[]”

ああ、あなたは裏返しから一致する括弧を削除していますか?それはRetinaの34バイトに過ぎません:pastebin.com/bU77LzbR
Martin Ender

2

Japt42 37バイト

自分の言語にはないことに気づかなかった機能で5バイトを保存しました...追加してくれてありがとう@Downgoat!

Japtには、より良いRegExpサポートが本当に必要です...

!Uo"()[\\]\{}" e"\\(\\)" e"\{}" e"\\[]

オンラインでお試しください!

使い方

               // Implicit: U = input string
Uo"()[\\]\{}"  // Remove all non-bracket.
e"\\(\\)"      // Recursively remove all pairs of simple brackets.
e"\{}"         // Recursively remove all pairs of curly brackets.
e"\\[]         // Recursively remove all pairs of square brackets.
!              // Return the Boolean NOT of the result.
               // (true for empty string, false for anything else)
               // Implicit: output last expression

2

C99、226の 208の 207バイト

ゴルフをしようとするのはこれが初めてです

#define S s[i]
t(s,i)char*s;{int a[]={['[']=0,['{']=0,['(']=0};for(i=0;S*!(S=='{'&a['(']|S=='['&(a['(']|a['{'])|S==']'&(a['(']|a['{'])|S=='}'&a['(']);i++)a[S]++,a[S-S/90-1]--;return !(a['[']+a['{']+a['(']);}

読みやすい:

int t(char* s){
    int a[265]={['[']=0,['{']=0,['(']=0};
    for(int i=0;s[i]&&!((s[i]=='{'&a['(']>0)|(s[i]=='['&(a['(']>0|a['{']>0))|(s[i]==']'&(a['(']>0|a['{']>0))|(s[i]=='}'&a['(']>0));i++){
        a[s[i]]++;
        a[s[i]-(s[i]/90+1)]--;
    }
    return !(a['[']+a['{']+a['(']);
}

バッファオーバーフローがありますが、それは何にも影響しないようです-これはアライメントによるものだと思います。


1
スペースを省略することができますchar* s
チョイス

それを知らなかった-感謝
dj0wns

1

Perl、50 + 1 = 51バイト

$_=/^((([^][)(}{]|\((?3)*\))|{(?2)*})|\[(?1)*])*$/

偽りの結果には-pフラグと印刷が必要であり、1偽の結果には何もありません。以下-pと組み合わせることができるので、私は1つとして数えています-e

> perl -pe '$_=/^((([^][)(}{]|\((?3)*\))|{(?2)*})|\[(?1)*])*$/'

このコードは基本的に、Perlの気の利いた再帰正規表現機能を使用した、入力に対する単なる正規表現の一致です。

これをテストしてPerlボイラープレートをゴルフするのを手伝ってくれたDennisに感謝します。


1

Python 3:120バイト

@Adnanの答えに基づいて、使用する方が短いことがわかりました:

import re
x=re.sub('[^[\](){}]','',input())  
for i in('()','{}','[]'):  
 while x.find(i)>=0:x=x.replace(i,'')  
print(x=='')

1

Pythonの3、196の 170 160 154バイト

厄介なことに、6バイトを節約してくれたMegoに感謝します。

d=y=""
for C in input():
 for a in "[](){}":y+=C*(C==a)
 y=y.replace("()",d)
x=y
for r in y:x=x.replace("{}",d)
for s in y:x=x.replace("[]",d)
print(x==d)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.