Балансування кронштейнів


20

Вам буде наданий (можливо, порожній) рядок, що містить дужки ( [{()}]) та будь-які інші символи ( A- Z, a- z, 0- 9, пунктуація). Вам потрібно перевірити, чи він дотримується таких правил:

  • Персонажі без дужок ігноруються.
  • Кожна відкрита дужка [{(має дужку , що закривається )}]. Так [](не дозволено.
  • Дужки належним чином вкладені. [(])не дозволено.
  • Фігурні дужки не можуть містити в них квадратні дужки. Прості дужки не можуть містити в собі ні фігурні, ні квадратні дужки. Отже [({})], [{[]}]і ({})не допускаються. Дужки можуть бути вкладені в подібні дужки, тому [[{((()))}{{(())}}]()]{()}це дозволено.

Вихід - це одне значення truthy / falsey за вашим вибором.

Найкоротший код виграє.


Тестові кейси

b[[a{(/)}(())+={{}-}],] -> Дійсно

([h][e][l][l][o]) -> Недійсний

[///[{(\/(arg()))}1{{((-)-2)}}]()]{()} -> Дійсно

hi -> Дійсно



9
@FUZxxl Це виглядає набагато складніше. Я відчуваю, що десь є ще одна дупа.
Мартін Ендер

@ MartinBüttner Так, це може. Я додав кілька тестів. А ви знайшли дублікат, який шукали?
ghosts_in_the_code

1
@ MartinBüttner: Цей виклик може бути тим, про що ви думали.
Ільмарі Каронен

1
Я думаю, ми повинні закрити інше питання як дублікат цього; це краще, оскільки в ньому менше бонусів.
lirtosiast

Відповіді:


5

Сітківка , 84 байти

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

Спробуйте в Інтернеті.

Це досить прямого (але гольф) розширення базових. NET-регексів .

Незважаючи на те, що це цілком можливо для балансуючих груп, рекурсія Перла тут безумовно має перевагу . Однак будь-який підхід долається, вибиваючи елегантність одного матчу регулярних виразів на користь зменшення введення поступово за допомогою повторних підстановок, як це робить відповідь Digital Trauma . Це може бути реалізовано в 34 байтах у Retina, але я не вагаюся, коли я сам розміщувати код, оскільки я не придумав ідеї.


5

Сітківка, 34

По-перше, кредит, у якому належить отримати кредит:

Я самостійно (пізніше) придумав такий же підхід у sed , тому сподіваюся, що я не ступаю ні на які пальці ( великі чи інакше), публікуючи це:

[^][(){}]

+`\(\)

+`{}

+`\[]

^$

Тож тепер з a 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. Я щойно написав цей код, виходячи з того, що він виглядав, як це буде робити, тому я не думаю, що є якась причина, що у нього повинна бути однакова помилка.
Мартін Ендер

Ух, @ MartinBüttner, ти правильно це зрозумів! Так, я вважав, що рекурсивна заміна відповідних дужок зсередини - найбільш логічною. Швидке налаштування відповідно до специфікацій коду змусило його працювати.
Mama Fun Roll

3

Сід, 53

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

Тут я стверджую, що оскільки sedнасправді не існує поняття truthy / falsey, то я визначаю порожню рядок, щоб означати truthy, а всі інші рядки означати falsey.

Якщо це не прийнятно, ми можемо додати пару рядків, таким чином:

Сід, 66

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

Це виводить 0 для хибних та 1 для істинних.


Дивіться мій коментар до відповіді моларманфу для версії Retina в тому ж самому рішенні (у 34 байти; друк 0або 1). Я не можу сказати, хто повинен це опублікувати, але, мабуть, це має бути один із вас.
Мартін Ендер

3

CJam, 27 26 байт

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

Це друкує 1 (truthy) або 0 (false). Спробуйте в Інтернеті! або перевірити всі тестові випадки.

Як це працює

"(){}[]"                    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 байт:

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

О, ви виймаєте відповідні дужки зсередини? Це було б лише 34 байти в сітці: pastebin.com/bU77LzbR
Мартін Ендер

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
Кіос

Не знав, що - дякую
dj0wns

1

Perl, 50 + 1 = 51 байт

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

Потрібен -pпрапор і відбитки 1для трибуни і нічого для хибних результатів. Я рахую -pяк один, тому що його можна поєднувати з -e:

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

Код - це лише звичайний збіг регулярних виразів проти введення, використовуючи чудову рекурсивну функцію регексу Perl.

Дякую Деннісу за те, що він допоміг мені перевірити це і переграти котельну плиту Perl.


1

Пітон 3: 120 байт

Спираючись на відповідь @ Аднана , його виявилося коротшим:

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

1

Пітон 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.