yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY150>ドリルより uniqメソッド、injectメソッドを使う

\ Follow me!! /

●7/21(日)
●学習日数 150日
●学習時間(本日)4時間
●累計学習時間 726.5時間
●一日あたりの平均学習時間 4.88時間

問題

任意の3つの数値abcの合計を出力するメソッドを作りましょう。
ただし、同じ数が含まれている場合
合計にはカウントされません。

※わからない場合はAPIを利用して問題を解きましょう。
参考URL:https://ref.xaio.jp/ruby

出力例:
lone_sum(1, 2, 3) → 6
lone_sum(3, 2, 3) → 2
lone_sum(3, 3, 3) → 0

回答

ダサい解き方。15分以内にかっこよく解くやり方を導き出せず。

def lone_sum(a,b,c)
  if (a == b) && (a == c) && (b == c)
    puts 0
  elsif (a == b)
    puts (b + c)
  elsif (b == c)||(a == c)
    puts (a + b)
  else
    puts (a + b + c)
  end
end

*模範回答

def lone_sum(a,b,c)
  puts [a,b,c].uniq.inject{|s, n| s + n}
end

uniqについて

uniqメソッドは、配列の中で重複する要素を削除した新しい配列を返します。

arr = [1, 2, 5, 5, 1, 3, 1, 2, 4, 3]
p arr.uniq

#答え
[1, 2, 5, 3, 4]

injectについて

injectメソッドは、ブロックを使って繰り返し計算を行うのに使います。ブロックに順に「要素1、要素2」、「ブロックの前回の戻り値、要素3」、「ブロックの前回の戻り値、要素4」、...を渡します。メソッドの戻り値はブロックが最後に返した値になります。eachと同じような処理ができる。



参考文献

ref.xaio.jp