这是一个非常简单的语言定义:
A Variable is any string that does not contain ^, <, >, !, or ?
The empty string is a valid variable identifier
The value of every variable starts at 0.
A Statement is one of (var is a Variable, P is a Program):
var^ -> changes var to be equal to 1 more than itself
var<P> -> while var > 0, changes var to be equal to 1 less than itself, then runs P
var! -> output value of var
var? -> ask for non-negative integer as input, increase var by that value
A Program is a concatenation of Statements, running a Program means running each Statement in order
示例程序(请注意,空字符串是一个变量,但是为了清楚起见,我将谨慎使用它,并且某些变量在默认情况下通常为0时会在程序中清零):
<>: sets the value of the empty string variable to 0
b<>b?b<a^>: asks for b, then adds the value stored in b to a, zeroing b in the process
b<>b?a<>b<a^>: asks for b, then sets a to the value of b, zeroing b in the process
a<>c<>b<a^c^>c<b^> : copies the value in b into a without zeroing it
b<>c<>a<c^c^c<b^>>b! : outputs a multiplied by 2
b^b<a<>a?a!b^> : outputs what you input, forever
您的目标是为此语言编写最小的解释器。
从理论上讲,变量的值可以任意大,并且仅受语言可以访问的总内存的限制,但是您仅需要处理最大2 ^ 256的值。
从理论上讲,您的程序应该能够处理任意长的程序,但是您只需要处理2 ^ 32个字符以下的程序即可。您还需要处理深度最大为2 ^ 32的嵌套循环。
您可以假定该程序是有效程序,并且要求输入时只会得到非负整数。您还可以假定输入字符串中仅包含ASCII可打印字符。
您解释的程序的速度无关紧要,对于诸如5位数乘法这样的简单事情,如果没有优化,它的速度已经非常缓慢。
如果您要使用一种无法合理接受输入或无法以该语言描述的方式产生输出的语言,请使用任何可能的解释。这适用于您的语言无法实现某些必需行为的任何原因。我希望所有语言都能竞争。
最短的程序获胜。有标准漏洞。