Spaces:
Configuration error
Configuration error
| from datetime import date | |
| from dateutil.relativedelta import relativedelta | |
| DISTANCES = {"5K": 5, "10K": 10, "21K": 21.097, "42K": 42.195} | |
| def weeks_until(target_iso): | |
| tgt = date.fromisoformat(target_iso) | |
| today = date.today() | |
| return max(4, (tgt - today).days // 7) | |
| def base_paces(current_5k_pace_min_per_km: float): | |
| # Deriva ritmos aproximados básicos (puedes ajustar a tu criterio) | |
| easy = current_5k_pace_min_per_km + 0.45 # ~+27s/km | |
| tempo = current_5k_pace_min_per_km - 0.15 # ~-9s/km | |
| intervals = current_5k_pace_min_per_km - 0.30 | |
| return round(easy,2), round(tempo,2), round(intervals,2) | |
| def build_plan(goal:str, target_date:str, days_per_week:int, long_run_day:str, | |
| current_5k_pace:float, long_run_km:int|float, experience:str): | |
| weeks = min(20, max(8, weeks_until(target_date))) | |
| easy, tempo, intervals = base_paces(current_5k_pace) | |
| goal_km = DISTANCES[goal] | |
| # volumen inicial y progresión simple | |
| base_vol = max(20, int(long_run_km*2.5)) | |
| peak_vol = { "5K": 35, "10K": 45, "21K": 55, "42K": 80 }[goal] | |
| progression = [(base_vol + int((peak_vol-base_vol)*i/(weeks-1))) for i in range(weeks)] | |
| week_plan = [] | |
| for w in range(1, weeks+1): | |
| vol = progression[w-1] | |
| sessions = [] | |
| slots = min(5, max(3, days_per_week)) | |
| mix = ["Easy","Tempo","Easy","Intervals","LR"][:slots] | |
| for s in mix: | |
| if s=="Easy": | |
| sessions.append({"tipo":"Rodaje suave","km": round(vol*0.20,1), "ritmo": f"{easy} min/km"}) | |
| elif s=="Tempo": | |
| sessions.append({"tipo":"Tempo (umbral)","estructura": "2km cal + 4-6km tempo + 1km enf", | |
| "ritmo": f"{tempo} min/km"}) | |
| elif s=="Intervals": | |
| rep = 5 if goal in ("10K","21K") else 4 | |
| dist = 1.0 if goal!="5K" else 0.8 | |
| sessions.append({"tipo":"Intervalos", "estructura": f"{rep} x {dist}km (rec 2-3')", | |
| "ritmo": f"{intervals} min/km"}) | |
| elif s=="LR": | |
| lr = min(goal_km+10, max(long_run_km, int(vol*0.35))) | |
| sessions.append({"tipo":f"Fondo {long_run_day}","km": lr, "ritmo": f"{easy+0.15} min/km"}) | |
| week_plan.append({"semana": w, "volumen_km": vol, "sesiones": sessions}) | |
| return { | |
| "resumen": { | |
| "semanas": weeks, | |
| "volumen_pico_km": max(progression), | |
| "ritmos": {"easy": easy, "tempo": tempo, "intervalos": intervals} | |
| }, | |
| "plan": week_plan | |
| } |