水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

No.49 算数の宿題

回答

最初の回答(分岐が多すぎて嫌になった)
#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