Quylthulg是Chris Pressey 编写的一种语言,它试图通过使用panfix来解决中缀表示法的问题:
像postfix一样,panfix不需要部署神秘的设计(例如括号)来覆盖默认的运算符优先级。同时,panfix允许以与infix相同的顺序和方式来指定术语,这对于已经习惯infix的人来说无疑是一种自然而直观的表示法。
如何获得前缀表示法的便利性以及前缀或后缀的明确性?当然,全部使用这三个!
=y=+*3*x*+1+=
更正式,更+
是运营商,并a
和b
是表达式。然后(a+b)
是一个有效的(带括号)中缀表达式,该表达式的panfix表示为+a+b+
,其中并置表示串联。
您的目标是获取一个panfix字符串并将其转换为带括号的后缀:
(y=((3*x)+1))
为简单起见,我们将进行以下更改:
- 运算符只能由两个唯一的字符组成(您可以选择任何一个,但是在这里我将使用
*
和+
)。 - 只有一个文字,它由另一个不同的字符组成(您可以选择任何一个,但在这里我将使用
_
)。 - 输入将是格式正确的panfix表达式。
对于复杂性,我们将进行以下更改:
- 运算符可以包含任意数量的正字符,而不仅仅是一个。
这使挑战变得更加棘手,因为您无需确定字符串的其余部分就不必确定给定的操作符子字符串的分区方式。
这是挑战的参考实现,由@ user202729提供。
测试用例
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
我使用此程序生成了针对此挑战的中缀字符串(转换为panfix很简单,但不可逆转)。
**_**_**_*_****_*
。我测试过的答案都没有通过这个答案。
(_ + _)
吗?