デイトラのロゴ

Webアプリ開発コース初級編

WEBサイトとミニアプリを作れるようになろう

DAY 36
Rubyの練習問題(解答編)

DAY31(問題編)の解答編です!


TIPS

01.問題1の解答

複数の数字が与えられるので、その数字を足した数字をsumメソッドを使って出力してください。

numbers = [1235]
puts numbers.sum

# 出力値
# 11


【解説】
配列に対してsumメソッドを使用すると、その配列内の数字を合計した数を計算してくれます!

02.問題2の解答

3つの数字が与えられるのでその数字を掛け算した値を出力してください。

numbers = [822]
puts numbers[0* numbers[1* numbers[2]

# 出力値
# 32


【解説】
numbersに代入された配列をそれぞれ取得して掛け算し、putsを使って値を出力できればOKです!

03.問題3の解答

複数の数字が与えられるので、その数字を掛け算した値を出力してください。
この時、eachを使用してください。

numbers = [82520]

answer = 1
numbers.each do |num|
  answer *= num
end

puts answer

# 出力値
# 1600


【解説】
numbersに代入された配列の数字をeach文でループさせてnumに代入します。
ループするたびにanswerにnumを掛けると、ループ終了後にはanswerに数字を掛け算した結果が代入されています。
最後にanswerをputsで出力すると、掛け算した値が出力されています。

04.問題4の解答

複数人のテストの点数のスコアが与えられるので、その平均値をeachを使ってすべて出力してください。

scores = [
  [
101122],
  [
291131]
]
scores.each do |score|
  puts score.sum / score.size
end

# 出力値
# 14
# 11


【解説】
scoresに代入された配列内の配列をeach文でループさせてscoreに代入します。
scoreには[10, 11, 22]のように配列が入るので、sumメソッドを使って合計を、sizeメソッドを使って配列の要素数を計算してあげます。
合計を要素数で割ると平均が出るので、それをputsで出力できればOKです。

05.問題5の解答

数字のみが入った配列([1, 2, 345, 346, 299])を引数として、その配列の最大値と最小値を配列で返すメソッドmax_and_minを定義し、値を出力してください。

def max_and_min(array)
  p [array.maxarray.min]
end
max_and_min([12345346299])

# 出力値
# [346, 1]


【解説】
まず、引数を持つmax_and_minメソッドを定義してあげます。
解答例ではarrayとしていますが、好きな引数名で問題ありません。
メソッド内では、配列の最大値を取得するmaxメソッドと、配列の最小値を取得するminメソッドを使用します。
取得した値を配列にしてあげて配列をそのまま出力できるpメソッドで出力すると、出力値のように出力できます。

メソッドは、解答のようにメソッド名(引数)としてあげることで使用できます。

06.問題6の解答

2つの文字列が配列で与えられるので、その文字列が一致している場合は、TRUE一致していない場合は、FALSEと出力するメソッドcompare_strを定義してください。

def compare_str(str)
  if str[0== str[1]
    puts 'TRUE'
  else
    puts 'FALSE'
  end
end

str = ['aaa''bbb']
compare_str(str# 出力値 FALSE

str = ['aaa''aaa']
compare_str(str# 出力値 TRUE


【解説】
まず、引数を持つcompare_strメソッドを定義してあげます。
メソッド内では、配列内の文字列が一致するかどうかをif文で判定してあげます。
一致しているという条件をifの後ろに書き、その場合はTRUE、そうでない場合はFALSEと出力できるようにすると、出力値のように出力できます。

07.問題7の解答

特定の文字が与えられます。
その文字列に、?が含まれている場合、"疑問文"と出力するメソッドquestion_strを定義してください。

def question_str(str)
  puts '疑問文' if str.include?('?')
end

str = 'こんにちは'
question_str(str)
puts "----------"
str = 'こんにちは?'
question_str(str)
# 出力値
# ----------
# 疑問文


【解説】
まず、引数を持つquestion_strメソッドを定義してあげます。
メソッド内では、includeメソッドを使用して、文字列の中に「?」が含まれるかどうかを判定してあげます。
if文を後ろに書いているのは後置ifという書き方です。
今回は文字列が「?」を含んでいない場合に何もしないので、後置ifを使って短く書いています。

1回目のquestion_strメソッド使用時には「?」が含まれないので何も出力されません。
一方、2回目のquestion_strメソッド使用時には「?」が含まれるので、「疑問文」が出力されます。

08.問題8の解答

文字列がメールアドレス(●●●@△△△.■■■)の場合にのみ、そのメールアドレスを出力するメソッドputs_emailを定義してください。
メールアドレスの正規表現を検索してメソッド内で使ってみましょう!

def puts_email(str)
  puts str if str.match(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i)
end

str = 'aaa@gmail.com'
puts_email(str# 出力される


【解説】
まず、引数を持つputs_emailメソッドを定義してあげます。
メソッド内では、matchメソッドを使用して、メールアドレスの正規表現に沿った文字列になっているかを判定しています。
matchメソッドを使用するのは、引数として渡した正規表現にマッチした文字列を取得できるためです。

09.問題9の解答

名前の情報が保存されている配列が存在します。
その配列には、以下のように氏名が保存されています。
[{first_name: 'taro', family_name: 'sato'}, {first_name: 'rika', family_name: 'yamada'}]

すべての氏名を「氏 -> 名」の順番につなげて順番に出力してください。
また、出力する際は、名前同士の間に ", " を入れて1つの文字列として出力してください。

names = [
  { 
first_name: 'taro'family_name: 'sato' },
  { 
first_name: 'rika'family_name: 'yamada' }
]
formatted_names = names.map do |name|
  "#{name[:family_name]} #{name[:first_name]}"
end
puts formatted_names.join(', ')

# 出力値 sato taro, yamada rika


【解説】
mapメソッドを使うと新しい配列を返してくれるので、行数が少なくなります。
そのため、今回はmapメソッドを採用しましたが、eachメソッドを使用しても構いません。

mapメソッド内ではnameという変数に配列内のハッシュが代入されます。
そのハッシュ内の値をそれぞれ取得するため、name[:family_name]のようにキーを使ってあげます。
これでformatted_namesには["sato taro", "yamada rika"]という配列が入りました。
ここで、joinメソッドを使用して配列内の文字列を連結してあげます。
この時、引数に指定した文字列があるとその文字列が配列の各要素の間に入るので、出力値の名前の間にカンマが出力されます。