展平Stack Cats程序


13

Stack Cats是一种可逆的基于堆栈的语言。它的可逆性导致一些怪异的循环。这个挑战是关于条件循环的(...)。当这些循环以某些方式嵌套时,可以对代码进行转换以减小嵌套深度。下面是规则(其中A,并B代表任意片段):

  1. 当一个循环从另一个循环开始时,我们可以将内部循环提取到最前面:((A)B)变成(A)(B)
  2. 当一个循环以另一循环结束时,我们可以将内部循环提取到最后:(B(A))变成(B)(A)
  3. 空循环()可以从程序中完全删除。作为推论(结合其他规则),((A))等效于(A)

唯一的嵌套循环所留的形式为(A(B)C),其中ABC非空。

挑战

您将获得一个有效的Stack Cats程序,并且您的任务是使用上述转换尽可能地降低循环的嵌套级别,不留空循环。

有效的Stack Cats程序...

  • ...仅由字符组成()/\<>[]{}!"*+-:=ITX^_|
  • ...具有镜像对称性(例如,\(]{}!{}[)/是有效程序,但/|/不是)。
  • ...已正确匹配和嵌套,()并且{}[]<>并且\/不一定要像往常一样进行匹配,尽管由于镜像对称性要求,它们将成对出现)。

您可以将字符串或字符列表作为输入,但是输出必须以相同的格式显示。

您可以编写程序或函数,并使用我们的任何标准方法来接收输入和提供输出。请注意,默认情况下,这些漏洞是禁止的。

这是,因此以字节为单位的最短有效答案为准。

测试用例

测试用例每行两行(输入和输出),用空行分隔。请注意,一个输出为空。您还需要支持空输入(这将导致空输出)。

(((=+|+=)))
(=+|+=)

({(=+|+=)})
({(=+|+=)})

((\)/)I(\(/))
(\)(/)I(\)(/)

(()()(())()())


((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)

可以肯定的是,我们必须提取的循环仅由括号指示(),因此输入{{A}B}将保持不变并且不会被提取出来{A}{B}
凯文·克鲁伊森

@KevinCruijssen是的,该转换仅对(...)-type循环有效。
Martin Ender '18

在最后的测试用例中,为什么\^/在括号内?
凯文·克鲁伊森

1
@KevinCruijssen提取(<|>((X((T)))[_]))和后,这些是最外面的括号(([_](((T))X))<|>)
马丁·恩德

1
啊,我明白了。因此,随后((A)B(C))(A)(B)(C)根据规则1和2 变为:((A)B(C))(A)(B(C))(规则1)→ (A)(B)(C)(规则2)。
凯文·克鲁伊森

Answers:


6

视网膜0.8.2113 107 67 66个字节

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

在线尝试!多亏了@MartinEnder,其中包括3个 4字节的节省。说明:

+`

重复应用替换,直到没有匹配项为止。

\(\)|

匹配一个空循环(在这种情况下,不会捕获任何内容,因此替换操作将其删除)或:

(\()?

(可选)匹配一个(。如果匹配,则在组1中捕获,如果不匹配,则不捕获。

(\(

在组2中捕获比赛的主体并匹配(

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

重复匹配a (,在第4组中捕获它或a ),从第4组中删除捕获(如果没有,则失败)或其他匹配项。

(?(4)@)

确保组4中没有剩余的捕获。

\))

用另一个结束捕获组2 )

(?(1)|(\)))

如果捕获组1为空,则捕获)捕获组5中的一个。(因此,这两个组之一将进行捕获)。

$5$2$1

将在组1或组5中捕获的支架移动到组2的另一侧。这具有将内环移动到外环的前端或末端的效果,具体取决于匹配的那一侧。


2

Stax v1.0.3 +,76 65 64 62 58 字节CP437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

解压缩后为70个字节,

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

在线运行和调试!

说明

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md是一个A((B)C)D分为四个部分并将其转换为的块A(B)(C)D

X!:Rx!:R在输入字符串上执行该块(步骤1),然后反射该字符串(Stax中的字符串反射是指将字符串反转再加上用(<[{/(to)替换(翻译))\}]>),然后在获得的字符串上执行块,然后将其反射回来(第2步)。第2步实质上是转换(A(B))(A)(B)

c.()z:r 删除所有空循环(步骤3)。

gp是一个生成器,可以找到迭代的固定点。在这种情况下,字符串将通过三步过程进行迭代,直到不再更改为止。

隐式输出。


1

Python 3中226个 223 212 206字节

好的,这是尝试以不支持递归正则表达式的语言解决此问题。

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

在线尝试!

编辑:

  • 重构[::-1]以节省6个字节,这要归功于Mr.Xcoder。

g函数是基本的构建块,它找到的出现((A)B),将其更改为(A)(B),然后将其自身应用于结果,直到不再可能进行转换为止。

主要步骤是:

  • g通常应用于输入。
  • 应用于g翻转的输入。此运行查找))A(B(反向输入中的出现,该输入可以有效地处理(A(B))
  • 删除任何出现的()

问题是,g控制结构非常糟糕,以至于试图将它单行处理会使其严重膨胀,因此我认为基于此解决方案不可能进行重大改进。

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.