Skip to content

Commit 2234f84

Browse files
authored
Merge pull request #8070 from idiegorojas/main
#38 - Python
2 parents 76c0db4 + 0434906 commit 2234f84

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
""" # 38 - Mouredev Pro """
2+
3+
# Desarrolla un programa que lea los registros de un fichero .csv y seleccione de manera aleatoria diferentes ganadores.
4+
5+
"""
6+
Requisitos:
7+
"""
8+
# 1. Crea un .csv con 3 columnas: id, email y status con valor "activo" o "inactivo" (y datos ficticios).
9+
# Ejemplo: 1 | [email protected] | activo
10+
# 2 | [email protected] | inactivo
11+
# (El .csv no debe subirse como parte de la corrección)
12+
# 2. Recupera los datos desde el programa y selecciona email aleatorios.
13+
14+
"""
15+
Acciones:
16+
"""
17+
# 1. Accede al fichero .csv y selecciona de manera aleatoria un email
18+
# ganador de una suscripción, otro ganador de un descuento y un último
19+
# ganador de un libro (sólo si tiene status "activo" y no está repetido).
20+
# 2. Muestra los emails ganadores y su id.
21+
# 3. Ten en cuenta que la primera fila (con el nombre de las columnas) no debe tenerse en cuenta.
22+
23+
24+
25+
import csv
26+
import random
27+
28+
def select_winners(csv_file):
29+
"""
30+
Selecciona ganadores aleatorios de un archivo CSV.
31+
"""
32+
# Lista para almacenar usuarios activos
33+
active_users = []
34+
35+
# Leer el archivo CSV
36+
with open(csv_file, 'r') as file:
37+
reader = csv.reader(file)
38+
next(reader) # Saltamos la primera fila (cabecera)
39+
40+
for row in reader:
41+
if len(row) >= 3 and row[2].lower() == 'true':
42+
active_users.append({"id": row[0], "email": row[1]})
43+
44+
# Verificar si hay suficientes usuarios activos
45+
if len(active_users) < 3:
46+
print("No hay suficientes usuarios activos para seleccionar 3 ganadores.")
47+
return
48+
49+
# Seleccionar ganadores aleatorios sin repetición
50+
winners = random.sample(active_users, 3)
51+
52+
# Mostrar los ganadores
53+
prizes = ["suscripción", "descuento", "libro"]
54+
55+
print("\n=== GANADORES ===")
56+
for i, winner in enumerate(winners):
57+
print(f"Ganador de {prizes[i]}:")
58+
print(f"ID: {winner['id']}, Email: {winner['email']}")
59+
60+
# Ruta del archivo CSV
61+
csv_file = "users.csv"
62+
63+
# Ejecutar el programa
64+
try:
65+
select_winners(csv_file)
66+
except FileNotFoundError:
67+
print(f"Error: No se encontró el archivo '{csv_file}'.")
68+
print("Primero debes crear el archivo CSV con los datos requeridos.")
69+
except Exception as e:
70+
print(f"Error: {e}")
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
""" # 39 - Batman Day"""
2+
3+
""" * RETO 1: """
4+
# Crea un programa que calcule cuándo se va a celebrar el Batman Day hasta su 100 aniversario.
5+
6+
""" * RETO 2: """
7+
# Crea un programa que implemente el sistema de seguridad de la Batcueva.
8+
# Este sistema está diseñado para monitorear múltiples sensores distribuidos por Gotham, detectar intrusos y activar respuestas automatizadas.
9+
# Cada sensor reporta su estado en tiempo real, y Batman necesita un programa que procese estos datos para tomar decisiones estratégicas.
10+
11+
""" Requisitos: """
12+
# El mapa de Gotham y los sensores se representa con una cuadrícula 20x20.
13+
# Cada sensor se identifica con una coordenada (x, y) y un nivel de amenaza entre 0 a 10 (número entero).
14+
# Batman debe concentrar recursos en el área más crítica de Gotham.
15+
# El programa recibe un listado de tuplas representando coordenadas de los sensores y su nivel de amenaza. El umbral de activación del protocolo de seguridad es 20 (sumatorio de amenazas en una cuadrícula 3x3).
16+
17+
""" Acciones: """
18+
# Identifica el área con mayor concentración de amenazas (sumatorio de amenazas en una cuadrícula 3x3).
19+
# Si el sumatorio de amenazas es mayor al umbral, activa el protocolo de seguridad.
20+
# Calcula la distancia desde la Batcueva, situada en (0, 0). La distancia es
21+
# la suma absoluta de las coordenadas al centro de la cuadrícula amenazada.
22+
# Muestra la coordenada al centro de la cuadrícula más amenazada, la suma de sus amenazas, la distancia a la Batcueva y si se debe activar el protocolo de seguridad.
23+
24+
25+
""" Reto #1 """
26+
from datetime import datetime, timedelta
27+
28+
year_of_creation = 1939
29+
anniversary_year = year_of_creation + 85
30+
31+
batman_day_anniversary_dates = []
32+
33+
while anniversary_year <= year_of_creation + 100:
34+
35+
september = datetime(anniversary_year, 9, 1)
36+
37+
first_saturday = 5 - september.weekday() if september.weekday() <= 5 else 12 - \
38+
september.weekday()
39+
40+
third_saturday = september + timedelta(days=first_saturday + 14)
41+
42+
batman_day_anniversary_dates.append(
43+
(
44+
anniversary_year,
45+
anniversary_year - year_of_creation,
46+
third_saturday.strftime("%d-%m-%Y")
47+
)
48+
)
49+
50+
anniversary_year += 1
51+
52+
for year, anniversary, batman_day in batman_day_anniversary_dates:
53+
print(f"Batman day {year} ({anniversary} aniversario): {batman_day}")
54+
55+
56+
57+
""" Reto #2 """
58+
def sistema_seguridad_batcueva(sensores):
59+
# Inicializar la cuadrícula 20x20 con ceros
60+
cuadricula_gotham = [[0 for _ in range(20)] for _ in range(20)]
61+
62+
# Poblar la cuadrícula con niveles de amenaza de los sensores
63+
for x, y, nivel_amenaza in sensores:
64+
if 0 <= x < 20 and 0 <= y < 20:
65+
cuadricula_gotham[y][x] = nivel_amenaza
66+
67+
suma_amenazas_maxima = 0
68+
centro_amenaza_maxima = (0, 0)
69+
70+
# Comprobar cada posible cuadrícula 3x3
71+
for centro_y in range(1, 19):
72+
for centro_x in range(1, 19):
73+
suma_amenazas = 0
74+
75+
# Sumar amenazas en la cuadrícula 3x3 alrededor del centro
76+
for dy in range(-1, 2):
77+
for dx in range(-1, 2):
78+
suma_amenazas += cuadricula_gotham[centro_y + dy][centro_x + dx]
79+
80+
# Actualizar si esta es el área con mayor amenaza
81+
if suma_amenazas > suma_amenazas_maxima:
82+
suma_amenazas_maxima = suma_amenazas
83+
centro_amenaza_maxima = (centro_x, centro_y)
84+
85+
# Calcular distancia desde la Batcueva (0,0) hasta el centro de amenaza
86+
distancia_a_batcueva = abs(centro_amenaza_maxima[0]) + abs(centro_amenaza_maxima[1])
87+
88+
# Determinar si se debe activar el protocolo de seguridad
89+
activar_protocolo = suma_amenazas_maxima >= 20
90+
91+
return {
92+
"centro_amenaza": centro_amenaza_maxima,
93+
"suma_amenazas": suma_amenazas_maxima,
94+
"distancia": distancia_a_batcueva,
95+
"activar_protocolo": activar_protocolo
96+
}
97+
98+
# Ejemplo de uso:
99+
if __name__ == "__main__":
100+
# Lista de ejemplo de sensores: (x, y, nivel_amenaza)
101+
sensores_ejemplo = [
102+
(5, 5, 8),
103+
(6, 5, 7),
104+
(7, 5, 6),
105+
(5, 6, 5),
106+
(6, 6, 9),
107+
(7, 6, 4),
108+
(5, 7, 3),
109+
(6, 7, 2),
110+
(7, 7, 1),
111+
(10, 15, 10),
112+
(2, 3, 6)
113+
]
114+
115+
resultado = sistema_seguridad_batcueva(sensores_ejemplo)
116+
117+
print("\nInforme del Sistema de Seguridad de la Batcueva:")
118+
print(f"Área más amenazada: {resultado['centro_amenaza']}")
119+
print(f"Suma de nivel de amenaza: {resultado['suma_amenazas']}")
120+
print(f"Distancia desde la Batcueva: {resultado['distancia']}")
121+
print(f"Protocolo de seguridad activado: {'SÍ' if resultado['activar_protocolo'] else 'NO'}")

0 commit comments

Comments
 (0)