ITP1_4_C Simple Calculator@Ruby
さて、今日もAOJをRubyで解いていきましょう!
今日の問題はこちら #=> 単純計算器 | プログラミング入門 | Aizu Online Judge
問題
計算機
2つの整数 a, b と1つの演算子 op を読み込んで、a op b を計算するプログラムを作成して下さい。ただし、演算子 op は、"+"(和)、"-"(差)、"*"(積)、"/"(商)、のみとし、割り算で割り切れない場合は、小数点以下を切り捨てたものを計算結果とします。
Input
入力は複数のデータセットから構成されています。各データセットの形式は以下のとおりです:
a op b
op が '?' のとき 入力の終わりを示します。このケースの出力は行ってはいけません。
Output
各データセットについて、計算結果を1行に出力して下さい。
Constraints
- 0 ≤ a, b ≤ 20000
- 0 による割り算が与えられることはありません。
なるほど、入力された式を計算して返す、と。
これも、ちゃんとメソッド知ってるかどうかっていうテストみたいな感じですね。
とか偉そうに言ってますが、この問題を楽に解く方法を考えてググってみるまで知りませんでした。
その恥を曝して、勉強した形跡って言うことにしておこうと思います。
自分のコード①
というわけで、何も調べずに書いたコードがこちら。
while true a,op,b = gets.split.map(&:to_s) case op when "?" then break when "+" then puts a.to_i + b.to_i when "-" then puts a.to_i - b.to_i when "*" then puts a.to_i * b.to_i when "/" then puts a.to_i / b.to_i else break end end
aとopとbをgetsしたら、opで場合分けしてやってみたら簡単なんじゃね?と思ったわけです。
実行速度もまぁまぁでした。
自分のコード②
調べたら、evalというメソッドがあるらしいということを知り、
それを取り入れて書いたコードがこちら。
while true s = gets.chomp break if s.include?("?") puts eval(s) end
すっごくシンプルでいい感じになりました。
他の人のコード
実行速度が最速だった人
answers = Array.new while true exp = gets.split(" ") break if exp[1] == "?" answer = exp[0].to_i + exp[2].to_i if exp[1] == "+" answer = exp[0].to_i - exp[2].to_i if exp[1] == "-" answer = exp[0].to_i * exp[2].to_i if exp[1] == "*" answer = exp[0].to_i / exp[2].to_i if exp[1] == "/" answers.push answer end answers.each{|ans| puts ans }
あれ、これ最速なの??
Array使ってメモリ食ってそうだけど…
うーん…