Menu
Coddy logo textTech

データトランスフォーマー

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 56/56。

最終課題では、データセットをサマリーレポートに再構成します。フィルタリング、マッピング、グルーピング、エラーハンドリング、およびメソッド定義を1つのプログラムに組み合わせます。

challenge icon

チャレンジ

中級

配列 students が与えられています。各エントリは :id:grades(整数の配列、空の場合あり)、および :subjects(文字列の配列)を持つハッシュです。

2つのキーを持つハッシュを返すメソッド transform_dataset(students) を定義してください:

  • :qualified_ids:少なくとも1つの成績を持ち、かつすべての成績が 70 を厳密に超えている(all? を使用)生徒の :id をソートした配列。
  • :subject_counts:対象となる生徒が履修している各科目を、その科目を履修している対象生徒の数にマッピングしたハッシュ。

生徒の :grades 配列が空の場合、その生徒は対象外(not qualified)として、静かにスキップしてください。

次に、メソッドを呼び出して以下を出力してください:

  1. 対象となるIDを , で連結し、先頭に Qualified: を付けたもの。対象者がいない場合は、Qualified: (none) と出力してください。
  2. 各科目ごとに1行ずつ(アルファベット順にソート)、<subject>: <count> の形式で出力してください。

デフォルトの students の場合、出力は以下のようになります:

Qualified: S1, S4
biology: 1
history: 1
math: 2
physics: 1

チートシート

Rubyでフィルタリング、マッピング、グループ化、および出力のフォーマットを組み合わせる:

def transform_dataset(students)
  qualified = students.select do |s|
    s[:grades].any? && s[:grades].all? { |g| g > 70 }
  end

  qualified_ids = qualified.map { |s| s[:id] }.sort

  subject_counts = Hash.new(0)
  qualified.each do |s|
    s[:subjects].each { |subj| subject_counts[subj] += 1 }
  end

  { qualified_ids: qualified_ids, subject_counts: subject_counts }
end

フォールバックとソートされたキーを使用して結果を出力する:

result = transform_dataset(students)

ids = result[:qualified_ids]
puts "Qualified: #{ids.any? ? ids.join(', ') : '(none)'}"

result[:subject_counts].sort.each do |subject, count|
  puts "#{subject}: #{count}"
end
  • all? は空の配列に対して false を返します。空の成績を防ぐために、まず any? を使用してください。
  • Hash.new(0) は存在しないキーを 0 で初期化します。カウントに便利です。
  • ハッシュに対して .sort を実行すると、アルファベット順にソートされた [key, value] のペアが返されます。

自分で試してみよう

students = [
  { id: "S1", grades: [85, 92, 78], subjects: ["math", "physics"] },
  { id: "S2", grades: [65, 80, 90], subjects: ["math", "biology"] },
  { id: "S3", grades: [],          subjects: ["art"] },
  { id: "S4", grades: [88, 95],    subjects: ["math", "biology", "history"] },
  { id: "S5", grades: [70, 75],    subjects: ["chemistry"] }
]

# TODO: def transform_dataset(students) を定義し、{ qualified_ids:, subject_counts: } を返す
# TODO: 条件を満たすID(qualified IDs)と科目ごとの数(subject counts)を出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン