การทรงตัวคร่อม


20

คุณจะได้รับสตริง (อาจว่างเปล่า) ที่มีเครื่องหมายวงเล็บ ( [{()}]) และอักขระอื่น ๆ ( A- Z, a- z, 0- 9, เครื่องหมายวรรคตอน) คุณต้องตรวจสอบว่ามันเป็นไปตามกฎต่อไปนี้:

  • อักขระที่ไม่ใช่วงเล็บเหลี่ยมจะถูกละเว้น
  • ทุกวงเล็บเปิดมีวงเล็บปิด[{( )}]ดังนั้นจึง[](ไม่ได้รับอนุญาต
  • วงเล็บซ้อนกันอย่างเหมาะสม [(])ไม่อนุญาต
  • วงเล็บปีกกาไม่สามารถมีวงเล็บสี่เหลี่ยมอยู่ภายในได้ วงเล็บปีกกาแบบง่ายไม่สามารถมีวงเล็บปีกกาหรือสี่เหลี่ยมจัตุรัสได้ ดังนั้น[({})], [{[]}]และ({})ไม่ได้รับอนุญาต วงเล็บสามารถซ้อนอยู่ในวงเล็บที่คล้ายกันดังนั้นจึง[[{((()))}{{(())}}]()]{()}อนุญาต

เอาท์พุทเป็นค่าความจริง / เท็จเดียวตามที่คุณเลือก

รหัสที่สั้นที่สุดชนะ


กรณีทดสอบ

b[[a{(/)}(())+={{}-}],] -> ถูกต้อง

([h][e][l][l][o]) -> ไม่ถูกต้อง

[///[{(\/(arg()))}1{{((-)-2)}}]()]{()} -> ถูกต้อง

hi -> ถูกต้อง


2
ซ้ำซ้อนที่เป็นไปได้ของการแก้ไขวงเล็บเหลี่ยมไม่สมดุล
FUZxxl

9
@FZZxxl ดูเหมือนว่าจะเป็นการท้าทายที่ยากกว่านี้มาก ฉันรู้สึกเหมือนมีคนหลงกลอยู่ที่ไหนซักแห่ง
Martin Ender

@ MartinBüttnerใช่มันทำได้ ฉันได้เพิ่มบททดสอบ และคุณพบสิ่งที่คุณต้องการหรือไม่
ghosts_in_the_code

1
@ MartinBüttner: ความท้าทายนี้อาจเป็นสิ่งที่คุณคิด
Ilmari Karonen

1
ฉันคิดว่าเราควรปิดคำถามอื่น ๆ ให้ซ้ำซ้อน มันดีกว่าเพราะมีโบนัสน้อยกว่า
lirtosiast

คำตอบ:


5

เรติน่า , 84 ไบต์

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

ลองออนไลน์

นี้เป็นธรรมตรงไปข้างหน้า ( แต่แข็งแรงเล่นกอล์ฟ) ส่วนขยายของพื้นฐานวงเล็บตรวจสอบ .NET regex

ขณะนี้เป็นไปได้มากทีเดียวกับความสมดุลของกลุ่มเรียกซ้ำของ Perl แน่นอนมีขอบที่นี่ อย่างไรก็ตามวิธีการอย่างใดอย่างหนึ่งถูกโจมตีโดยทิ้งความสง่างามของการแข่งขัน regex เดียวในความโปรดปรานของการลดการป้อนข้อมูลค่อยๆผ่านการแทนที่ซ้ำแล้วซ้ำอีกในขณะที่คำตอบที่ไม่ดีของ Digital Trauma สิ่งนี้สามารถนำไปใช้ใน 34 ไบต์ใน Retina แต่ฉันลังเลที่จะโพสต์รหัสด้วยตัวเองเนื่องจากฉันไม่ได้คิด


5

จอประสาทตา, 34

ประการแรกเครดิตที่เครดิตครบกำหนด:

ฉันเป็นอิสระ (ในภายหลัง) เกิดขึ้นด้วยวิธีเดียวกันใน sedดังนั้นฉันหวังว่าฉันไม่ได้เหยียบนิ้วเท้าใด ๆ ( ใหญ่หรืออย่างอื่น) โดยการโพสต์นี้:

[^][(){}]

+`\(\)

+`{}

+`\[]

^$

ดังนั้นตอนนี้ด้วยsudo apt-get install mono-completeและgit 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 ทำอะไรได้บ้าง ฉันเพิ่งเขียนโค้ดนี้ตามสิ่งที่ดูเหมือนว่าจะทำดังนั้นฉันไม่คิดว่าจะมีเหตุผลใด ๆ ที่ควรมีข้อผิดพลาดเดียวกัน
Martin Ender

ว้าว @ MartinBüttnerคุณเข้าใจถูกต้องแล้ว! ใช่ฉันคิดว่าการแทนที่การจับคู่วงเล็บเหลี่ยมด้านในออกซ้ำ ๆ เป็นตรรกะที่สุด ปรับแต่งอย่างรวดเร็วเพื่อให้พอดีกับรายละเอียดรหัสทำให้การทำงาน
Mama Fun Roll

3

Sed, 53

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

ที่นี่ฉันอ้างว่าเนื่องจากsedไม่มีแนวคิดเกี่ยวกับความจริง / ความเท็จจริง ๆ แล้วฉันจะกำหนดสตริงว่างให้หมายถึงความจริงและสตริงอื่น ๆ ทั้งหมดเพื่อหมายถึงความเท็จ

หากไม่เป็นที่ยอมรับเราสามารถเพิ่มสองบรรทัดดังนี้:

Sed, 66

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

ผลลัพธ์นี้ 0 สำหรับเท็จและ 1 สำหรับจริง


ดูความคิดเห็นของฉันเกี่ยวกับคำตอบที่ไม่เหมาะสมสำหรับรุ่น Retina ของโซลูชันเดียวกันที่แน่นอน (ที่ 34 ไบต์; การพิมพ์0หรือ1) ฉันไม่สามารถบอกได้ว่าใครควรโพสต์ แต่น่าจะเป็นหนึ่งในสองของคุณ
Martin Ender

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 chars / 62 bytes

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

Try it here (Firefox only).

Nope


อย่างไรก็ตามถ้าฉันใช้ฟีเจอร์ที่เพิ่งติดตั้งใหม่ฉันสามารถลดได้ถึง 28 ตัวอักษร / 47 ไบต์

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

โอ้วคุณถอดวงเล็บที่ตรงกันออกจากด้านในออกมาไหม นั่นจะเป็นเพียง 34 ไบต์ใน Retina: pastebin.com/bU77LzbR
Martin Ender

2

Japt , 42 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
Cyoce

ไม่ทราบว่า - ขอบคุณ
dj0wns

1

Perl, 50 + 1 = 51 ไบต์

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

ต้องมีการ-pตั้งค่าสถานะและพิมพ์1เพื่อความจริงและไม่มีอะไรสำหรับผลลัพธ์ที่ผิดพลาด ฉันนับ-pเป็นหนึ่งเพราะสามารถใช้ร่วมกับ-e:

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

รหัสนั้นเป็นเพียงแค่การจับคู่ regex ธรรมดากับการป้อนข้อมูลโดยใช้คุณสมบัติ regex ที่ดีเลิศ Perl ของ Perl

ขอบคุณเดนนิสที่ช่วยฉันทดสอบสิ่งนี้และเล่นกอล์ฟแผ่นเหล็ก Perl



1

Python 3, 196 170 160 154 ไบต์

ช้าไปหน่อยขอบคุณ Mego สำหรับการบันทึก 6 ไบต์:

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.