あなたが私の新しいスタックベースの言語を実装する時間です!StackyMathと呼ばれます。これは、スタック上の8つの操作とスタックに番号を追加する方法を備えたスタックベースの言語になります。
操作のリスト:
/
:部門。スタックの上位2桁で実行されます。結果をスタックにプッシュします。*
:乗算。スタックの上位2桁で実行されます。結果をスタックにプッシュします-
:減算。スタックの上位2桁で実行されます。結果をスタックにプッシュします+
:追加。スタックの上位2桁で実行されます。結果をスタックにプッシュします^
:べき乗。スタックの上位2桁で実行されます。結果をスタックにプッシュします%
:モジュロ。スタックの上位2桁で実行されます。結果をスタックにプッシュします!
:階乗。スタックの一番上の番号で実行されます。結果をスタックにプッシュしますD
:スタックの一番上の番号を複製します
擬似コードで定義された操作:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
数字をスタックにプッシュする方法:
スタックに番号を追加するのは簡単です。必要な場所にプログラムに生の番号を入れるだけです。スタックに複数の数字を配置する必要がある場合は、コンマ(,
)で区切ることができます。あなたのプログラムは-
入力の数字を処理する必要はありません。ユーザーが数字を望むなら、否定したい数字、ゼロ、-
。プログラムの入力の数値も正の整数に制限されます。
入力:
プログラムは、コマンドラインで入力するか、標準入力から入力する必要があります。入力は,
、必要に応じて区切られた数字(科学表記法または小数なし)と上記で定義された操作のみで構成されます。
出力:
プログラムは、スタックの一番上に番号を印刷する必要があります。
エラーの場合:
- プログラムがスタックをオーバーポップしようとする場合、印刷する必要があります
StackUnderflowException!!!
。 - ゼロによる除算がある場合は、印刷します
DivisionByZeroException!!!
- プログラムの実行中または入力内の数値の処理中に、64ビットを超える数値の場合、印刷
NumberOverflowException!!!
- どういうわけか、スタックの一番上の負の数を取得し、階乗を行う必要がある場合、印刷
NegativeFactorialException!!!
- スタックの最上部に浮動小数点数があり、次の演算が階乗である場合、印刷
FloatingFactorialException!!!
- プログラムの終了時にスタックに数字がない場合(つまり、プログラムが空だった場合)
EmptyProgram!!!
ノート:
- へのすべてのエラー出力は、yo std errまたは最も近い同等のものになるはずです。
- すべての数値は64ビット浮動小数点に制限されます。
サンプルプログラム:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(必要に応じて追加できます)
654,489,48,43/5*7D+-*%
返す必要があります77.6875
。(43/48*5-(7+7)
なければならない(7+7)-43/48*5
)
!
を除くF
)。