Mejores estudiantes
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 53 de 56.
Método final, encuentra a todos los estudiantes cuya calificación promedio esté por encima de cierto umbral.
Este es su pipeline de datos a plena potencia: iterar, filtrar por un valor derivado, devolver nombres.
Desafío
IntermedioAñade un método top_students(threshold) que devuelva un array de nombres cuya calificación promedio sea mayor que threshold. Reutiliza average_grade internamente, no vuelvas a calcular las matemáticas. Omite a los estudiantes sin calificaciones (su promedio es 0 y no superarán ningún umbral positivo).
Los nombres deben aparecer en el orden de inserción; si nadie califica, devuelve [].
Reemplaza el bloque de prueba con:
add_student("Alice", 20, ["Math"])
add_student("Bob", 22, ["Biology"])
add_student("Cara", 19, ["Physics"])
add_grade("Alice", 90)
add_grade("Alice", 85)
add_grade("Bob", 70)
add_grade("Cara", 60)
puts top_students(80).inspect
puts top_students(50).inspect
puts top_students(100).inspectLa salida esperada termina con:
["Alice"]
["Alice", "Bob", "Cara"]
[]Hoja de referencia
Usa top_students(threshold) para filtrar a los estudiantes por su calificación promedio, reutilizando average_grade:
def top_students(threshold)
$students
.select { |s| average_grade(s[:name]) > threshold }
.map { |s| s[:name] }
endLos estudiantes sin calificaciones devuelven 0 desde average_grade y son excluidos naturalmente por cualquier umbral positivo.
Pruébalo tú mismo
$student_records = {}
def add_student(name, age, courses)
if $student_records.key?(name)
puts "Student '#{name}' already exists."
return
end
$student_records[name] = { age: age, grades: [], courses: courses }
puts "Student '#{name}' added."
end
def add_grade(name, grade)
unless $student_records.key?(name)
puts "Student '#{name}' not found."
return
end
$student_records[name][:grades] << grade
puts "Grade #{grade} added for '#{name}'."
end
def average_grade(name)
unless $student_records.key?(name)
puts "Student '#{name}' not found."
return nil
end
grades = $student_records[name][:grades]
return 0 if grades.empty?
grades.sum.to_f / grades.length
end
def list_by_course(course)
$student_records.select { |_, info| info[:courses].include?(course) }.keys
end
# TODO: def top_students(threshold), nombres cuyo average_grade > threshold
add_student("Alice", 20, ["Math"])
add_student("Bob", 22, ["Biology"])
add_student("Cara", 19, ["Physics"])
add_grade("Alice", 90)
add_grade("Alice", 85)
add_grade("Bob", 70)
add_grade("Cara", 60)
puts top_students(80).inspect
puts top_students(50).inspect
puts top_students(100).inspect
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline