Cân bằng khung


20

Bạn sẽ được cung cấp một chuỗi (có thể trống) chứa dấu ngoặc ( [{()}]) và bất kỳ ký tự nào khác ( A- Z, a- z, 0- 9, dấu chấm câu). Bạn cần kiểm tra xem nó có tuân thủ các quy tắc sau không:

  • Các ký tự không dấu ngoặc được bỏ qua.
  • Mỗi khung mở [{(có một khung đóng )}]. Vì vậy, [](không được phép.
  • Chân đế được lồng đúng cách. [(])không được đồng ý.
  • Dấu ngoặc nhọn không thể chứa dấu ngoặc vuông trong chúng. Dấu ngoặc đơn giản không thể chứa dấu ngoặc nhọn hoặc vuông trong chúng. Vì vậy [({})], [{[]}]({})không được phép. Chân đế có thể được lồng với dấu ngoặc tương tự, vì vậy [[{((()))}{{(())}}]()]{()}được cho phép.

Đầu ra là một giá trị trung thực / falsey theo sự lựa chọn của bạn.

Mã ngắn nhất sẽ thắng.


Các trường hợp thử nghiệm

b[[a{(/)}(())+={{}-}],] -> Hợp lệ

([h][e][l][l][o]) -> Không hợp lệ

[///[{(\/(arg()))}1{{((-)-2)}}]()]{()} -> Hợp lệ

hi -> Hợp lệ



9
@FUZxxl Trông có vẻ như là một thử thách khó khăn hơn nhiều. Tôi cảm thấy như có một bản dupe khác ở đâu đó.
Martin Ender

@ MartinBüttner Vâng, nó có thể. Tôi đã thêm một số testcase. Và bạn đã tìm thấy bản sao bạn đang tìm kiếm?
ghosts_in_the_code

1
@ MartinBüttner: Thử thách này có thể là những gì bạn đang nghĩ đến.
Ilmari Karonen

1
Tôi nghĩ chúng ta nên đóng câu hỏi khác như một bản sao của câu hỏi này; Điều này tốt hơn bởi vì nó có ít tiền thưởng hơn.
lirtosiast

Câu trả lời:


5

Võng mạc , 84 byte

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

Hãy thử trực tuyến.

Đây là một phần mở rộng khá đơn giản (nhưng được đánh gôn) của biểu thức .NET kiểm tra dấu ngoặc đơn cơ bản .

Mặc dù điều này hoàn toàn có thể xảy ra với các nhóm cân bằng, nhưng đệ quy của Perl chắc chắn có lợi thế ở đây . Tuy nhiên, một trong hai cách tiếp cận bị đánh bại bằng cách bỏ đi sự thanh lịch của một trận đấu regex duy nhất có lợi cho việc giảm dần đầu vào thông qua các thay thế lặp đi lặp lại, như câu trả lời sed của Digital Trauma . Điều này có thể được thực hiện trong 34 byte trong Retina, nhưng tôi ngần ngại tự mình đăng mã, vì tôi đã không đưa ra ý tưởng.


5

Võng mạc, 34

Thứ nhất, tín dụng khi tín dụng đáo hạn:

Tôi độc lập (sau này) đã đưa ra cách tiếp cận tương tự trong sed , vì vậy tôi hy vọng tôi không giẫm lên bất kỳ ngón chân nào ( lớn hay nói cách khác) bằng cách đăng bài này:

[^][(){}]

+`\(\)

+`{}

+`\[]

^$

Vì vậy, bây giờ với một sudo apt-get install mono-completegit clone https://github.com/mbuettner/retina.gittôi có một võng mạc hoạt động trên máy ảo Ubuntu của tôi. Đây là đầu ra thử nghiệm:

$ 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 Xem đầu ra thử nghiệm. Tôi tin rằng mã là chính xác và tất cả các testcase đang vượt qua. Có một vấn đề cụ thể mà bạn nhìn thấy trong mã, hoặc testcase cụ thể mà bạn nghĩ sẽ thất bại?
Chấn thương kỹ thuật số

@ThomasKwa Tôi không chuyển mã của họ, vì tôi không biết bất kỳ phần nào của ESMIN làm gì. Tôi chỉ viết mã này dựa trên những gì nó trông giống như nó sẽ làm, vì vậy tôi không nghĩ có bất kỳ lý do nào khiến lỗi này giống nhau.
Martin Ender

Ồ, @ MartinBüttner, bạn hiểu rồi! Vâng, tôi nghĩ rằng thay thế đệ quy các dấu ngoặc phù hợp từ trong ra ngoài là hợp lý nhất. Một tinh chỉnh nhanh để phù hợp với thông số kỹ thuật mã làm cho nó hoạt động.
Mama Fun Roll

3

Trầm tích, 53

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

Ở đây tôi khẳng định rằng vì sedkhông thực sự có khái niệm về sự thật / falsey, nên tôi đang định nghĩa chuỗi rỗng có nghĩa là sự thật và tất cả các chuỗi khác có nghĩa là falsey.

Nếu điều đó không được chấp nhận, thì chúng ta có thể thêm một vài dòng, do đó:

Trầm tích, 66

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

Điều này xuất ra 0 cho sai và 1 cho đúng.


Xem nhận xét của tôi về câu trả lời của molarmanful cho phiên bản Retina của cùng một giải pháp (ở mức 34 byte; in 0hoặc 1). Tôi không thể nói ai nên đăng nó, nhưng có lẽ nên là một trong hai bạn.
Martin Ender

3

CJam, 27 26 byte

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

Điều này in 1 (trung thực) hoặc 0 (giả mạo). Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm.

Làm thế nào nó hoạt động

"(){}[]"                    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 ký tự / 62 byte

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

Try it here (Firefox only).

Không.


Tuy nhiên, nếu tôi sử dụng các tính năng mới được triển khai, tôi có thể nhận được tới 28 ký tự / 47 byte:

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

Ohhh, bạn đang loại bỏ các dấu ngoặc phù hợp từ trong ra ngoài? Đó chỉ là 34 byte trong Retina: pastebin.com/bU77LzbR
Martin Ender

2

Japt , 42 37 byte

Đã lưu 5 byte với một tính năng Tôi không nhận ra ngôn ngữ của mình có ... Cảm ơn vì đã thêm nó, @Downgoat!

Japt thực sự cần hỗ trợ RegExp tốt hơn ...

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

               // 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 byte

Đây là lần đầu tiên tôi cố gắng chơi gôn

#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['(']);}

Có thể đọc được

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

Có một lỗi tràn bộ đệm nhưng dường như nó không ảnh hưởng đến bất cứ điều gì - tôi tin rằng điều này là do sự liên kết.


1
Bạn có thể bỏ qua khoảng trống trongchar* s
Cyoce

Không biết rằng - cảm ơn
dj0wns

1

Perl, 50 + 1 = 51 byte

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

Yêu cầu -pcờ và bản in 1cho sự thật và không có gì cho kết quả giả. Tôi đang tính -plà một, bởi vì nó có thể được kết hợp với -e:

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

Mã về cơ bản chỉ là một kết hợp regex đơn giản so với đầu vào, sử dụng tính năng regex đệ quy tiện lợi của Perl.

Cảm ơn Dennis vì đã giúp tôi kiểm tra cái này và đánh gôn cái nồi hơi Perl.


1

Python 3: 120 byte

Dựa trên câu trả lời của @ Adnan , đã được chứng minh ngắn hơn để sử dụng:

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 byte

Thật dài, cảm ơn Mego vì đã lưu 6 byte:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.