これは非常に簡単な言語定義です。
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桁の乗算のような単純な処理では、最適化なしですでに非常に遅くなります。
言語で記述された方法で入力を合理的に受け入れたり出力を生成したりできない言語を使用する場合は、それを可能にする任意の解釈を使用します。これは、言語が必要な動作を実装できない理由に適用されます。すべての言語が競争できるようにしたい。
最短のプログラムが勝ちます。標準の抜け穴が適用されます。