等しいアウトブラケットタイプ


9

この質問に基づいてい ます。

文字列が与えられたら、各ブラケット()[]{}<>を適切なタイプのブラケットに置き換えて、ブラケットが一致し、ネストされたブラケットが次のように循環するようにします。

  1. 一番外側のものは ()
  2. 直接の中にある()はずです[]
  3. 直接の中にある[]はずです{}
  4. 直接の中にある{}はずです<>
  5. 直接の内側に<>なり()、再び(サイクル)

ブラケット以外の文字はすべて、そのままにしておく必要があります。開き角括弧は、あるタイプの開き角括弧にのみ置き換えられ、閉じ角括弧は閉じ角括弧に置き換えられます。

入力は常にこれを可能にします。これは、タイプが無視された場合にブラケットが正しく一致することを意味します。だから、{ab<)c]有効な入力ですが、ab)(cdab((cdではありません。

例:

2#jd {¤>. = 2#jd (¤).
abcdef    = abcdef
(3×5+(4-1)) = (3×5+[4-1])
<<<>><<>><<<<<<>>>>>>> = ([{}][{}][{<([{}])>}])

この方法での入力のネイティブ変換(言語の自動構文)の使用は許可されていません。

いつものように:最短のコードが優先されます。


私は挑戦を理解していません。入力に関して、出力は何である必要がありますか?
xnor

@xnor出力は、4種類の角かっこを除いて、入力と同じ文字列である必要があります。パターンに一致するように交換する必要があります。
Dirk Reichel、

あ、そうか。「あるべき」があなたが真実にするはずのことだと理解していませんでした。わかりやすくするために編集します。
xnor

1
@DirkReichel心配する必要はないと思います。どの言語もこの特定の変換をネイティブに実行できるとは想像できません。万が一そのような言語が存在する場合、その言語での回答はあまり面白くないということです。
Martin Ender

2
@DirkReichelポイントは何ですか?ASCIIに固執するだけです。異なる文字を使用しても、ASCIIのみの言語での不要な制限を除いて、課題は何も追加されません。
FlipTack 16

回答:


2

JavaScript(ES6)、79バイト

s=>s.replace(/./g,c=>~(p=l.indexOf(c))?l[p&4?--k&3|4:k++&3]:c,l='([{<)]}>',k=0)

テストケース


1

レックス、132バイト

%{
int i,o[4]={40,91,123,60};
%}
%%
[[({<] {putchar(o[i++&3]);}
[])}>] {putchar(o[--i&3]+2-!(i&3));}
%%
yywrap(){}
main(){yylex();}

flex最後の2行または3行をそれぞれ削除することで、27バイト(ポータブルlex)または30バイト(コンパイラーとして使用)を節約できますが、数バイト(おそらく2、3または4、ルールはやや不明確)です。-ll結果のCファイルをリンクするときのコマンドラインオプションのペナルティ。(つまり、でコンパイルするのlex brackets.l; cc lex.yy.cではなく、でコンパイルしますlex brackets.l; cc lex.yy.c -ll。)これは、この状況で作成する価値のあるトレードオフです。

1

Java、155バイト

a->{String s="([{<)]}>";for(int i=0,j=0,k;i<a.length;i++){k=s.indexOf(a[i]);if(k>3){a[i]=s.charAt(--j%4+4);}else if(k>-1){a[i]=s.charAt(j++%4);}}return a;}

char[]単一の引数としてaを取るラムダ。配列をループし、その位置をs変数(k)内の角括弧()の文字列に格納します。それが開始ブラケットまたは終了ブラケットであるかどうかを確認し(s.indexAt())、ネストのレベル(s.charAt())に基づいて適切なブラケットに置き換え、適切にループします%4


1

Haskell、126バイト

b="([{<"
d=")]}>"
y=cycle
(!)=elem
f(e:c)n(x:r)|x!b=y b!!n:f(y d!!n:e:c)(n+1)r|x!d=e:f c(n-1)r|1<3=x:f(e:c)n r
f c n s=s
f" "0

ideoneでお試しください。使用法:

*Main> f" "0 "<<<>><<>><<<<<<>>>>>>>"
"([{}][{}][{<([{}])>}])"

説明

f3つの引数を取ります:閉じ括弧のスタックとして機能する文字列n、入れ子の深さをカウントするためのint 、および入力文字列。

f c n "" = ""                            -- base case for recursion: input string is empty
f (e:c) n (x:r)                          -- for the current char x
   | elem x "([{<" =                     -- check if it is an opening bracket
       (cycle "([{<")!!n :               --   if so, replace it with a bracket of the current nesting depth
           f ((cycle ")]}>")!!n : e : c) --   push the matching closing bracket on the stack
               (n+1) r                   --   increase depth level and check the next char
   | elem x ")]}>" =                     -- if x is a closing bracket
       e :                               --   replace it by the closing bracket from on top of the stack
           f c (n-1) r                   --   decrement depth level and check the next char
   | otherwise     = x : f (e:c) n r     -- otherwise keep x and check the next char
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.