回答
最初の回答(分岐が多すぎて嫌になった)
#61464 No.49 算数の宿題 - yukicoder
書き直した方(最初のものに比べ分岐が減ったうえ,コード長が半分になってすっきり)
#61799 No.49 算数の宿題 - yukicoder
追記
よく考えたらresいらねえじゃんって気がついたやつ
#62018 No.49 算数の宿題 - yukicoder
書き直した方の回答で.
まず,出現した計算記号と数値を別々にリストに入れます.
リストに入れるタイミングとしては,計算記号が出た時としたほうが楽だと思います.
最後の数値だけは,最後の計算記号が出た後に生成されるので,別途リストに入れます.
で,ここから,for文を用いて前から計算記号を見つつ,数値を計算していきます.
回答の初期値を数値のリストの先頭にしておくと,計算しやすいと思います.
ここfor文でまとめられるな,と気がついたのは,数値と記号のリストの長さが1しか変わらないこと.
例えば,
2*3+5
であれば,計算記号のリスト長が2,数値のリスト長が3になる.なので,上手いこと使えないかなーと考えた結果の回答がこれです.
分岐を増やすとテスト項目が増えてしかたがないので,基本的には分岐減らして簡潔に書いていきたいですね….
nums = [] marks = [] line = gets.chomp num = 0 for c in line.split(//) do if c == "*" or c == "+" marks.push(c) nums.push(num) num = 0 else num = num * 10 + c.to_i end end nums.push(num) res = nums[0] for i in 0...marks.length do if marks[i] == "*" res += nums[i+1] else res *= nums[i+1] end end puts res