本題
今回は第13章の練習問題を解いていく。それでは早速解いてみる。
(1) 1~100までの整数が昇順に並ぶ配列aを作れ。
a=[]
for i in 1..100
a<<i
end
aという空の配列に1~100まで詰め込んでいくようにした。
(2) (1)で作成した要素全てを100倍にした配列a2を作成せよ。また、新しい配列を作成せずに、全ての要素を100倍にした要素に置き換えよ。
a=[]
for i in 1..100
a<<i
end
a2=a.map{|i| i * 100}
p a2
#実行結果:[100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000]
mapメソッドで別の要素に置き換えた。
a=[]
for i in 1..100
a<<i
end
a.map!{|i| i * 100}
p a
#実行結果:[100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 3000, 3100, 3200, 3300, 3400, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000]
mapの後に!を付けてレシーバの配列を変更するメソッドを使いました。mapの部分はcollectでも良いと思います。
(3) (1)の配列から3の倍数だけを取り出した新しい配列a3を作れ。また、新しい配列を作らずに3の倍数以外の数を削除せよ。
a=[]
for i in 1..100
a<<i
end
a3 = a.select{|i| i % 3 == 0}
#確認のため出力してみる
p a3
#実行結果:[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
Enumerableモジュールの中のselectメソッドを使ってみた。find_allでも同じ挙動する。
a=[]
for i in 1..100
a<<i
end
a.delete_if{|i| i % 3 != 0}
p a
aの配列から3の倍数以外を削除しろという事なので、3で割り切れないものを削除するようにした。
(4) (1)の配列を逆順に並べ換えろ。
(5) (1)の配列に含まれる整数の和を求めよ。
(4と5はそこまで難しくないので一緒にします)
a=[]
for i in 1..100
a<<i
end
#(5)のコード
p a.sum
#実行結果:5050
#(4)のコード
a.reverse!
p a
#実行結果:[100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
reverseメッソド,sumメソッドを使うだけでした。
(6) 1~100の整数を含む配列aryから、1~10,11~20,21~30というように10個の要素を含む配列を10個取り出します。それを全て配列resultに格納せよ。
ary = [*1..100]
result = Array.new
10.times do |i|
result<<ary.slice!(0,10)
end
#出力して確認してみる
p result
#実行結果:[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], [41, 42, 43, 44, 45, 46, 47, 48, 49, 50], [51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67, 68, 69, 70], [71, 72, 73, 74, 75, 76, 77, 78, 79, 80], [81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]]
slice!を使い指定した範囲を取り出し、それを一つの要素として配列resultに入れた。
(7) 数値からなる配列nums1とnums2に対して、それらの個々の要素を足し合わせた要素からなる配列を返すメソッドsum_arrayを定義せよ。
def sum_array(nums1,nums2)
result=Array.new
nums1.zip(nums2)do |a , b , c|
result << a + b
end
return result
end
#確認のため実行してみる
p sum_array([8,1,2] , [5,7,4])
#実行結果:[13, 8, 6]
zipメソッドで処理させた。
最後に
今回は配列の操作がメインの内容だった。Enumerableモジュールには色々なメソッドがあるようなので、上手く扱っていきたい。
本自体は読み終わっているので、このまま継続して記事を出していこうと思います。