等距括号类型


9

基于 这个问题。

给定一个字符串,将每个括号替换()[]{}<>为适当类型的括号,以使括号匹配,并且嵌套括号循环如下:

  1. 最外面的是 ()
  2. 直接的内()[]
  3. 直接的内[]{}
  4. 直接的内{}<>
  5. 直接在内<>()再次出现(周期)

所有非括号字符必须保持原样。开括号只能用某种类型的开括号替换,而闭括号则要用闭括号替换。

输入将始终使之成为可能。这意味着如果忽略其类型,则其括号正确匹配。所以,{ab<)c]是一个有效的输入,但ab)(cd还是ab((cd没有。

例子:

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

不允许使用这种方式对输入进行本机转换(语言的自动语法)。

与往常一样:最短的代码获胜。


我不明白挑战。就输入而言,输出必须是什么?
xnor

@xnor除了四种括号外,输出应与输入相同。需要替换它们以匹配模式。
Dirk Reichel

啊,现在我明白了。我不明白“应该是”是您应该做的真实的事情。我将进行编辑以使其更加清晰。
xnor

1
@DirkReichel我认为这不是您需要担心的事情。我无法想象任何一种语言都可以在本地进行这种特定的转换,并且在极少数的情况下,如果有这样一种语言,那么这意味着用该语言回答并不是一件很有趣的事情。
马丁·恩德

2
@DirkReichel有什么意义?只需坚持使用ASCII。除了对纯ASCII语言的不必要限制外,使用不同的字符不会给挑战带来任何好处。
FlipTack

Answers:


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

Lex,132个字节

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

flex通过分别删除最后两行或三行,您可以节省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[]作为参数的lambda 。我们遍历数组,将其位置存储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 "<<<>><<>><<<<<<>>>>>>>"
"([{}][{}][{<([{}])>}])"

说明

f接受三个参数:一个字符串,用作堆栈,用于括弧,一个int n用于计算嵌套深度和输入字符串。

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
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.