実装方法はたくさんある。
3つ例を挙げる。
たぶん、順当な感じの作戦。
"12*3+456&7|89"
のような入力文字列を
["12", "*", "3", "+", "456", "&", "7", "|", "89"]
のように分解する。
分解した結果の各要素を解釈する。
"*"
のようなものを解釈した結果は何にしてもいいんだけど、たとえばこんな感じ。
[12, :mul, 3, :add, 456, :and, 7, :or, 89]
今回の問題の異常な優先順位に合わせてひとつひとつ計算する。
ここでの戦略は、ヒント1に書いた通り、
という、ふたつの作戦がある。
正規表現を使うと、計算量は多くなるけどソースコードは短くなる。
文字列
"7|89"
を
eval("7|89")
を評価した結果の文字列
に置換する、という作業を優先順位の順に実行し、演算子がなくなったら終了。という感じ。
ヒント1には書かなかった作戦だけど、
12*3+456&7|89
を、
f(12)|f(3)&f(456)+f(7)*f(89)
と変換して、変換結果を eval したらそれでよくなるように関数
f
を定義する。
というか、関数 f が返す値のクラスを定義する。という手もある。
仕事ならおすすめしないけど、こういう場ならこれもあり。