1+ # * EJERCICIO:
2+ # * Explora el concepto de funciones de orden superior en tu lenguaje
3+ # * creando ejemplos simples (a tu elección) que muestren su funcionamiento.
4+ # Doc: https://medium.com/@jeffcoh23/eloquent-ruby-achieving-higher-order-functionality-933267a01f36
5+ # https://www.rubyguides.com/2016/02/ruby-procs-and-lambdas/
6+ # Ruby hasn't Higher Order Functions, but it has blocks, procs and lambdas.
7+
8+ # pass a lambda to a method
9+ def add_stuff ( a , b , my_lambda )
10+ c = a + b
11+ my_lambda . call ( c )
12+ end
13+ example_lambda = lambda { |c | puts "The sum is #{ c } " }
14+ add_stuff ( 1 , 2 , example_lambda )
15+
16+ def multiply_stuff ( a , b , my_proc )
17+ c = a * b
18+ my_proc . call ( c )
19+ end
20+ multiply_stuff ( 2 , 3 , -> ( c ) { puts "The product is #{ c } " } )
21+
22+ def divide_stuff ( a , b , &block )
23+ c = a / b
24+ block . call ( c )
25+ end
26+
27+ divide_stuff ( 6 , 3 ) { |c | puts "The division is #{ c } " }
28+
29+ # * DIFICULTAD EXTRA (opcional):
30+ # * Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
31+ # * lista de calificaciones), utiliza funciones de orden superior para
32+ # * realizar las siguientes operaciones de procesamiento y análisis:
33+ # * - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
34+ # * y promedio de sus calificaciones.
35+ # * - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
36+ # * que tienen calificaciones con un 9 o más de promedio.
37+ # * - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
38+ # * - Mayor calificación: Obtiene la calificación más alta de entre todas las
39+ # * de los alumnos.
40+ # * - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
41+
42+ # students = [
43+ # { name: 'Alice', birthdate: '1990-01-01', grades: [9, 8, 7, 10, 9] },
44+ # { name: 'Bob', birthdate: '1991-01-01', grades: [8, 7, 6, 9, 8] },
45+ # { name: 'Charlie', birthdate: '1992-01-01', grades: [7, 6, 5, 8, 7] },
46+ # ]
47+
48+ students = [ :name => 'Alice' , :birthdate => '1990-01-01' , :grades => [ 9 , 8 , 9 , 10 , 9 ] ] +
49+ [ :name => 'Bob' , :birthdate => '1991-01-01' , :grades => [ 8 , 10 , 6 , 9 , 5 ] ] +
50+ [ :name => 'Charlie' , :birthdate => '1992-01-01' , :grades => [ 7 , 6 , 5 , 8 , 7 ] ]
51+
52+ def average_grades ( grades )
53+ grades . sum / grades . length
54+ end
55+
56+ puts "Average grades:"
57+ puts students . map { |student | "#{ student [ :name ] } : #{ average_grades ( student [ :grades ] ) } " }
58+
59+ puts "Best students:"
60+ puts students . select { |student | average_grades ( student [ :grades ] ) >= 9 } . map { |student | student [ :name ] }
61+
62+ puts "Youngest students:"
63+ puts students . sort_by { |student | student [ :birthdate ] } . map { |student | student [ :name ] } . reverse
64+
65+ puts "Highest grade:"
66+ puts students . map { |student | student [ :grades ] . max } . max
0 commit comments