プレフィックス表記では、演算子は引数の前に来るため、演算子next()
が再帰的に呼び出されることを想像できます。中置記法では、演算子は引数の間を行き来するので、単純に構文解析ツリーと考えることができます。後置記法では、演算子は引数の後に来るため、スタックベースと考えることができます。
anyfix表記では、演算子はどこにでも行くことができます*。演算子が表示され、十分な引数がない場合、演算子は十分な引数があるまで待機します。この課題のために、非常に基本的なanyfix評価器を実装することになります。(anyfixは、ここで遊んだり、ここでチェックしたりできるように放棄したレクリエーション言語であることに注意してください)
次のコマンドをサポートする必要があります。
(アリティ1)
- 複製する
- 負
(アリティ2)
- 添加
- 乗算
- 等式:
0
またはを返します1
。
これらのコマンドには、任意の5つの非空白記号を使用できます。デモンストレーションのために、"
複製、×
乗算、加算として使用し+
ます。
リテラルについては、負でない整数のみをサポートする必要がありますが、インタープリターはすべての整数(言語の(合理的な)整数範囲内)を含めることができる必要があります。
例を見てみましょう10+5
。ストレージは、キューではなくスタックとして動作する必要があります。最初に、スタックはから始まり[]
、キューに入れられた演算子リストはから始まり[]
ます。次に、リテラル10
が評価され、スタックが作成されます[10]
。次に、演算子+
が評価されます。これには2つの引数が必要です。ただし、スタックには引数が1つしかないため、キュー演算子リストはになり['+']
ます。次に、リテラル5
が評価され、スタックが作成されます[10, 5]
。この時点で、演算子'+'
を評価して、スタック[15]
とキューを作成できます[]
。
最終的な結果は、あるべき[15]
ために+ 10 5
、10 + 5
と10 5 +
。
より難しい例を見てみましょう10+"
。スタックとキューは[]
andで始まります[]
。10
最初に評価され、スタックが作成されます[10]
。次に、+
が評価されますが、これはスタックを変更せず(十分な引数がないため)、queueを作成します['+']
。次に、"
評価されます。これはすぐに実行できるため、スタックが作成されます[10, 10]
。+
これで、スタックが[20]
キューになるように評価できます[]
。最終結果は[20]
です。
操作の順序はどうですか?
を見てみましょう×+"10 10
。スタックとキューは両方とも次のように開始します[]
。
×
:スタックは変更されず、キューは['×']
ます。+
:スタックは変更されず、キューは['×', '+']
ます。"
:スタックは変更されず、キューは['×', '+', '"']
ます。10
:スタックはになり[10]
ます。にもかかわらず×
、それが最初に表示されますので、最初の演算子が評価されるようにする必要があり、"
それが評価されるので、すぐに実行しないと演算子のどれもそれができる前にすることができます。スタックがに[10, 10]
なり、キューになります['×', '+']
。×
これで評価できるようになり、スタック[100]
とキューが作成されます['+']
。10
:スタックはになり[100, 10]
、+
評価できるようになります。スタックがに[110]
なり、キューになります[]
。
最終結果は [110]
です。
これらのデモで使用されるコマンドは、anyfix言語のコマンドと一致しています。ただし、最後の例は、インタープリターのバグが原因で機能しません。(免責事項:あなたの提出物はanyfixインタープリターでは使用されません)
チャレンジ
5つの空白以外の数字以外の文字のセットを選択し、上記の仕様に従ってanyfixインタープリターを作成します。プログラムは、特異配列またはそれに含まれる値を出力できます。値のスタックには実行の終了時に単一の値のみが含まれ、演算子のキューは実行の終了時に空になることが保証されています。
これはコードゴルフなので、バイト単位の最短コードが勝ちです。
テストケース
これらのテストケースでは、duplicate is "
、negative is -
、加算is +
、乗算is ×
、および等式is =
です。
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)重複演算子の使用の遅延(完全に見逃した2つのこと)などの例を含める必要があります。