平衡三连音括号


19

“三重括号”(我为应对这一挑战做了准备)是以下之一:

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

平衡的三连音括号字符串(简称BTBS)可以是空字符串,两个BTBS串联在一起,也可以是上述...三连音括号之一,每个括号用BTBS代替。

您的任务是编写一个程序或函数,以检查仅由一个字符串组成的字符串是否(+)[:]{|}<->平衡。最短的代码胜出。

例子

您的程序应为以下字符串返回true:

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

您的程序应为以下字符串返回falsy:

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

(|)有效的。我认为不是,但是我不确定
RomanGräf16年

@RomanGräf不,就像<|>在虚假的例子中一样。
jimmy23013

Answers:


1

Japt,25个字节

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

在线测试!

e在字符串上是一个递归替换函数。第二个参数默认为空字符串,这意味着它将以递归方式删除Japt regex的匹配项"%(%+%)|%[:]|\{%|}|<->"(按常规术语/\(\+\)|\[:]|{\|}|<->/)。对于平衡三元组字符串,这将返回一个空字符串,对于非平衡三元组字符串,将返回一个非空字符串,因此正确的返回值是此逻辑的NOT。


14

JavaScript(ES6),77 58 57 56字节

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

测试用例


2
在视网膜上的同样的想法是26个字节(第一行只是使它成为一个测试套件):retina.tryitonline.net/...
马丁安德

1
39用Perl: perl -lpe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=!$_'
达达

@Dada将考虑0使用BTBS。请改用此38:perl -pe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=/^$/'
Ton Hospel'Ton Hospel '16

@TonHospel确实没想到这一点..感谢您指出!(如果您愿意,可以随意发布,或者至少不要因为我而退缩)
Dada

S / s的组合有点令人困惑,也许是f=s=>s==(s=s.replace(...))?!s:f(s)
尼尔

5

sed,28 27字节

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

sed没有“真/假”的概念,因此我考虑的是空字符串“真”和非空字符串“假”。这将检查我们是否认为是有条件的/^$/

感谢@Neil打高尔夫球1个字节!

在线尝试!


1
BRE实际上是一次优势
丹尼斯

您需要\]]足够吗?
尼尔

我不。谢谢!
丹尼斯,

4

Python,77个字节

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

使用Arnauld的替换想法。生成并评估一个长字符串,例如

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

在更换所有支架类型之间循环。然后,检查结果是否为空字符串。


3

Mathematica,55个字节

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

匿名函数。将字符串作为输入并返回TrueFalse作为输出。使用标准方法执行此操作。


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&.>/'(+)';'[:]';'{|}';'<->';])^:_

与其他类似,这也是基于Arnauld的方法

用法

   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

Scala,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

在线尝试!

循环len(a)次,用空字符串()替换所有出现的空三元括号("(+)[:]{|}<->"<>3,其中<>“ group”运算符=> )。这么多迭代是过大的,但是它将永远足以将所有正确形成的三元组括号完全减少为零。循环完成后,输出:if 为真(仍然有一些字符),if 为假(空)。["(+)"; "[:]"; "{|}"; "<->"]x!a0a1a

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.