Menu
Coddy logo textTech

Transformador de Dados

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 56 de 56.

O desafio final: remodelar um conjunto de dados em um relatório de resumo. Combine filtragem, mapeamento, agrupamento, tratamento de erros e definição de métodos em um único programa.

challenge icon

Desafio

Médio

O array students é fornecido. Cada entrada é um hash com :id, :grades (um array de inteiros, possivelmente vazio) e :subjects (um array de strings).

Defina um método transform_dataset(students) que retorne um hash com duas chaves:

  • :qualified_ids: um array ordenado dos :ids dos estudantes que possuem pelo menos uma nota e todas as notas estritamente acima de 70 (use all?).
  • :subject_counts: um hash mapeando cada disciplina cursada pelos estudantes qualificados para o número de estudantes qualificados que a cursam.

Se o array :grades de um estudante estiver vazio, ele não está qualificado, ignore-o silenciosamente.

Em seguida, chame o método e imprima:

  1. Os IDs qualificados unidos por , , prefixados com Qualified: . Se não houver nenhum, imprima Qualified: (none).
  2. Uma linha por disciplina (ordenada alfabeticamente) no formato <subject>: <count>.

Para o students padrão, a saída é:

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

Folha de consulta

Combine filtragem, mapeamento, agrupamento e formatação de saída em 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

Imprima os resultados com fallback e chaves ordenadas:

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? retorna false em arrays vazios — use any? primeiro para se proteger contra notas vazias.
  • Hash.new(0) inicializa chaves ausentes com 0, útil para contagem.
  • .sort em um hash retorna pares [key, value] ordenados alfabeticamente.

Experimente você mesmo

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), retornar { qualified_ids:, subject_counts: }
# TODO: imprimir IDs qualificados e contagem de disciplinas
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo