|
| 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 | +from datetime import datetime, timedelta |
| 38 | + |
| 39 | +def calcular_batman_day(anio_inicio, anios): |
| 40 | + batman_days = [] |
| 41 | + for i in range(anios): |
| 42 | + anio = anio_inicio + i |
| 43 | + # Encuentra el primer día de la tercera semana de septiembre |
| 44 | + primer_dia_septiembre = datetime(anio, 9, 1) |
| 45 | + tercer_lunes = primer_dia_septiembre + timedelta(days=(14 - primer_dia_septiembre.weekday() + 7) % 7) |
| 46 | + batman_days.append(tercer_lunes) |
| 47 | + return batman_days |
| 48 | + |
| 49 | +# Ejemplo de uso |
| 50 | +anio_inicio = 2024 |
| 51 | +anios = 100 - 85 # Hasta el 100 aniversario |
| 52 | +batman_days = calcular_batman_day(anio_inicio, anios) |
| 53 | +for dia in batman_days: |
| 54 | + print(dia.strftime("%Y-%m-%d")) |
| 55 | + |
| 56 | + |
| 57 | +# Reto 2 |
| 58 | +def calcular_amenaza(sensor_data): |
| 59 | + max_amenaza = 0 |
| 60 | + coordenada_max = (0, 0) |
| 61 | + activar_protocolo = False |
| 62 | + |
| 63 | + for i in range(18): # 20x20 grid, 3x3 subgrid |
| 64 | + for j in range(18): |
| 65 | + suma_amenaza = sum(sensor_data[x][y] for x in range(i, i+3) for y in range(j, j+3)) |
| 66 | + if suma_amenaza > max_amenaza: |
| 67 | + max_amenaza = suma_amenaza |
| 68 | + coordenada_max = (i+1, j+1) |
| 69 | + activar_protocolo = suma_amenaza > 20 |
| 70 | + |
| 71 | + distancia_batcueva = abs(coordenada_max[0] - 1) + abs(coordenada_max[1] - 1) |
| 72 | + return coordenada_max, max_amenaza, distancia_batcueva, activar_protocolo |
| 73 | + |
| 74 | +# Ejemplo de uso |
| 75 | +sensor_data = [[0]*20 for _ in range(20)] |
| 76 | +# Añadir datos de sensores (coordenada x, y, nivel de amenaza) |
| 77 | +sensores = [(5, 5, 8), (6, 6, 7), (7, 7, 6), (8, 8, 9), (9, 9, 10)] |
| 78 | +for x, y, amenaza in sensores: |
| 79 | + sensor_data[x][y] = amenaza |
| 80 | + |
| 81 | +coordenada_max, max_amenaza, distancia_batcueva, activar_protocolo = calcular_amenaza(sensor_data) |
| 82 | +print(f"Coordenada más amenazada: {coordenada_max}") |
| 83 | +print(f"Suma de amenazas: {max_amenaza}") |
| 84 | +print(f"Distancia a la Batcueva: {distancia_batcueva}") |
| 85 | +print(f"Activar protocolo de seguridad: {'Sí' if activar_protocolo else 'No'}") |
0 commit comments