在前缀表示法中,运算符位于参数之前,因此您可以想象该运算符next()
会以递归方式调用。在后缀表示法中,运算符在参数之间移动,因此您可以简单地将其想象为解析树。在后缀表示法中,运算符位于参数之后,因此您可以将其想象为基于堆栈的。
用anyfix表示法,操作员可以在任何地方*。如果操作员出现并且没有足够的参数,则操作员将等待直到有足够的参数。对于这一挑战,您将实现一个非常基本的anyfix评估程序。(请注意,anyfix是我放弃的一种娱乐语言,您可以在此处试用或在此处查看)
您将需要支持以下命令:
(Arity 1)
- 重复
- 负
(Arity 2)
- 加成
- 乘法
- 相等:返回
0
或1
。
您可以选择对这些命令使用任何五个非空白符号。出于演示目的,我将使用"
重复项,×
乘法和+
加法。
对于文字,您仅需要支持非负整数,但是您的解释器必须能够包含所有整数(在您语言的(合理的)整数范围内)。
让我们来看一个示例:10+5
。该存储应表现为堆栈,而不是队列。因此,首先,堆栈从开始[]
,而排队的操作员列表从开始[]
。然后,对文字10
进行求值,从而使stack成为可能[10]
。接下来,对运算符+
进行求值,它需要两个参数。但是,堆栈上只有一个参数,因此排队的运算符列表变为['+']
。然后,对文字5
进行求值,从而使stack成为可能[10, 5]
。在这一点上,'+'
可以对运算符进行评估,使它成为堆栈[15]
和队列[]
。
最终的结果应该是[15]
为+ 10 5
,10 + 5
和10 5 +
。
让我们来看一个更困难的示例:10+"
。堆栈和队列从[]
和开始[]
。10
首先被评估,这使堆栈[10]
。接下来,+
对进行评估,它不会更改堆栈(因为没有足够的参数),并使队列成为['+']
。然后,"
进行评估。这样就可以立即运行,从而形成堆栈[10, 10]
。+
现在可以求值,以使堆栈成为[20]
和队列[]
。最终结果是[20]
。
操作顺序如何?
让我们来看看×+"10 10
。堆栈和队列都以[]
:
×
:堆栈未更改,队列变为['×']
。+
:堆栈未更改,队列变为['×', '+']
。"
:堆栈未更改,队列变为['×', '+', '"']
。10
:堆栈变为[10]
。即使×
应该是第一个要评估的运算符,因为它首先出现,但"
可以立即运行,并且没有运算符可以运行,因此可以对其进行评估。堆栈变为[10, 10]
并排队['×', '+']
。×
现在可以求值,这使堆栈[100]
和队列成为可能['+']
。10
:堆栈变为[100, 10]
,可以+
对其进行求值。堆栈变为[110]
并排队[]
。
最终结果是[110]
。
这些演示中使用的命令与anyfix语言的命令一致。但是,由于我的解释器中的错误,最后一个示例将无法正常工作。(免责声明:您的提交将不会在anyfix解释器中使用)
挑战
选择一组5个非空白非数字字符,并根据上述规范创建一个anyfix解释器。您的程序可以输出奇异数组或包含的值;确保值栈在执行结束时仅包含单个值,并且确保运算符队列在执行结束时为空。
这是代码高尔夫球,因此以字节为单位的最短代码获胜。
测试用例
对于这些测试用例,重复项为"
,否定为-
,加法为+
,乘法为×
且相等为=
。
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
规则
- 适用标准漏洞
- 如果您愿意,您可以带anyfix官方口译员并打高尔夫。期望失去可怕。
输入将以字符串形式给出,输出将以数组形式(单个整数)输出,而不是其中一个的字符串表示形式。您可以假设输入将仅包含空格,数字和您选择的5个字符。
* 实际上不是
0
和1
?
×+"10 10
在测试用例中或其他任何包含以下示例的示例中:1)使用空格,2)延迟使用重复运算符(我完全错过了两件事)。