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()