前書き
Forteは、数値の値を変更するという概念に基づいた非常に特殊な難解な言語です。Forteの数値は定数ではなく変数であるため、LET
命令を使用して新しい値を割り当てることができます。
たとえば、実行した後LET 2=4-1
に、今から2
の値を前提としてい3
た値がいつでもあることを意味、2
それは代わりで「置き換え」された表現で起動しますが3
。これで式(1+1)*2
はに評価され9
ます。
Forteのこの命令は、情報の保存とフロー制御の両方に使用されます(行には番号が付けられ、番号の値を変更することで実行順序を決定できます)。この課題では、この2番目の側面を扱いません。
チャレンジ
ForteのLET
式の簡略化されたサブセット用のインタープリターを作成する必要があります。
入力として、この文法に続く一連の行を受け取ります。
<line>::= <number>=<expression>
<expression>::= <number>|<expression>+<number>
注:この文法は、行番号、LET、および括弧(常に必須)がないため、有効なForteではありません。
つまり、合計の計算と数値への値の割り当てのみを処理する必要があります。括弧は入力に存在せず、各式は左から右に評価する必要があります:部分的な結果は再定義の影響を受けることに注意してください!
数値は常に、使用している言語のネイティブ整数型の制限(または2 ^ 32のいずれか大きい方)までの負でない整数になります。
各行について、式の結果を出力し、この結果を最初の数値の(場合によっては再割り当てされた)値に割り当てる必要があります。これは、後続の行の解釈方法に影響します。
これはcode-golfで、最短のコード(バイト単位)が勝ちです!
その他の規則
- 入力形式は柔軟です。たとえば、改行を含む単一の文字列、文字列のリスト、数値のリストのリストを使用できます...入力。
- 関数、完全なプログラム、またはソリューションをサブミットして、REPL環境で実行し、各行に対して1回呼び出すことができます。
- 標準的な抜け穴は禁止されています。特に、コード内で外部のForteインタープリターを呼び出すことはできません。
例
これらはすべて同じ入力の一部です。各行の後に、その行に関連する予想される出力が表示されますが、関連する再割り当てを示すコメントが表示される場合もあります(必要な出力の一部ではありません)。
5=4
4
6=5
4 # 5 -> 4
7=1+2+5
7
7=5+2+1
4 # Order of operations matters! 5+2 -> 4+2 -> 6 -> 4
18=5+6+7
12
5=3
3 # Remember: 5 -> 4
10=6+4
3 # 6 -> 4 -> 3, 3+3 = 6 -> 3
0
は有効です(「数値は常に非負の整数です」)
0
有効な番号は?