Skip to content

Commit 1a2d26b

Browse files
authored
Merge pull request #7831 from davidrguez98/main
#50 - Python
2 parents 2e8d4dd + 2c7944a commit 1a2d26b

File tree

2 files changed

+245
-0
lines changed

2 files changed

+245
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
""" /*
2+
* EJERCICIO:
3+
* Papá Noel tiene que comenzar a repartir los regalos...
4+
* ¡Pero ha olvidado el código secreto de apertura del almacén!
5+
*
6+
* Crea un programa donde introducir códigos y obtener pistas.
7+
*
8+
* Código:
9+
* - El código es una combinación de letras y números aleatorios
10+
* de longitud 4. (Letras: de la A a la C, Números: del 1 al 3)
11+
* - No hay repetidos.
12+
* - Se genera de manera aleatoria al iniciar el programa.
13+
*
14+
* Usuario:
15+
* - Dispone de 10 intentos para acertarlo.
16+
* - En cada turno deberá escribir un código de 4 caracteres, y
17+
* el programa le indicará para cada uno lo siguiente:
18+
* - Correcto: Si el caracter está en la posición correcta.
19+
* - Presente: Si el caracter existe, pero esa no es su posición.
20+
* - Incorrecto: Si el caracter no existe en el código secreto.
21+
* - Deben controlarse errores de longitud y caracteres soportados.
22+
*
23+
* Finalización:
24+
* - Papa Noel gana si descrifra el código antes de 10 intentos.
25+
* - Pierde si no lo logra, ya que no podría entregar los regalos.
26+
*/ """
27+
28+
import random
29+
30+
letters = ["A", "B", "C"]
31+
numbers = ["1", "2", "3"]
32+
password_elements = letters + numbers
33+
34+
def generate_password() -> str:
35+
return "".join(random.sample(password_elements, 4))
36+
37+
secret_password = generate_password()
38+
attemps = 1
39+
40+
while attemps <= 10:
41+
42+
print(f"Intento {attemps}")
43+
44+
password = input("Introduce la contraseña: ").upper()
45+
46+
if len(password) != 4:
47+
print("La contraseña debe de tener 4 caracteres.")
48+
continue
49+
if not all(character in password_elements for character in password):
50+
print(f"Solo se permiten los caracteres {password_elements}")
51+
continue
52+
53+
if password == secret_password:
54+
print("¡Contraseña correcta! Has descifrado el código del almacén.")
55+
break
56+
57+
attemps += 1
58+
59+
if attemps > 10:
60+
print("Los 10 intentos para descrifrar el código han finalizado.")
61+
else:
62+
for index, character in enumerate(password):
63+
if character == secret_password[index]:
64+
print(f"{character}: Correcto.")
65+
elif character in secret_password:
66+
print(f"{character}: Presente")
67+
else:
68+
print(f"{character}: Incorrecto")
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
""" /*
2+
* EJERCICIO:
3+
* El nuevo año está a punto de comenzar...
4+
* ¡Voy a ayudarte a planificar tus propósitos de nuevo año!
5+
*
6+
* Programa un gestor de objetivos con las siguientes características:
7+
* - Permite añadir objetivos (máximo 10)
8+
* - Calcular el plan detallado
9+
* - Guardar la planificación
10+
*
11+
* Cada entrada de un objetivo está formado por (con un ejemplo):
12+
* - Meta: Leer libros
13+
* - Cantidad: 12
14+
* - Unidades: libros
15+
* - Plazo (en meses): 12 (máximo 12)
16+
*
17+
* El cálculo del plan detallado generará la siguiente salida:
18+
* - Un apartado para cada mes
19+
* - Un listado de objetivos calculados a cumplir en cada mes
20+
* (ejemplo: si quiero leer 12 libros, dará como resultado
21+
* uno al mes)
22+
* - Cada objetivo debe poseer su nombre, la cantidad de
23+
* unidades a completar en cada mes y su total. Por ejemplo:
24+
*
25+
* Enero:
26+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
27+
* [ ] 2. Estudiar Git (1 curso/mes). Total: 1.
28+
* Febrero:
29+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
30+
* ...
31+
* Diciembre:
32+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
33+
*
34+
* - Si la duración es menor a un año, finalizará en el mes
35+
* correspondiente.
36+
*
37+
* Por último, el cálculo detallado debe poder exportarse a .txt
38+
* (No subir el fichero)
39+
*/ """
40+
41+
import os
42+
43+
MONTHS = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
44+
45+
def show_menu():
46+
47+
print("\nPlanificador de objetivos")
48+
print("1. Añadir objetivo.")
49+
print("2. Calcular el plan detallado")
50+
print("3. Guardar la planificación")
51+
print("4. Salir")
52+
53+
class Goal:
54+
55+
def __init__(self, goal_name: str, amount: int, units: str, limit: int):
56+
self.goal_name = goal_name
57+
self.amount = amount
58+
self.units = units
59+
self.limit = limit
60+
61+
def request_goal() -> Goal:
62+
63+
goal_name = input("Meta: ")
64+
65+
while True:
66+
try:
67+
amount = int(input("Cantidad: "))
68+
if amount <= 0:
69+
print("La cantidad debe ser un número positivo.")
70+
continue
71+
break
72+
except:
73+
print("Introduce un número entero válido.")
74+
75+
units = input("Unidades: ")
76+
77+
while True:
78+
try:
79+
limit = int(input("Plazo en meses (máx. 12): "))
80+
if limit <= 0 or limit > len(MONTHS):
81+
print("El plazo debe ser de 1 a 12 meses.")
82+
continue
83+
break
84+
except:
85+
print("Introduce un número entre 1 y 12.")
86+
87+
return Goal(goal_name, amount, units, limit)
88+
89+
def calculate_detailed_plan(goals: list[Goal]) -> dict:
90+
91+
plan = {month: [] for month in range(1, len(MONTHS) + 1)}
92+
93+
for goal in goals:
94+
95+
month_amount = goal.amount / goal.limit
96+
97+
for month in range(1, goal.limit + 1):
98+
99+
plan[month].append(Goal(goal.goal_name, round(month_amount, 1), goal.units, goal.amount))
100+
101+
return plan
102+
103+
def show_detailed_plan(plan: dict):
104+
105+
for month in range(1, len(MONTHS) + 1):
106+
107+
if not plan[month]:
108+
break
109+
110+
print(f"\n{MONTHS[month - 1]}: ")
111+
112+
for index, goal in enumerate(plan[month], start=1):
113+
print(f"[ ] {index}. {goal.goal_name} ({goal.amount} {goal.units}/mes). Total: {goal.limit}.")
114+
115+
def save_detailed_plan(plan: dict):
116+
117+
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "plan.txt")
118+
119+
with open(file_path, "w", encoding="utf-8") as file:
120+
file.write("Plan detallado")
121+
122+
for month in range(1, len(MONTHS) + 1):
123+
124+
if not plan[month]:
125+
break
126+
127+
file.write(f"\n{MONTHS[month - 1]}:\n")
128+
129+
for index, goal in enumerate(plan[month], start=1):
130+
file.write(f"[ ] {index}. {goal.goal_name} ({goal.amount} {goal.units}/mes). Total: {goal.limit}.\n")
131+
132+
print(f"Plan guardado con éxito en {file_path}")
133+
134+
135+
136+
137+
goals = []
138+
139+
while True:
140+
141+
show_menu()
142+
143+
option = input("\nElige una opción: ")
144+
145+
if option == "1":
146+
if len(goals) >= 10:
147+
print("Has alcanzado el número máximo de objetivos (10).")
148+
continue
149+
else:
150+
goal = request_goal()
151+
goals.append(goal)
152+
print("Objetivo añadido correctamente.")
153+
continue
154+
155+
if option == "2":
156+
if len(goals) == 0:
157+
print("No hay objetivos añadidos.")
158+
continue
159+
else:
160+
plan = calculate_detailed_plan(goals)
161+
show_detailed_plan(plan)
162+
continue
163+
164+
if option == "3":
165+
if len(goals) == 0:
166+
print("No hay objetivos para guardar.")
167+
continue
168+
else:
169+
plan = calculate_detailed_plan(goals)
170+
save_detailed_plan(plan)
171+
172+
if option == "4":
173+
print("Saliendo del planificador.")
174+
break
175+
else:
176+
print("Opción no válida. Elige una opción entre el 1 y 4.")
177+

0 commit comments

Comments
 (0)