Збалансовані дужки трійки


19

"Триплетна дужка" (яку я склав для цього виклику) - це одне з наступних:

(...+...)
[...:...]
{...|...}
<...-...>

Збалансована триплетна дужка-рядок (BTBS коротко) - це порожня рядок, два об'єднані BTBS, або одна з вищевказаних дужок триплетів, кожна з яких ...замінена BTBS.

Ваше завдання - написати програму або функцію, яка перевіряє, чи (+)[:]{|}<->врівноважена рядок, що складається тільки з . Найкоротший код виграє.

Приклади

Ваша програма повинна повернути truthy для таких рядків:

(+)(+)(+)
[[[:]:]:(+(+))]{<->|<(+)->[:]}(+)
<<<<<<<<<<<<->->->->->->->->->->->->
{|(+[:<-{|(+[:<->])}>])}
[[[:]:[:]]:[[:]:[:]]]
{[:](+)|<->{|}}[(+)<->:{|}(+)]

Ваша програма повинна повернути помилкове значення для таких рядків:

:[
<|>
(+(+)
[:][:](+[[:]):]
{|{|{|(+{|{|{|}}}}}+)}[:]{|}
{{||}}
<<->-<->-<->>
[(+):((+)+)+(+(+))]
<<<<<->->->->->->

Є (|)дійсним. Я не думаю, що це, але я не впевнений
Роман Ґраф

@ RomanGräf Ні, як <|>у хибних прикладах.
jimmy23013

Відповіді:


1

Japt, 25 байт

!Ue"%(%+%)|%[:]|\{%|}|<->

Перевірте це в Інтернеті!

eon string - це рекурсивно-замінна функція. Другий параметр за замовчуванням пустий рядок, що означає, що цей рекурсивно видаляє збіги "%(%+%)|%[:]|\{%|}|<->"регулярного вираження Japt (у звичайних умовах /\(\+\)|\[:]|{\|}|<->/). Це повертає порожню рядок для врівноважених рядків триплетів і непусту рядок для неврівноважених, тому правильне значення повернення є логічним НЕ цього.


14

JavaScript (ES6), 77 58 57 56 байт

f=s=>s==(s=s.replace(/\(\+\)|\[:]|{\|}|<->/,''))?!s:f(s)

Тестові справи


2
Ця ж ідея у Retina - це 26 байт (перший рядок просто робить її тестовим набором): retina.tryitonline.net/…
Мартін Ендер

1
І 39 з Perl: perl -lpe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=!$_'.
Дада

@Dada Це буде враховувати 0BTBS. Використовуйте замість цього 38:perl -pe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=/^$/'
Тонне Євангеліє

@TonHospel Не думав про це, справді .. дякую, що вказав на це! (сміливо публікуйте це, якщо хочете до речі, або принаймні не стримуєтесь через мене)
Dada

Можливо, ця суміш S / s була дещо заплутана f=s=>s==(s=s.replace(...))?!s:f(s)?
Ніл

5

sed, 28 27 байт

:
s#(+)\|\[:]\|{|}\|<->##
t

sed не має поняття truthy / falesy, тому я розглядаю порожню строку truthy та непустую фальшиву струну. Це перевіряється, чи вважаємо ми умовними /^$/.

Дякуємо @Neil за те, що виграли 1 байт!

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


1
Один раз BRE - це фактично перевага .
Денніс

Вам потрібне \]чи ]достатньо?
Ніл

Я не. Спасибі!
Денніс

4

Пітон, 77 байт

lambda s:eval("s"+".replace('%s','')"*4%('(+)','[:]','{|}','<->')*len(s))==''

Використовує ідею заміни Арнаульда . Створює та оцінює довгий рядок, як

s.replace('(+)','').replace('[:]','').replace('{|}','').replace('<->','').replace('(+)','').replace('[:]','').replace('{|}','').replace('<->','')

переходити між заміною всіх типів дужок. Потім перевіряє, чи є результат порожнім рядком.


3

Математика, 55 байт

StringDelete["(+)"|"[:]"|"{|}"|"<->"]~FixedPoint~#==""&

Анонімна функція. Приймає рядок як вхід і повернення Trueабо Falseяк вихід. Для цього використовується стандартний метод.


2

Грим , 39 байт

e`\(_\+_\)|\[_\:_\]|\{_\|_\}|\<_\-_\>v*

Спробуйте в Інтернеті! На жаль, у більшості тестових випадків у TIO версії не вистачає пам'яті.

Пояснення

Тут нічого надто фантазійного. _- це стенограма для всього шаблону і v*така сама, як *, але з нижчим пріоритетом.

e`                                       Match entire input against this pattern:
  \(_\+_\)                               '(', match of _, '+', match of _, ')'
          |                              or
           \[_\:_\]|\{_\|_\}|\<_\-_\>    same for the other bracket types
                                     v*  repeated 0-∞ times

2

J, 48 байт

a:=([:delstring&.>/'(+)';'[:]';'{|}';'<->';])^:_

Як і у інших, це також засновано на методі Арнальда .

Використання

   f =: a:=([:delstring&.>/'(+)';'[:]';'{|}';'<->';])^:_
   f '(+)(+)(+)'
1
   f '[[[:]:]:(+(+))]{<->|<(+)->[:]}(+)'
1
   f '<<<<<<<<<<<<->->->->->->->->->->->->'
1
   f '<|>'
0
   f '[:][:](+[[:]):]'
0
   f '{|{|{|(+{|{|{|}}}}}+)}[:]{|}'
0

Пояснення

a:=([:delstring&.>/'(+)';'[:]';'{|}';'<->';])^:_  Input: string S
   (                                        )^:_  Repeat until convergence
                                         ]          Get S
                 '(+)';'[:]';'{|}';'<->';           Append to ['(+)', '[:]', '{|}', '<->']
    [:delstring&.>/                                 Reduce right-to-left by deleting
                                                    occurrences of each string on the
                                                    left from the right
                                                    Return the final string as the new S
a:=                                               Test if the final value of S is empty

0

Скала, 96 байт

def&(s:String):Any={val t=s.replaceAll(raw"\(\+\)|\[:]|\{\|}|<->","")
if(t==s)t.size<1 else&(t)}

Це в основному та сама ідея, що і в інших відповідях, але з деякими котлами Scala.

без крадіжок ідей у ​​інших (188 байт):

import scala.util.parsing.combinator._
val a = new RegexParsers{def r:Parser[_]="("~r~"+"~r~")"|"["~r~":"~r~"]"|"{"~r~"|"~r~"}"|"<"~r~"-"~r~">"|""
def!(s:String)= !parseAll(r,s).isEmpty}!_

0

Піп , 26 байт

L#aaR:"(+)[:]{|}<->"<>3x!a

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

Цикли тривають (a) разів, замінюючи всі випадки порожніх дужок триплетів ( "(+)[:]{|}<->"<>3де <>оператор "групи", => ["(+)"; "[:]"; "{|}"; "<->"]) порожнім рядком ( x). Ця кількість повторень є надмірною, але її завжди буде більш ніж достатньо, щоб повністю звести всі правильно сформовані дужки триплетів ні до чого. Після завершення циклу виводиться !a: 0if atruthy (все ще має деякі символи), 1якщо afalsey (порожній).

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