1
+ import Foundation
2
+
3
+ /*
4
+ * EJERCICIO:
5
+ * Explora el concepto de funciones de orden superior en tu lenguaje
6
+ * creando ejemplos simples (a tu elección) que muestren su funcionamiento.
7
+ *
8
+ * DIFICULTAD EXTRA (opcional):
9
+ * Dada una lista de estudiantes (con sus nombres, fecha de nacimiento y
10
+ * lista de calificaciones), utiliza funciones de orden superior para
11
+ * realizar las siguientes operaciones de procesamiento y análisis:
12
+ * - Promedio calificaciones: Obtiene una lista de estudiantes por nombre
13
+ * y promedio de sus calificaciones.
14
+ * - Mejores estudiantes: Obtiene una lista con el nombre de los estudiantes
15
+ * que tienen calificaciones con un 9 o más de promedio.
16
+ * - Nacimiento: Obtiene una lista de estudiantes ordenada desde el más joven.
17
+ * - Mayor calificación: Obtiene la calificación más alta de entre todas las
18
+ * de los alumnos.
19
+ * - Una calificación debe estar comprendida entre 0 y 10 (admite decimales).
20
+ */
21
+
22
+ // Ejemplos simples de funciones de orden superior
23
+
24
+ // 1. Map: Transforma cada elemento de una colección
25
+ let numbers = [ 1 , 2 , 3 , 4 , 5 ]
26
+ let squaredNumbers = numbers. map { $0 * $0 }
27
+ print ( " Números al cuadrado: \( squaredNumbers) " )
28
+
29
+ // 2. Filter: Filtra elementos de una colección basado en una condición
30
+ let evenNumbers = numbers. filter { $0 % 2 == 0 }
31
+ print ( " Números pares: \( evenNumbers) " )
32
+
33
+ // 3. Reduce: Combina todos los elementos de una colección en un único valor
34
+ let sum = numbers. reduce ( 0 , + )
35
+ print ( " Suma de números: \( sum) " )
36
+
37
+ // 4. Función que recibe otra función como parámetro
38
+ func applyOperation( _ a: Int , _ b: Int , operation: ( Int , Int ) -> Int ) -> Int {
39
+ return operation ( a, b)
40
+ }
41
+
42
+ let result = applyOperation ( 5 , 3 , operation: * )
43
+ print ( " Resultado de la operación: \( result) " )
44
+
45
+ // Dificultad Extra
46
+ struct Student {
47
+ let name : String
48
+ let birthDate : Date
49
+ let grades : [ Double ]
50
+ }
51
+
52
+ let dateFormatter = DateFormatter ( )
53
+ dateFormatter. dateFormat = " yyyy-MM-dd "
54
+
55
+ let students = [
56
+ Student ( name: " Ana " , birthDate: dateFormatter. date ( from: " 2000-05-15 " ) !, grades: [ 8.5 , 9.0 , 7.5 , 10.0 ] ) ,
57
+ Student ( name: " Carlos " , birthDate: dateFormatter. date ( from: " 1999-11-22 " ) !, grades: [ 7.0 , 8.5 , 9.5 , 8.0 ] ) ,
58
+ Student ( name: " Elena " , birthDate: dateFormatter. date ( from: " 2001-03-10 " ) !, grades: [ 9.5 , 9.0 , 9.5 , 10.0 ] ) ,
59
+ Student ( name: " David " , birthDate: dateFormatter. date ( from: " 2000-09-05 " ) !, grades: [ 6.5 , 7.0 , 8.0 , 7.5 ] )
60
+ ]
61
+
62
+ // 1. Promedio de calificaciones
63
+ let averageGrades = students. map { student in
64
+ ( name: student. name, average: student. grades. reduce ( 0 , + ) / Double( student. grades. count) )
65
+ }
66
+ print ( " Promedio de calificaciones: " )
67
+ averageGrades. forEach { print ( " \( $0. name) : \( String ( format: " %.2f " , $0. average) ) " ) }
68
+
69
+ // 2. Mejores estudiantes
70
+ let bestStudents = students. filter { student in
71
+ student. grades. reduce ( 0 , + ) / Double( student. grades. count) >= 9.0
72
+ } . map { $0. name }
73
+ print ( " \n Mejores estudiantes: \( bestStudents) " )
74
+
75
+ // 3. Ordenar por nacimiento (más joven primero)
76
+ let sortedByAge = students. sorted { $0. birthDate > $1. birthDate }
77
+ print ( " \n Estudiantes ordenados por edad (más joven primero): " )
78
+ sortedByAge. forEach { print ( " \( $0. name) : \( dateFormatter. string ( from: $0. birthDate) ) " ) }
79
+
80
+ // 4. Mayor calificación
81
+ let highestGrade = students. flatMap { $0. grades } . max ( ) ?? 0.0
82
+ print ( " \n Calificación más alta: \( highestGrade) " )
0 commit comments