バランストリプレットブラケット


19

「トリプレットブラケット」(このチャレンジのために作成した)は、次のいずれかです。

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

バランスのとれたトリプレットブラケット文字列(略してBTBS)は、空の文字列、2つのBTBSが連結されている、または上記のトリプレットブラケットのいずれか...がBTBSに置き換えられたものです。

あなたの仕事は、それだけで構成される文字列の(+)[:]{|}<->バランスが取れているかどうかをチェックするプログラムまたは関数を書くことです。最短のコードが優先されます。

プログラムは、次の文字列に対して真実を返す必要があります。

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

プログラムは、次の文字列に対して偽を返す必要があります。

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

ある(|)有効。私はそうは思いませんが、私はよく分からない
ローマグラーフ

@RomanGräfいいえ、<|>偽の例のように。
jimmy23013

回答:


1

Japt、25バイト

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

オンラインでテストしてください!

e文字列上の再帰的な置換関数です。2番目のパラメーターのデフォルトは空の文字列です。これは、Japt正規表現の一致を再帰的に削除することを意味します"%(%+%)|%[:]|\{%|}|<->"(通常、/\(\+\)|\[:]|{\|}|<->/)。これは、均衡のとれたトリプレット文字列の場合は空の文字列を返し、非均衡の場合は空でない文字列を返します。したがって、正しい戻り値はこれの論理否定です。


14

JavaScript(ES6)、77 58 57 56バイト

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

テストケース


2
:網膜の同じ考え方は、26バイト(最初の行はそれのテストスイートにする)であるretina.tryitonline.net/...
マーティン・エンダー

1
そして、Perlと39: perl -lpe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=!$_'
ダダ

@Dada BTBSを検討0します。代わりに、この38を使用してください:perl -pe 's/<->|\(\+\)|{\|}|\[:]//&&redo;$_=/^$/'
トンHospel

@TonHospelそれを考えていませんでした、確かに..指摘してくれてありがとう!(ちなみに、必要に応じて投稿するか、少なくとも私のために遠慮しないでください)
ダダ

そのS / sミックスは少し混乱していました、おそらくf=s=>s==(s=s.replace(...))?!s:f(s)
ニール

5

sed、28 27バイト

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

sedには真実/偽りの概念がないため、空の文字列の真実と空でない文字列の偽りを検討しています。これは、条件付きを考慮するかどうかをチェックします/^$/

1バイトのゴルフをしてくれた@Neilに感謝します!

オンラインでお試しください!


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~#==""&

匿名関数。入力として文字列を受け取り、出力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&.>/'(+)';'[:]';'{|}';'<->';])^:_

他と同様に、これも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"演算子、=> ["(+)"; "[:]"; "{|}"; "<->"])のすべての出現を空の文字列(x)に置き換えます。この多くの反復は過剰ですが、適切に形成されたすべてのトリプレットブラケットを完全に無に減らすには常に十分です。ループが完了した後、出力は!a0場合atruthyで、(まだいくつかの文字が含まれている)1場合afalsey(空)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.