るびらな!

RubyをLearnする人の勉強記録。(超)弩(級の)素人なので、誰かダメさがわかる人に罵ってもらったりして、少しずつ知見を広げたいと思っています。

ITP1_4_C Simple Calculator@Ruby

ここも押していただけると嬉しいです #=> にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ Rubyへ にほんブログ村 IT技術ブログ Ruby on Railsへ

さて、今日も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使ってメモリ食ってそうだけど…

うーん…

evalを使った最短のコードを書いた人

p eval$_ while !gets[??]

ワンライナーすごい!

でも、今回のは何となく読めます。だんだん自分も進歩してきたってことかな??

感想

今回の問題は、evalを知っているかどうかで大きく違いましたね。

色んなメソッドを知っておくことって大事だなぁ。