名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

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