るびらな!

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

ITP1_2_A Small, Large, or Equal

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

さてさて、AOJ第4日目。元気に行ってみましょー!

問題

大小関係

2つの整数 a, b を読み込んで、a と b の大小関係を出力するプログラムを作成して下さい。

Input
入力は空白で区切られた2つの整数 a, b から構成されています。

Output
a より b の方が大きければ

a < b

a より b の方が小さければ、

a > b

a と b が等しければ、

a == b

と出力して下さい。

なるほど、また数字は半角スペース区切りで、今度は順番を変える必要はなく

等号か不等号を書け、と… よし、ifかな。aとbの大小関係で場合分けしたらいいよね。

自分のコード

nums = gets.split(" ")
 
if nums[0].to_i<nums[1].to_i
    puts "a < b"
elsif nums[0].to_i==nums[1].to_i
    puts "a == b"
else
    puts "a > b"
end

そして、書いてみてから、最初の1行を

nums = gets.split.map(&:to_i)

と書くべきだったと反省。前回の学習が生きてませんね。


他の人のコード

一番短い人

相変わらず、一番短いのはelysion_halcyonさん。

a,b=gets.split.map &:to_i
puts"a #{%w(== > <)[a<=>b]} b"

2行! しかも、2行目はどういうことなの?!

あ、いや、うん。

比較演算子の最後に載ってましたね…

読み飛ばしてました。

確かに、こうすれば短いコードで表現できましたね。

一番長い人

またクラス作る系かー、と思ったけど、最後まで読んで納得。

class SmallLargeOrEqual
    def result(a, b)
        result_val = b - a
        if result_val > 0
            puts "a < b"
        elsif result_val < 0
            puts "a > b"
        else
            puts "a == b"
        end
    end
end
 
INPUT_LIMIT = 2
input = gets.split.map(&:to_i)
 
if input.length == INPUT_LIMIT
    SmallLargeOrEqual.new.result(input[0], input[1])
else
    puts "You must input only two parameter"   
end

数値が2個じゃなかった時のための例外を考えておくだなんて、

経験者(っぽい人/失礼!)は違うなー!

やっぱり、色々見ると勉強になります。

同じ方法論でスマートに書いてるっぽい人

私と基本の考え方は同じだけど、もっとスマートに書いてる人がこちら。

a = gets.split(" ").map! {|i| i.to_i}
print "a "
print "<" if a[0] < a[1]
print "==" if a[0] == a[1]
print ">" if a[0] > a[1]
print " b\n"

なるほどね。演算子だけを条件分岐で書いたのね。

こうすれば、共通部分は省略できていいねー。

case文をうまく使ってるっぽい人

a, b = gets.split.map(&:to_i)
c = case a <=> b
    when -1
      '<'
    when 0
      '=='
    when 1
      '>'
    end
puts "a #{c} b"

なるほど、「<=>」を使ってケースを分けて、

cに演算子を文字列として代入してるのね。

こういう方法もあるのかー。



なんか、他の人のコードを読むのが楽しみになってきましたね。

明日もがんばろうっと。