def lone_sum(ary)
# 配列から、重複しない要素のみ取り出す
uniq_nums = []
ary.each do |num|
count = 0
ary.each do |i|
if num == i
count += 1
end
end
if count < 2
uniq_nums << num
end
end
# uniq_nums配列内の合計
sum = 0
uniq_nums.each do |unique_num|
sum += unique_num
end
puts sum
end
lone_sum([3, 2, 3]) # 出力結果→2
lone_sum([3, 2, 1]) # 出力結果→6
3〜14行目で重複しない値のみ取り出す処理を、
17〜20行目で重複しない値のみになった配列内の合計を求める処理を行っている。
たとえば、lone_sum([3, 2, 3])でメソッドを呼び出した場合を考えてみて!。
この場合、4行目で最初にnum=3となる。その後6行目でi=3, 2, 3となり、
それぞれに対してnum=iとなったとき、つまり重複したときにcountが増えるようになる。
そして11行目で重複した値が1つのときだけuniq_nums配列に値を追加している。
num=3のときはcount=2となるのでuniq_nums配列に値は追加されない。
これを後2回繰り返した結果、uniq_nums配列には2だけが追加される。
そして18行目以下でuniq_nums配列内の合計を求める。
この場合、sum = sum + 2、つまりsum = 0 + 2となります。最終的に合計は2と出力される。
※↓別のやり方
def lone_sum(numbers)
numbers
.tally
.filter_map { |number, count| number if count == 1 }
.sum
end
lone_sum([3, 2, 3]) #=> 2
lone_sum([3, 2, 1]) #=> 6