gotagota日記

「面白きことは良きことなり」

『たのしいRuby 第4版』 第13章 配列(Array)クラス

第13章 配列(Array)クラス

模範解答はこちら

(1)

問題

1から100までの整数が昇順に並ぶ配列を作れ、という問題です。

私的解答
a = []
100.times { |i|
  a << i + 1
}
p a

模範解答にあるように to_a メソッドを使うのも簡単でいいですね。

(2)-1

問題

(1)の配列の各要素を100倍にした新しい配列を作れ、という問題です。

私的解答
a = (1..100).to_a
a2 = []
a.each do |i|
  a2 << i * 100
end
p a2

模範解答にあるように collect メソッドを使った方がより綺麗です。。。

(2)-2

問題

新しい配列を作らずに、(1)の配列の各要素を100倍にしろ、という問題です。

私的解答
a.each_with_index do |value, i|
  a[i] = value * 100
end
p a

同上。
なぜこのような書き方になったのか(笑)

(3)-1

問題

(1)の配列から3の倍数だけを取り出した新しい配列を作れ、という問題です。

私的解答
a = (1..100).to_a
a3 = []
a.each do |i|
  a3 << i if i % 3 == 0
end
p a3

3の倍数とは3で割って余りが0の数のことなので % を使えばいいですね。

(3)-2

問題

新しい配列を作らずに、(1)の配列を3の倍数だけ取り出した配列にしろ、という問題です。

#

a.delete_if {|i| i % 3 != 0 }
p a

私的解答で使った delete_if メソッドと、模範解答にある reject! メソッドは同じ動作をするが、その戻り値だけ異なる。
delete_if メソッドは常にレシーバ自身を返す。
reject! メソッドは削除が行われたときだけレシーバ自身を返し、変化がなかったときはnilを返す。
以上のような違いがあるので、使い方に気をつけたいです。

(4)

問題

(1)の配列を逆順に並べ替えろ、という問題です。

私的解答
a = (1..100).to_a
a.reverse!
p a

この問題はシンプルに reverse! メソッドを使いました。

(5)

問題

(1)の配列の総和を求めろ、という問題です。

私的解答
a = (1..100).to_a
sum = 0
a.each do |i|
  sum += i
end
p sum

模範解答とずばりでしたが、ブロックの扱いに気をつけたいです。
基本的には、一行で書けるときは可読性を上げる意味でも、 {} を使いたいですね。

(6)

問題

(1)の配列から、1~10,11~20,21~30といった具合に10個の要素を含む配列を10個取り出し、その配列を順番に別に配列に格納しろ、という問題です。

私的解答
ary = (1..100).to_a
result = Array.new
10.times do |i|
  result << ary[i*10, 10]
end
p result

ary[n, m]とすると、nは先頭のインデックスを指し、m は必要な要素数を指します。

(7)

問題

数値からなる配列 nums1 と nums2 に対して、それらの個々の要素を足しあわせた要素からなる配列を返すメソッド sum_array を定義しろ、という問題です。

例: p sum_array([1, 2, 3], [4, 6, 8]) #=> [5, 6, 11]

私的解答
def sum_array(nums1, nums2)
  result = []
  nums1.zip(nums2) do |a, b|
    result << a + b
  end
  result
end
p sum_array([1, 2, 3], [4, 6, 8])

zip メソッドを使うことで容易に作ることが出来ました。