1
+ """ /*
2
+ * EJERCICIO:
3
+ * Cada año se celebra el Batman Day durante la tercera semana de septiembre...
4
+ * ¡Y este año cumple 85 años! Te propongo un reto doble:
5
+ *
6
+ * RETO 1:
7
+ * Crea un programa que calcule cuándo se va a celebrar el Batman Day hasta
8
+ * su 100 aniversario.
9
+ *
10
+ * RETO 2:
11
+ * Crea un programa que implemente el sistema de seguridad de la Batcueva.
12
+ * Este sistema está diseñado para monitorear múltiples sensores distribuidos
13
+ * por Gotham, detectar intrusos y activar respuestas automatizadas.
14
+ * Cada sensor reporta su estado en tiempo real, y Batman necesita un programa
15
+ * que procese estos datos para tomar decisiones estratégicas.
16
+ * Requisitos:
17
+ * - El mapa de Gotham y los sensores se representa con una cuadrícula 20x20.
18
+ * - Cada sensor se identifica con una coordenada (x, y) y un nivel
19
+ * de amenaza entre 0 a 10 (número entero).
20
+ * - Batman debe concentrar recursos en el área más crítica de Gotham.
21
+ * - El programa recibe un listado de tuplas representando coordenadas de los
22
+ * sensores y su nivel de amenaza. El umbral de activación del protocolo de
23
+ * seguridad es 20 (sumatorio de amenazas en una cuadrícula 3x3).
24
+ * Acciones:
25
+ * - Identifica el área con mayor concentración de amenazas
26
+ * (sumatorio de amenazas en una cuadrícula 3x3).
27
+ * - Si el sumatorio de amenazas es mayor al umbral, activa el
28
+ * protocolo de seguridad.
29
+ * - Calcula la distancia desde la Batcueva, situada en (0, 0). La distancia es
30
+ * la suma absoluta de las coordenadas al centro de la cuadrícula amenazada.
31
+ * - Muestra la coordenada al centro de la cuadrícula más amenazada, la suma de
32
+ * sus amenazas, la distancia a la Batcueva y si se debe activar el
33
+ * protocolo de seguridad.
34
+ */ """
35
+
36
+ #RETO 1
37
+
38
+ from datetime import datetime , timedelta
39
+
40
+ year_of_creation = 1939
41
+ anniversary_year = year_of_creation + 85
42
+
43
+ batman_day_anniversary_dates = []
44
+
45
+ while anniversary_year <= year_of_creation + 100 :
46
+
47
+ september = datetime (anniversary_year , 9 , 1 )
48
+
49
+ first_saturday = 5 - september .weekday () if september .weekday () <= 5 else 12 - september .weekday ()
50
+
51
+ third_saturday = september + timedelta (days = first_saturday + 14 )
52
+
53
+ batman_day_anniversary_dates .append ((anniversary_year , anniversary_year - year_of_creation , third_saturday .strftime ("%d-%m-%Y" )))
54
+
55
+ anniversary_year += 1
56
+
57
+ for year , anniversary , batman_day in batman_day_anniversary_dates :
58
+ print (f"Batman day { year } ({ anniversary } aniversario): { batman_day } " )
59
+
60
+ #RETO 2
61
+
62
+ def sum_subgrid_alerts (sensors , x , y ) -> int :
63
+
64
+ total = 0
65
+
66
+ for x in range (x - 1 , x + 2 ):
67
+ for y in range (y - 1 , y + 2 ):
68
+ for sensor in sensors :
69
+ if sensor [0 ] == x and sensor [1 ] == y :
70
+ total += sensor [2 ]
71
+
72
+ return total
73
+
74
+
75
+ def batcave_security_system (sensors ):
76
+
77
+ max_alert_level = 0
78
+ max_alert_coordinate = (0 ,0 )
79
+
80
+ for x in range (1 , 19 ):
81
+ for y in range (1 , 19 ):
82
+ alert_level = sum_subgrid_alerts (sensors , x , y )
83
+ if alert_level > max_alert_level :
84
+ max_alert_level = alert_level
85
+ max_alert_coordinate = (x , y )
86
+
87
+ distance = abs (max_alert_coordinate [0 ]) + abs (max_alert_coordinate [1 ])
88
+ activate_protocol = max_alert_level > 20
89
+
90
+
91
+ return max_alert_coordinate , max_alert_level , distance , activate_protocol
92
+
93
+ sensors = [
94
+ (1 , 5 , 9 ),
95
+ (3 , 8 , 2 ),
96
+ (6 , 1 , 7 ),
97
+ (9 , 4 , 5 ),
98
+ (12 , 7 , 6 ),
99
+ (14 , 10 , 3 ),
100
+ (17 , 13 , 9 ),
101
+ (16 , 13 , 9 ),
102
+ (15 , 13 , 9 ),
103
+ (19 , 15 , 4 ),
104
+ (21 , 18 , 7 ),
105
+ (25 , 20 , 6 )
106
+ ]
107
+
108
+ result = batcave_security_system (sensors )
109
+ print (f"Centro cuadrícula más amenazada: { result [0 ]} ." )
110
+ print (f"Máximo nivel de alerta: { result [1 ]} ." )
111
+ print (f"Distancia a la Batcueva: { result [2 ]} ." )
112
+ print (f"Activar protocolo de seguridad: { result [3 ]} ." )
0 commit comments