Skip to content

Commit c37ae7a

Browse files
authored
Merge pull request mouredev#7526 from santyjL/main
mouredev#37 - python
2 parents 8ae4940 + 37484ba commit c37ae7a

File tree

2 files changed

+207
-0
lines changed
  • Roadmap
    • 37 - OASIS VS LINKIN PARK/python
    • 50 - PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO/python

2 files changed

+207
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#37 OASIS VS LINKIN PARK
2+
#### Dificultad: Media | Publicación: 09/09/24 | Corrección: 16/09/24
3+
4+
## Ejercicio
5+
"""
6+
/*
7+
* EJERCICIO:
8+
* ¡Dos de las bandas más grandes de la historia están de vuelta!
9+
* Oasis y Linkin Park han anunciado nueva gira, pero, ¿quién es más popular?
10+
* Desarrolla un programa que se conecte al API de Spotify y los compare.
11+
* Requisitos:
12+
* 1. Crea una cuenta de desarrollo en https://developer.spotify.com.
13+
* 2. Conéctate al API utilizando tu lenguaje de programación.
14+
* 3. Recupera datos de los endpoint que tú quieras.
15+
* Acciones:
16+
* 1. Accede a las estadísticas de las dos bandas.
17+
* Por ejemplo: número total de seguidores, escuchas mensuales,
18+
* canción con más reproducciones...
19+
* 2. Compara los resultados de, por lo menos, 3 endpoint.
20+
* 3. Muestra todos los resultados por consola para notificar al usuario.
21+
* 4. Desarrolla un criterio para seleccionar qué banda es más popular.
22+
*/
23+
"""
24+
import base64
25+
26+
import requests
27+
28+
# Credenciales de Spotify
29+
client_id = ''
30+
client_secret = ''
31+
32+
# Obtener el token de acceso
33+
def get_access_token(client_id, client_secret):
34+
auth_url = 'https://accounts.spotify.com/api/token'
35+
auth_header = base64.b64encode(f"{client_id}:{client_secret}".encode()).decode()
36+
headers = {
37+
'Authorization': f'Basic {auth_header}',
38+
'Content-Type': 'application/x-www-form-urlencoded'
39+
}
40+
data = {
41+
'grant_type': 'client_credentials'
42+
}
43+
response = requests.post(auth_url, headers=headers, data=data)
44+
response_data = response.json()
45+
return response_data['access_token']
46+
47+
# Obtener datos del artista
48+
def get_artist_data(artist_name, access_token):
49+
search_url = 'https://api.spotify.com/v1/search'
50+
headers = {
51+
'Authorization': f'Bearer {access_token}'
52+
}
53+
params = {
54+
'q': artist_name,
55+
'type': 'artist'
56+
}
57+
response = requests.get(search_url, headers=headers, params=params)
58+
artist_data = response.json()['artists']['items'][0]
59+
return artist_data
60+
61+
# Comparar estadísticas de las bandas
62+
def compare_bands(artist1, artist2):
63+
access_token = get_access_token(client_id, client_secret)
64+
artist1_data = get_artist_data(artist1, access_token)
65+
artist2_data = get_artist_data(artist2, access_token)
66+
67+
print(f"""{artist1}:
68+
Followers: {artist1_data['followers']['total']} de seguidores en total
69+
Popularity: {artist1_data['popularity']} puntos de popularidad
70+
Generos: {artist1_data['genres']}
71+
""")
72+
print(f"""{artist2}:
73+
Followers: {artist2_data['followers']['total']} de seguidores en total
74+
Popularity: {artist2_data['popularity']} puntos de popularidad
75+
Generos: {artist2_data['genres']}
76+
""")
77+
78+
if artist1_data['followers']['total'] > artist2_data['followers']['total']:
79+
print(f"{artist1} es más popular que {artist2}.")
80+
else:
81+
print(f"{artist2} es más popular que {artist1}.")
82+
83+
# Uso del programa
84+
compare_bands('soda stereo', 'Los enanitos verdes')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
"""
2+
/*
3+
* EJERCICIO:
4+
* El nuevo año está a punto de comenzar...
5+
* ¡Voy a ayudarte a planificar tus propósitos de nuevo año!
6+
*
7+
* Programa un gestor de objetivos con las siguientes características:
8+
* - Permite añadir objetivos (máximo 10)
9+
* - Calcular el plan detallado
10+
* - Guardar la planificación
11+
*
12+
* Cada entrada de un objetivo está formado por (con un ejemplo):
13+
* - Meta: Leer libros
14+
* - Cantidad: 12
15+
* - Unidades: libros
16+
* - Plazo (en meses): 12 (máximo 12)
17+
*
18+
* El cálculo del plan detallado generará la siguiente salida:
19+
* - Un apartado para cada mes
20+
* - Un listado de objetivos calculados a cumplir en cada mes
21+
* (ejemplo: si quiero leer 12 libros, dará como resultado
22+
* uno al mes)
23+
* - Cada objetivo debe poseer su nombre, la cantidad de
24+
* unidades a completar en cada mes y su total. Por ejemplo:
25+
*
26+
* Enero:
27+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
28+
* [ ] 2. Estudiar Git (1 curso/mes). Total: 1.
29+
* Febrero:
30+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
31+
* ...
32+
* Diciembre:
33+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
34+
*
35+
* - Si la duración es menor a un año, finalizará en el mes
36+
* correspondiente.
37+
*
38+
* Por último, el cálculo detallado debe poder exportarse a .txt
39+
* (No subir el fichero)
40+
*/
41+
"""
42+
import os
43+
44+
MAX_OBJETIVOS: int = 10
45+
OBJETIVOS: list = []
46+
MESES_DEL_AÑO: list = [
47+
'Enero', 'Febrero', 'Marzo', 'Abril',
48+
'Mayo', 'Junio', 'Julio', 'Agosto',
49+
'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'
50+
]
51+
52+
def crear_objetivo():
53+
objetivo = {}
54+
objetivo['meta'] = input('Introduce la meta: ')
55+
objetivo['cantidad'] = int(input('Introduce la cantidad: '))
56+
objetivo['unidades'] = input('Introduce las unidades: ')
57+
objetivo['plazo'] = int(input('Introduce el plazo (en meses): '))
58+
return objetivo
59+
60+
def objetivos_calculados(objetivo: dict) -> list:
61+
cantidad_total = objetivo['cantidad']
62+
plazo = objetivo['plazo']
63+
64+
cantidad_mensual = cantidad_total // plazo
65+
resto = cantidad_total % plazo
66+
67+
cantidades = [cantidad_mensual] * plazo
68+
69+
for i in range(resto):
70+
cantidades[i] += 1
71+
72+
return cantidades
73+
74+
def crear_txt(objetivos: list):
75+
with open("objetivos_de_año_nuevo.txt", "w") as fichero:
76+
for objetivo in objetivos:
77+
cantidades = objetivos_calculados(objetivo)
78+
fichero.write(f"Meta: {objetivo['meta']}\n")
79+
fichero.write(f"Cantidad total: {objetivo['cantidad']} {objetivo['unidades']}\n")
80+
fichero.write(f"Plazo: {objetivo['plazo']} meses\n")
81+
fichero.write("Distribucion mensual:\n")
82+
for i, cantidad in enumerate(cantidades):
83+
fichero.write(f"{MESES_DEL_AÑO[i]}: {cantidad} {objetivo['unidades']}\n")
84+
fichero.write("\n")
85+
86+
def mostrar_objetivos():
87+
for mes in MESES_DEL_AÑO:
88+
print(f"-----------{mes}-----------")
89+
for objetivo in OBJETIVOS:
90+
cantidades = objetivos_calculados(objetivo)
91+
for i in range(objetivo['plazo']):
92+
if i < len(MESES_DEL_AÑO):
93+
if MESES_DEL_AÑO[i] == mes:
94+
print(f"[ ] {objetivo['meta']} ({cantidades[i]} {objetivo['unidades']}/mes). Total: {objetivo['cantidad']}.")
95+
96+
# Ejemplo de uso
97+
while True:
98+
opcion = input("Elige una opción:\n0. Mostrar objetivos\n1. Crear objetivo\n2. Mostrar objetivos por mes\n3. Exportar a txt\n4. Salir\nIntroduce el número de la opción: ")
99+
100+
if opcion == '0':
101+
mostrar_objetivos()
102+
103+
elif opcion == '1':
104+
if not len(OBJETIVOS) >= MAX_OBJETIVOS:
105+
OBJETIVOS.append(crear_objetivo())
106+
else:
107+
print("Has alcanzado el límite de objetivos.")
108+
109+
elif opcion == '2':
110+
for mes in MESES_DEL_AÑO:
111+
print(f"-----------{mes}-----------")
112+
for objetivo in OBJETIVOS:
113+
cantidades = objetivos_calculados(objetivo)
114+
for i in range(objetivo['plazo']):
115+
if i < len(MESES_DEL_AÑO):
116+
if MESES_DEL_AÑO[i] == mes:
117+
print(f"[ ] {objetivo['meta']} ({cantidades[i]} {objetivo['unidades']}/mes). Total: {objetivo['cantidad']}.")
118+
119+
elif opcion == '3':
120+
crear_txt(OBJETIVOS)
121+
122+
elif opcion == '4':
123+
break

0 commit comments

Comments
 (0)