Spaces:
Sleeping
Sleeping
import gradio as gr | |
from datetime import datetime, timedelta | |
import re | |
def calcular_duracion(hora_inicio, hora_fin): | |
"""Calcula la duración en minutos entre dos horas.""" | |
inicio = datetime.strptime(hora_inicio, "%H:%M") | |
fin = datetime.strptime(hora_fin, "%H:%M") | |
duracion = int((fin - inicio).total_seconds() / 60) | |
return duracion | |
def encontrar_mejor_hueco(horario, suenno): | |
"""Encuentra el hueco más largo en el día sin traslaparse con los horarios dados.""" | |
# Validación del formato de los horarios ingresados | |
for bloque in horario.split(';'): | |
if not re.match(r'^\s*(\d{2}:\d{2})-(\d{2}:\d{2})\s*$', bloque.strip()): | |
return "Formato de horario inválido. Ejemplo: 09:00-10:00; 12:00-14:00" | |
if not re.match(r'^\s*(\d{2}:\d{2})-(\d{2}:\d{2})\s*$', suenno.strip()): | |
return "Formato de horario de sueño inválido. Ejemplo: 22:00-06:00" | |
# Añadir los horarios ocupados y de sueño al bloque de tiempo | |
bloques_tiempo = [] | |
for bloque in (horario + ";" + suenno).split(';'): | |
hora_inicio, hora_fin = bloque.split('-') | |
bloques_tiempo.append((hora_inicio.strip(), hora_fin.strip())) | |
# Ordenar y añadir los extremos del día para facilitar el cálculo de huecos | |
bloques_tiempo.sort() | |
bloques_tiempo.insert(0, ("00:00", bloques_tiempo[0][0])) # Desde medianoche hasta el primer bloque | |
bloques_tiempo.append((bloques_tiempo[-1][1], "23:59")) # Desde el último bloque hasta el final del día | |
# Encontrar el hueco más largo sin superposición | |
max_duracion = 0 | |
mejor_hueco = None | |
for i in range(len(bloques_tiempo) - 1): | |
inicio = bloques_tiempo[i][1] | |
fin = bloques_tiempo[i + 1][0] | |
duracion = calcular_duracion(inicio, fin) | |
if duracion > max_duracion: | |
max_duracion = duracion | |
mejor_hueco = f"{inicio}-{fin}" | |
# Evaluar si el mejor hueco se encuentra en los horarios recomendados científicamente | |
recomendacion = "No se encontró un hueco para hacer ejercicio en los horarios recomendados según la ciencia." | |
hora_inicio_ejercicio = datetime.strptime("05:00", "%H:%M") | |
hora_fin_ejercicio = datetime.strptime("09:00", "%H:%M") | |
hora_inicio_tarde = datetime.strptime("16:00", "%H:%M") | |
hora_fin_tarde = datetime.strptime("19:00", "%H:%M") | |
# Convertir el mejor hueco en datetime para comparación | |
if mejor_hueco: | |
inicio_hueco, fin_hueco = mejor_hueco.split('-') | |
inicio_hueco = datetime.strptime(inicio_hueco, "%H:%M") | |
fin_hueco = datetime.strptime(fin_hueco, "%H:%M") | |
if (hora_inicio_ejercicio <= inicio_hueco <= hora_fin_ejercicio) or (hora_inicio_tarde <= inicio_hueco <= hora_fin_tarde): | |
recomendacion = f"El mejor momento para hacer ejercicio según la ciencia es dentro de tu mejor hueco: {mejor_hueco}." | |
else: | |
recomendacion += f" Sin embargo, podrías ejercitar en el espacio {mejor_hueco}." | |
# Incluir redireccionamiento a ChatGPT | |
link_chatgpt = "https://chat.openai.com/?utm_source=gradio" | |
consulta_chatgpt = f"\n\nPara saber cuánto tiempo deberías ejercitar en este hueco según tus objetivos, consulta en ChatGPT: {link_chatgpt}" | |
return f"El mejor hueco es de {max_duracion} minutos: {mejor_hueco}. {recomendacion}{consulta_chatgpt}" | |
# Crear la interfaz de Gradio | |
demo = gr.Interface( | |
fn=encontrar_mejor_hueco, | |
inputs=[gr.Textbox(label="Horarios no disponibles (ej. 09:00-10:00; 12:00-14:00; incluyendo transporte, trabajo, etc.)"), | |
gr.Textbox(label="Horario de sueño (ej. 22:00-06:00)")], | |
outputs=gr.Textbox(label="Resultado"), | |
title="Encuentra tu mejor hueco para hacer ejercicio", | |
description="Ingresa tus horarios no disponibles, como los de sueño, transporte y trabajo, en formato 'HH:MM-HH:MM; HH:MM-HH:MM'. Las horas deben estar entre 00:00 y 23:59." | |
) | |
demo.launch() |