問題.1
任意の3つの数値の合計を出力するメソッドを作りましょう。
ただし、同じ数が含まれている場合は
合計にカウントされません。
[自分の解答]
def lone_sum(array) uniq = [] array.each do |num| count = 0 array.each do |i| if num == i count += 1 end end if count == 1 uniq << num end end sum = 0 uniq.each do |u| sum += u end puts sum end
まずは与えられる引数(配列)の中に重複する値があるかを検証する。
重複する値が入るための空の配列を用意する。
次にeachメソッドを引数の配列に対して使用する。
この時に注意するのは配列の中で重複する値a[0]を他の値とも検証しないといけないという点である。
つまり、eachをこのeach文の中で再度使用しなければならない。
こうすることで、最初のeachでa[0]の検証を配列の数字全てに対して検証することができる。
重複していれば、count(変数)をふやす。
もちろん一番最初の値は絶対に重複するが、そのcountが1である場合のみ空の配列に加えるようにすれば、結果的に重複しない値のみが入るということになる。
あとは重複しない値が入った配列に対してeachを使って足して出力する。
[正答]
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
正答の問題と異なる点は重複する値のcountの条件分岐。
正答では、count < 2になれば空の配列に格納とある。
ここで注意する点は <= 2ではないこと。
つまりcountが2になった時点では空の配列に格納しないということ。
ここが初見で理解できなかった。
ぱっと見countが2になったら空の配列に加えるという文に見えてしまう。