{"id":2458,"date":"2023-08-28T12:33:23","date_gmt":"2023-08-28T16:33:23","guid":{"rendered":"https:\/\/nutrideportiva.cl\/?p=2458"},"modified":"2026-02-05T15:51:19","modified_gmt":"2026-02-05T18:51:19","slug":"calcula-tu-rm-y-entrenamiento","status":"publish","type":"post","link":"http:\/\/nutrideportiva.cl\/index.php\/2023\/08\/28\/calcula-tu-rm-y-entrenamiento\/","title":{"rendered":"Calcula tu RM y Entrenamiento !!"},"content":{"rendered":"\n<!doctype html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n  <title>Herramientas NutriDeportiva: 1RM + Rutinas + FC + Nutrici\u00f3n<\/title>\n  <style>\n    :root{\n      --bg:#0b0f14; --card:#111826; --muted:#9aa4b2; --text:#e6edf3;\n      --accent:#ff3b30; --line:#223047; --ok:#22c55e;\n      --radius:14px;\n    }\n    body{ margin:0; font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial; background:var(--bg); color:var(--text); }\n    header{ padding:22px 16px 10px; max-width:1100px; margin:0 auto; }\n    h1{ margin:0 0 6px; font-size:20px; }\n    p{ margin:6px 0; color:var(--muted); line-height:1.4; }\n    .wrap{ max-width:1100px; margin:0 auto; padding:10px 16px 36px; display:grid; gap:14px; }\n    .card{ background:var(--card); border:1px solid var(--line); border-radius:var(--radius); padding:14px; }\n    .row{ display:flex; flex-wrap:wrap; gap:10px; align-items:end; }\n    label{ display:block; font-size:12px; color:var(--muted); margin-bottom:6px; }\n    input, select, button{\n      font:inherit; color:var(--text); background:#0f1623; border:1px solid var(--line);\n      border-radius:10px; padding:10px 10px; outline:none;\n    }\n    input::placeholder{ color:#6b7280; }\n    input[type=\"number\"]{ width:140px; }\n    button{ cursor:pointer; background:#182235; }\n    button:hover{ filter:brightness(1.08); }\n    .btn-accent{ background: #2a0f12; border-color:#4a1a1f; }\n    .btn-accent:hover{ filter:brightness(1.12); }\n    .grid2{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }\n    @media (max-width: 900px){ .grid2{ grid-template-columns:1fr; } }\n    table{ width:100%; border-collapse:collapse; overflow:hidden; border-radius:12px; }\n    th, td{ border-bottom:1px solid var(--line); padding:10px 8px; vertical-align:top; }\n    th{ text-align:left; font-size:12px; color:var(--muted); background:#0f1623; position:sticky; top:0; z-index:1; }\n    td{ font-size:13px; }\n    .small{ font-size:12px; color:var(--muted); }\n    .result{ color:var(--accent); font-weight:700; }\n    .ok{ color:var(--ok); font-weight:700; }\n    .pill{ display:inline-block; padding:3px 8px; border:1px solid var(--line); border-radius:999px; font-size:12px; color:var(--muted); }\n    .section-title{ display:flex; justify-content:space-between; align-items:baseline; gap:10px; margin-bottom:10px; }\n    .section-title h2{ margin:0; font-size:16px; }\n    .muted{ color:var(--muted); }\n    .two-col{ display:grid; grid-template-columns: 1.2fr .8fr; gap:12px; }\n    @media (max-width: 900px){ .two-col{ grid-template-columns:1fr; } }\n    .warn{ color:#f59e0b; }\n    .footer-note{ color:var(--muted); font-size:12px; margin-top:8px; }\n  <\/style>\n<\/head>\n\n<body>\n<header>\n  <h1>Calculadoras: 1RM (multi-f\u00f3rmula) + Rutinas FullBody + FC + Nutrici\u00f3n<\/h1>\n  <p>Versi\u00f3n unificada, con datos replicables, guardado autom\u00e1tico y tablas generadas por configuraci\u00f3n.<\/p>\n<\/header>\n\n<div class=\"wrap\">\n\n  <!-- =========================\n       1RM MULTI-F\u00d3RMULA\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>1) Calculadora 1RM (multi-f\u00f3rmula)<\/h2>\n      <span class=\"pill\">autosave \u2713<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div>\n        <label>Modo<\/label>\n        <select id=\"mode\">\n          <option value=\"shared\">Replicar datos (1 peso + 1 reps para todas)<\/option>\n          <option value=\"perRow\">Individual por f\u00f3rmula (cada fila con sus inputs)<\/option>\n        <\/select>\n      <\/div>\n\n      <div>\n        <label>Redondeo<\/label>\n        <select id=\"rounding\">\n          <option value=\"none\">Sin redondeo<\/option>\n          <option value=\"0.5\">A 0.5 kg<\/option>\n          <option value=\"1\">A 1 kg<\/option>\n          <option value=\"2.5\">A 2.5 kg<\/option>\n        <\/select>\n      <\/div>\n\n      <div>\n        <label>Repeticiones (1\u201320)<\/label>\n        <input id=\"sharedReps\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" placeholder=\"Ej: 8\" \/>\n      <\/div>\n\n      <div>\n        <label>Peso (kg)<\/label>\n        <input id=\"sharedWeight\" type=\"number\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 80\" \/>\n      <\/div>\n\n      <div>\n        <button id=\"clearAll\" class=\"btn-accent\">Borrar todo<\/button>\n      <\/div>\n    <\/div>\n\n    <p class=\"footer-note\">\n      Recomendaci\u00f3n pr\u00e1ctica: usa repeticiones \u2264 10\u201312 para mejor precisi\u00f3n en estimaciones de 1RM.\n    <\/p>\n\n    <div style=\"margin-top:12px; overflow:auto; max-height:420px;\">\n      <table id=\"rmTable\" aria-label=\"Tabla 1RM\">\n        <thead>\n          <tr>\n            <th>F\u00f3rmula<\/th>\n            <th>A\u00f1o<\/th>\n            <th>Reps<\/th>\n            <th>Peso<\/th>\n            <th>Ejercicio recomendado<\/th>\n            <th>Observaci\u00f3n<\/th>\n            <th>1RM<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody><!-- generado por JS --><\/tbody>\n      <\/table>\n    <\/div>\n\n    <div class=\"two-col\" style=\"margin-top:12px;\">\n      <div class=\"card\" style=\"padding:12px;\">\n        <div class=\"section-title\">\n          <h2 style=\"font-size:14px;\">Resumen (promedio y rango)<\/h2>\n        <\/div>\n        <div class=\"row\">\n          <div>\n            <div class=\"small\">Promedio de 1RM<\/div>\n            <div id=\"rmAvg\" class=\"result\">\u2014<\/div>\n          <\/div>\n          <div>\n            <div class=\"small\">M\u00edn \/ M\u00e1x<\/div>\n            <div id=\"rmMinMax\" class=\"result\">\u2014<\/div>\n          <\/div>\n          <div>\n            <div class=\"small\">F\u00f3rmulas v\u00e1lidas<\/div>\n            <div id=\"rmCount\" class=\"ok\">\u2014<\/div>\n          <\/div>\n        <\/div>\n        <p class=\"footer-note\">El promedio te da una estimaci\u00f3n robusta cuando hay variabilidad entre f\u00f3rmulas.<\/p>\n      <\/div>\n\n      <div class=\"card\" style=\"padding:12px;\">\n        <div class=\"section-title\">\n          <h2 style=\"font-size:14px;\">Tip r\u00e1pido<\/h2>\n        <\/div>\n        <p class=\"muted\" style=\"margin:0;\">\n          Si quieres \u201creplicar datos\u201d pero comparar ejercicios distintos, cambia solo el texto de recomendaci\u00f3n y deja\n          el c\u00e1lculo con el mismo peso\/reps para evitar duplicaci\u00f3n.\n        <\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- =========================\n       RM PARA RUTINAS\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>2) Ingreso de RM (para rutinas)<\/h2>\n      <span class=\"pill\">1 set de RM \u2192 5 rutinas<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div><label>Bench Press (kg)<\/label><input type=\"number\" id=\"rmBench\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 100\"><\/div>\n      <div><label>Squat (kg)<\/label><input type=\"number\" id=\"rmSquat\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 140\"><\/div>\n      <div><label>Deadlift (kg)<\/label><input type=\"number\" id=\"rmDeadlift\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 170\"><\/div>\n      <div><label>Leg Press (kg)<\/label><input type=\"number\" id=\"rmLegPress\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 220\"><\/div>\n      <div><label>Shoulder Press (kg)<\/label><input type=\"number\" id=\"rmShoulder\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 70\"><\/div>\n\n      <div>\n        <button id=\"calcRoutines\">Calcular pesos rutinas<\/button>\n      <\/div>\n    <\/div>\n\n    <p class=\"footer-note\">\n      Nota: los \u201cpesos proporcionales\u201d son aproximaciones educativas. Ajusta por t\u00e9cnica, RPE, fatiga y disponibilidad de equipo.\n    <\/p>\n  <\/section>\n\n  <!-- =========================\n       RUTINAS\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>3) Rutinas FullBody (1\u20135)<\/h2>\n      <span class=\"pill\">tablas din\u00e1micas<\/span>\n    <\/div>\n    <div id=\"routinesContainer\" class=\"grid2\"><!-- generado por JS --><\/div>\n  <\/section>\n\n  <!-- =========================\n       FC OBJETIVO\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>4) Frecuencia cardiaca recomendada<\/h2>\n      <span class=\"pill\">simple &#038; \u00fatil<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div><label>Edad (a\u00f1os)<\/label><input type=\"number\" id=\"age\" min=\"10\" max=\"100\" step=\"1\" placeholder=\"Ej: 30\"><\/div>\n      <div><label>Tiempo disponible (min)<\/label><input type=\"number\" id=\"minutes\" min=\"5\" max=\"300\" step=\"5\" placeholder=\"Ej: 30\"><\/div>\n      <div>\n        <label>Objetivo<\/label>\n        <select id=\"goal\">\n          <option value=\"salud\">Salud<\/option>\n          <option value=\"rendimiento\">Rendimiento<\/option>\n          <option value=\"bajar\">Bajar de peso<\/option>\n        <\/select>\n      <\/div>\n      <div><button id=\"calcHR\">Calcular<\/button><\/div>\n    <\/div>\n\n    <div style=\"margin-top:10px;\" class=\"card\">\n      <div class=\"row\">\n        <div>\n          <div class=\"small\">FC recomendada<\/div>\n          <div id=\"hrOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Tipo de entrenamiento<\/div>\n          <div id=\"hrType\" class=\"ok\">\u2014<\/div>\n        <\/div>\n      <\/div>\n      <p id=\"hrTips\" class=\"muted\" style=\"margin:8px 0 0;\">\u2014<\/p>\n      <p class=\"footer-note\">C\u00e1lculo con HRmax \u2248 208 \u2212 0.7\u00d7edad. Idealmente sumar FC reposo para personalizar (Karvonen).<\/p>\n    <\/div>\n  <\/section>\n\n  <!-- =========================\n       CALCULADORA NUTRICIONAL\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>5) Calculadora nutricional (r\u00e1pida)<\/h2>\n      <span class=\"pill\">Mifflin + macros<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div>\n        <label>Sexo<\/label>\n        <select id=\"sex\">\n          <option value=\"m\">Hombre<\/option>\n          <option value=\"f\">Mujer<\/option>\n        <\/select>\n      <\/div>\n      <div><label>Edad<\/label><input type=\"number\" id=\"nAge\" min=\"10\" max=\"100\" step=\"1\" placeholder=\"Ej: 30\"><\/div>\n      <div><label>Peso (kg)<\/label><input type=\"number\" id=\"nWeight\" min=\"0\" step=\"0.1\" placeholder=\"Ej: 80\"><\/div>\n      <div><label>Estatura (cm)<\/label><input type=\"number\" id=\"nHeight\" min=\"0\" step=\"1\" placeholder=\"Ej: 175\"><\/div>\n      <div>\n        <label>Actividad<\/label>\n        <select id=\"activity\">\n          <option value=\"1.2\">Sedentario (1.2)<\/option>\n          <option value=\"1.375\">Ligero (1.375)<\/option>\n          <option value=\"1.55\" selected>Moderado (1.55)<\/option>\n          <option value=\"1.725\">Alto (1.725)<\/option>\n          <option value=\"1.9\">Muy alto (1.9)<\/option>\n        <\/select>\n      <\/div>\n      <div>\n        <label>Objetivo<\/label>\n        <select id=\"nGoal\">\n          <option value=\"maintain\">Mantener<\/option>\n          <option value=\"cut\">Bajar grasa<\/option>\n          <option value=\"bulk\">Subir masa<\/option>\n        <\/select>\n      <\/div>\n      <div><button id=\"calcNutri\">Calcular<\/button><\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top:10px;\">\n      <div class=\"row\">\n        <div>\n          <div class=\"small\">Calor\u00edas diarias<\/div>\n          <div id=\"kcalOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Prote\u00ednas (g)<\/div>\n          <div id=\"pOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Carbohidratos (g)<\/div>\n          <div id=\"cOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Grasas (g)<\/div>\n          <div id=\"fOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n      <\/div>\n      <p id=\"nutriTips\" class=\"muted\" style=\"margin:8px 0 0;\">\u2014<\/p>\n    <\/div>\n  <\/section>\n\n<\/div>\n\n<script>\n\/* =========================\n   UTILIDADES\n========================= *\/\nconst $ = (sel, root=document) => root.querySelector(sel);\nconst $$ = (sel, root=document) => Array.from(root.querySelectorAll(sel));\n\nconst clamp = (n, a, b) => Math.min(Math.max(n, a), b);\nconst toNum = (v) => {\n  const n = Number(v);\n  return Number.isFinite(n) ? n : 0;\n};\nconst roundTo = (value, step) => {\n  if (!step || step === \"none\") return value;\n  const s = Number(step);\n  if (!Number.isFinite(s) || s <= 0) return value;\n  return Math.round(value \/ s) * s;\n};\nconst fmtKg = (n) => `${n.toFixed(2)} kg`;\nconst fmtInt = (n) => `${Math.round(n)}`;\n\n\/* =========================\n   PERSISTENCIA (localStorage)\n========================= *\/\nconst LS_KEY = \"rm_suite_v1\";\nconst loadState = () => {\n  try { return JSON.parse(localStorage.getItem(LS_KEY) || \"{}\"); }\n  catch { return {}; }\n};\nconst saveState = (patch) => {\n  const st = loadState();\n  const next = { ...st, ...patch };\n  localStorage.setItem(LS_KEY, JSON.stringify(next));\n  return next;\n};\nconst bindAutosave = (id) => {\n  const el = document.getElementById(id);\n  if (!el) return;\n  const st = loadState();\n  if (st[id] !== undefined) el.value = st[id];\n  el.addEventListener(\"input\", () => saveState({ [id]: el.value }));\n  el.addEventListener(\"change\", () => saveState({ [id]: el.value }));\n};\n\n\/* =========================\n   1RM: CONFIG DE F\u00d3RMULAS (data-driven)\n========================= *\/\nconst FORMULAS = [\n  {\n    key:\"epley\", name:\"Epley\", year:1975,\n    ex:\"Bench Press\", note:\"Espalda apoyada; pies firmes.\",\n    calc:(w,r)=> w*(1+0.0333*r)\n  },\n  {\n    key:\"brzycki\", name:\"Brzycki\", year:1993,\n    ex:\"Squat\", note:\"Baja con control hasta paralelo (seg\u00fan movilidad).\",\n    calc:(w,r)=> (r>=37 ? 0 : w*(36\/(37-r)))\n  },\n  {\n    key:\"lander_exp\", name:\"Lander (exp)\", year:1985,\n    ex:\"Deadlift\", note:\"Espalda neutral; empuja el suelo.\",\n    calc:(w,r)=> (100*w)\/(48.8+53.8*Math.exp(-0.075*r))\n  },\n  {\n    key:\"wathan\", name:\"Wathan\", year:1994,\n    ex:\"Bench Press\", note:\"Controla el descenso; pausa breve si aplica.\",\n    \/\/ Muchos sitios repiten la forma exponencial tipo Lander\/Wathan.\n    calc:(w,r)=> (100*w)\/(48.8+53.8*Math.exp(-0.075*r))\n  },\n  {\n    key:\"mayhew\", name:\"Mayhew et al.\", year:1992,\n    ex:\"Squat\", note:\"Rango completo t\u00e9cnicamente s\u00f3lido.\",\n    calc:(w,r)=> (100*w)\/(52.2+41.9*Math.exp(-0.055*r))\n  },\n  {\n    key:\"oconner\", name:\"O'Conner et al.\", year:1989,\n    ex:\"Shoulder Press\", note:\"Evita arquear la espalda; core activo.\",\n    calc:(w,r)=> w*(1+0.025*r)\n  },\n  {\n    key:\"lombardi\", name:\"Lombardi\", year:1989,\n    ex:\"Leg Press\", note:\"Pies estables; controla profundidad.\",\n    calc:(w,r)=> (r<=0 ? 0 : w*Math.pow(r,0.10))\n  },\n  {\n    key:\"schwartz\", name:\"Schwartz\", year:1990,\n    ex:\"Bench Press\", note:\"No despegar gl\u00fateos del banco.\",\n    calc:(w,r)=> (r<=0 ? 0 : w*Math.pow(r,0.075))\n  },\n  {\n    key:\"ocarroll\", name:\"O'Carroll\", year:1988,\n    ex:\"Squat\", note:\"Rodillas siguen l\u00ednea del pie; tronco estable.\",\n    calc:(w,r)=> (r<=0 ? 0 : w*Math.pow(r,0.48))\n  },\n  {\n    key:\"coyle\", name:\"Coyle\", year:1992,\n    ex:\"Shoulder Press\", note:\"Press uniforme; sin rebotes.\",\n    calc:(w,r)=> w*(1+0.025*r)\n  }\n];\n\n\/* =========================\n   1RM: RENDER + L\u00d3GICA\n========================= *\/\nfunction renderRMTable(){\n  const tbody = $(\"#rmTable tbody\");\n  tbody.innerHTML = \"\";\n\n  const mode = $(\"#mode\").value;         \/\/ shared | perRow\n  const sharedReps = $(\"#sharedReps\").value;\n  const sharedWeight = $(\"#sharedWeight\").value;\n\n  for (const f of FORMULAS){\n    const tr = document.createElement(\"tr\");\n    tr.dataset.formula = f.key;\n\n    const repsId = `reps_${f.key}`;\n    const weightId = `w_${f.key}`;\n\n    tr.innerHTML = `\n      <td><strong>${f.name}<\/strong><\/td>\n      <td>${f.year ?? \"\u2014\"}<\/td>\n      <td>\n        <input type=\"number\" min=\"1\" max=\"20\" step=\"1\"\n          id=\"${repsId}\" placeholder=\"reps\" ${mode===\"shared\" ? \"disabled\" : \"\"}>\n      <\/td>\n      <td>\n        <input type=\"number\" min=\"0\" step=\"0.5\"\n          id=\"${weightId}\" placeholder=\"kg\" ${mode===\"shared\" ? \"disabled\" : \"\"}>\n      <\/td>\n      <td>${f.ex}<\/td>\n      <td class=\"small\">${f.note}<\/td>\n      <td class=\"result\" id=\"out_${f.key}\">\u2014<\/td>\n    `;\n    tbody.appendChild(tr);\n\n    \/\/ cargar valores previos (solo si perRow)\n    if (mode === \"perRow\"){\n      bindAutosave(repsId);\n      bindAutosave(weightId);\n    } else {\n      \/\/ al cambiar modo, igual seteamos valores visibles coherentes\n      $(`#${repsId}`).value = sharedReps || \"\";\n      $(`#${weightId}`).value = sharedWeight || \"\";\n    }\n  }\n\n  computeAllRM();\n}\n\nfunction getInputsForFormula(key){\n  const mode = $(\"#mode\").value;\n  if (mode === \"shared\"){\n    const r = clamp(toNum($(\"#sharedReps\").value), 0, 20);\n    const w = Math.max(0, toNum($(\"#sharedWeight\").value));\n    return { r, w };\n  } else {\n    const r = clamp(toNum($(`#reps_${key}`).value), 0, 20);\n    const w = Math.max(0, toNum($(`#w_${key}`).value));\n    return { r, w };\n  }\n}\n\nfunction computeAllRM(){\n  const rounding = $(\"#rounding\").value;\n  const values = [];\n\n  for (const f of FORMULAS){\n    const { r, w } = getInputsForFormula(f.key);\n    const outEl = $(`#out_${f.key}`);\n\n    \/\/ Reglas m\u00ednimas de validez\n    if (w <= 0 || r <= 0){\n      outEl.textContent = \"\u2014\";\n      continue;\n    }\n\n    const raw = f.calc(w, r);\n    const safe = Number.isFinite(raw) &#038;&#038; raw > 0 ? raw : 0;\n    const rounded = roundTo(safe, rounding);\n\n    if (!rounded){\n      outEl.textContent = \"\u2014\";\n      continue;\n    }\n\n    outEl.textContent = fmtKg(rounded);\n    values.push(rounded);\n  }\n\n  \/\/ resumen\n  if (!values.length){\n    $(\"#rmAvg\").textContent = \"\u2014\";\n    $(\"#rmMinMax\").textContent = \"\u2014\";\n    $(\"#rmCount\").textContent = \"0\";\n    return;\n  }\n\n  const avg = values.reduce((a,b)=>a+b,0)\/values.length;\n  const min = Math.min(...values);\n  const max = Math.max(...values);\n\n  $(\"#rmAvg\").textContent = fmtKg(roundTo(avg, $(\"#rounding\").value));\n  $(\"#rmMinMax\").textContent = `${fmtKg(min)} \/ ${fmtKg(max)}`;\n  $(\"#rmCount\").textContent = String(values.length);\n}\n\n\/* =========================\n   RUTINAS (config-driven)\n========================= *\/\nconst ROUTINES = [\n  {\n    title:\"Rutina 1\",\n    aero:\"Correr o caminar a paso ligero 15\u201320 min.\",\n    time:\"~90 min\",\n    rows:[\n      { ex:\"Squats (Sentadillas)\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.80, note:\"Espalda recta, control del descenso.\" },\n      { ex:\"Bench Press (Press banca)\", reps:\"6\u201310\", sets:\"3\", rest:\"1.5\u20132.5 min\", from:\"rmBench\", mult:0.80, note:\"Manos al ancho adecuado, esc\u00e1pulas estables.\" },\n      { ex:\"Deadlift (Peso muerto)\", reps:\"6\u20138\", sets:\"3\", rest:\"2\u20133 min\", from:\"rmDeadlift\", mult:0.80, note:\"Columna neutral, empuja el suelo.\" },\n      { ex:\"Leg Press (Prensa)\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmLegPress\", mult:0.80, note:\"Empuja con talones, core activo.\" },\n      { ex:\"Shoulder Press (Press hombros)\", reps:\"6\u201310\", sets:\"3\", rest:\"1.5\u20132 min\", from:\"rmShoulder\", mult:0.80, note:\"Evitar hiperextensi\u00f3n lumbar.\" },\n      { ex:\"Pull-ups (Dominadas)\", reps:\"5\u20138\", sets:\"3\", rest:\"2\u20133 min\", fixed:\"\u2014\", note:\"Propio peso \/ lastre seg\u00fan nivel.\" }\n    ]\n  },\n  {\n    title:\"Rutina 2\",\n    aero:\"Correr moderado 20\u201325 min (esfuerzo sostenido).\",\n    time:\"~95 min\",\n    rows:[\n      { ex:\"Leg Extensions\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.55, note:\"Controlado, sin rebotes.\" },\n      { ex:\"Dumbbell Rows\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.50, note:\"Espalda estable; sin impulso.\" },\n      { ex:\"Romanian Deadlift\", reps:\"8\u201310\", sets:\"3\", rest:\"1.5\u20132.5 min\", from:\"rmDeadlift\", mult:0.60, note:\"Caderas atr\u00e1s; tensi\u00f3n isquios.\" },\n      { ex:\"Dumbbell Flyes\", reps:\"10\u201315\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.35, note:\"Recorrido c\u00f3modo; control escapular.\" },\n      { ex:\"Lateral Raises\", reps:\"10\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmShoulder\", mult:0.30, note:\"Sin balanceo; codo semi-flex.\" },\n      { ex:\"Barbell Bicep Curls\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.30, note:\"Evitar cheating; contracci\u00f3n arriba.\" }\n    ]\n  },\n  {\n    title:\"Rutina 3\",\n    aero:\"Ciclismo moderado 25\u201330 min.\",\n    time:\"80\u201390 min (incluye aer\u00f3bico)\",\n    rows:[\n      { ex:\"Leg Press\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmLegPress\", mult:0.80, note:\"Core activo, control del descenso.\" },\n      { ex:\"Dumbbell Pullovers\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.40, note:\"Movimiento controlado; sin dolor hombro.\" },\n      { ex:\"Lat Pull-downs\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmDeadlift\", mult:0.50, note:\"Al pecho; evita tras nuca.\" },\n      { ex:\"Hammer Curls\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.30, note:\"Sin balancear tronco.\" },\n      { ex:\"Face Pulls\", reps:\"12\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmShoulder\", mult:0.25, note:\"Codos altos; hacia la cara.\" },\n      { ex:\"Shrug\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmDeadlift\", mult:0.35, note:\"Elevaci\u00f3n m\u00e1xima controlada.\" },\n      { ex:\"Tricep Dips (m\u00e1quina)\", reps:\"8\u201310\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.45, note:\"Baja con control; rango c\u00f3modo.\" }\n    ]\n  },\n  {\n    title:\"Rutina 4\",\n    aero:\"Caminata r\u00e1pida o trote ligero 20\u201325 min.\",\n    time:\"70\u201380 min (incluye aer\u00f3bico)\",\n    rows:[\n      { ex:\"Extensiones de piernas\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.55, note:\"Sin impulso; pausa arriba.\" },\n      { ex:\"Press Arnold\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmShoulder\", mult:0.65, note:\"Codos al frente al inicio; controla rotaci\u00f3n.\" },\n      { ex:\"Barbell Row\", reps:\"8\u201310\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmDeadlift\", mult:0.45, note:\"Tronco firme; evita arqueo.\" },\n      { ex:\"Bicep Curl con barra\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.30, note:\"Sin balanceo; controla exc\u00e9ntrica.\" },\n      { ex:\"Dumbbell Flyes\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.35, note:\"Leve flexi\u00f3n de codo; sin dolor.\" }\n    ]\n  },\n  {\n    title:\"Rutina 5\",\n    aero:\"Bici est\u00e1tica o ciclismo 20\u201325 min.\",\n    time:\"75\u201385 min (incluye aer\u00f3bico)\",\n    rows:[\n      { ex:\"Step-ups\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.35, note:\"Sube\/baja pausado; controla rodilla.\" },\n      { ex:\"Rotaciones externas (bandas)\", reps:\"12\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", fixed:\"\u2014\", note:\"Trabajo t\u00e9cnico, baja carga.\" },\n      { ex:\"Dumbbell Row\", reps:\"8\u201310\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.50, note:\"Core activado; sin impulso.\" },\n      { ex:\"Bicep Curl (mancuernas)\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.25, note:\"Sin balanceo; rango completo.\" },\n      { ex:\"Tricep Dips (m\u00e1quina)\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.40, note:\"Controla descenso; rango c\u00f3modo.\" },\n      { ex:\"Leg Raises colgantes\", reps:\"10\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", fixed:\"\u2014\", note:\"Core activo; sin columpiar.\" }\n    ]\n  }\n];\n\nfunction renderRoutines(){\n  const container = $(\"#routinesContainer\");\n  container.innerHTML = \"\";\n\n  ROUTINES.forEach((rt, idx) => {\n    const card = document.createElement(\"div\");\n    card.className = \"card\";\n    card.innerHTML = `\n      <div class=\"section-title\">\n        <h2 style=\"font-size:14px; margin:0;\"><span class=\"pill\" style=\"margin-right:8px;\">${idx+1}<\/span>${rt.title}<\/h2>\n      <\/div>\n      <div style=\"overflow:auto;\">\n        <table>\n          <thead>\n            <tr>\n              <th>Ejercicio<\/th>\n              <th>Reps<\/th>\n              <th>Series<\/th>\n              <th>Descanso<\/th>\n              <th>Peso<\/th>\n              <th>Obs.<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody>\n            ${rt.rows.map((r,i)=>`\n              <tr data-routine=\"${idx}\" data-row=\"${i}\">\n                <td>${r.ex}<\/td>\n                <td>${r.reps}<\/td>\n                <td>${r.sets}<\/td>\n                <td>${r.rest}<\/td>\n                <td class=\"result\" id=\"rt_${idx}_${i}\">${r.fixed ?? \"\u2014\"}<\/td>\n                <td class=\"small\">${r.note}<\/td>\n              <\/tr>\n            `).join(\"\")}\n          <\/tbody>\n        <\/table>\n      <\/div>\n      <p class=\"muted\" style=\"margin:10px 0 0;\"><strong>Aer\u00f3bico:<\/strong> ${rt.aero}<\/p>\n      <p class=\"muted\" style=\"margin:4px 0 0;\"><strong>Tiempo estimado:<\/strong> ${rt.time}<\/p>\n    `;\n    container.appendChild(card);\n  });\n}\n\nfunction calcRoutines(){\n  const rounding = $(\"#rounding\").value; \/\/ reutilizamos redondeo\n  const rm = {\n    rmBench: Math.max(0, toNum($(\"#rmBench\").value)),\n    rmSquat: Math.max(0, toNum($(\"#rmSquat\").value)),\n    rmDeadlift: Math.max(0, toNum($(\"#rmDeadlift\").value)),\n    rmLegPress: Math.max(0, toNum($(\"#rmLegPress\").value)),\n    rmShoulder: Math.max(0, toNum($(\"#rmShoulder\").value))\n  };\n\n  \/\/ autosave RM\n  saveState({\n    rmBench: $(\"#rmBench\").value,\n    rmSquat: $(\"#rmSquat\").value,\n    rmDeadlift: $(\"#rmDeadlift\").value,\n    rmLegPress: $(\"#rmLegPress\").value,\n    rmShoulder: $(\"#rmShoulder\").value\n  });\n\n  ROUTINES.forEach((rt, idx) => {\n    rt.rows.forEach((row, i) => {\n      const cell = $(`#rt_${idx}_${i}`);\n      if (!cell) return;\n\n      if (row.fixed){\n        cell.textContent = row.fixed;\n        return;\n      }\n\n      const base = rm[row.from] || 0;\n      if (base <= 0){\n        cell.textContent = \"\u2014\";\n        return;\n      }\n      const val = roundTo(base * row.mult, rounding);\n      cell.textContent = fmtKg(val);\n    });\n  });\n}\n\n\/* =========================\n   FC OBJETIVO\n========================= *\/\nfunction calcHeartRate(){\n  const age = clamp(toNum($(\"#age\").value), 10, 100);\n  const mins = clamp(toNum($(\"#minutes\").value), 5, 300);\n  const goal = $(\"#goal\").value;\n\n  saveState({ age: $(\"#age\").value, minutes: $(\"#minutes\").value, goal });\n\n  if (!age){\n    $(\"#hrOut\").textContent = \"\u2014\";\n    $(\"#hrType\").textContent = \"\u2014\";\n    $(\"#hrTips\").textContent = \"Ingresa tu edad para estimar FC objetivo.\";\n    return;\n  }\n\n  const hrMax = 208 - 0.7 * age; \/\/ estimaci\u00f3n pr\u00e1ctica\n  let lo=0.60, hi=0.70, type=\"Zona moderada\", tips=\"\";\n\n  if (goal === \"salud\"){\n    lo=0.55; hi=0.70;\n    type=\"Continuo moderado\";\n    tips=\"Ideal 20\u201345 min, ritmo conversacional. 2\u20134 d\u00edas\/semana como base.\";\n  } else if (goal === \"bajar\"){\n    lo=0.60; hi=0.75;\n    type=\"Moderado sostenido + intervalos suaves\";\n    tips=\"Si tienes >25 min: 10\u201315 min moderado + 6\u201310 bloques de 30\u201360 s un poco m\u00e1s intenso.\";\n  } else if (goal === \"rendimiento\"){\n    lo=0.70; hi=0.85;\n    type=\"Umbral \/ intervalos\";\n    tips=\"Si tienes poco tiempo: intervalos (ej. 6\u201310\u00d71 min fuerte\/1 min suave). Prioriza t\u00e9cnica y recuperaci\u00f3n.\";\n  }\n\n  \/\/ Ajuste simple por tiempo (si es muy corto, sube intensidad sugerida)\n  if (mins <= 20 &#038;&#038; goal !== \"salud\"){\n    lo = Math.min(lo + 0.05, 0.85);\n    hi = Math.min(hi + 0.05, 0.90);\n    tips += \" Con poco tiempo, sube intensidad de forma progresiva y cuida el calentamiento.\";\n  }\n\n  const hrLo = Math.round(hrMax * lo);\n  const hrHi = Math.round(hrMax * hi);\n\n  $(\"#hrOut\").textContent = `${hrLo}\u2013${hrHi} lpm (HRmax\u2248${fmtInt(hrMax)})`;\n  $(\"#hrType\").textContent = type;\n  $(\"#hrTips\").textContent = tips;\n}\n\n\/* =========================\n   NUTRICI\u00d3N (Mifflin + macros)\n========================= *\/\nfunction calcNutrition(){\n  const sex = $(\"#sex\").value;\n  const age = clamp(toNum($(\"#nAge\").value), 10, 100);\n  const w = Math.max(0, toNum($(\"#nWeight\").value));\n  const h = Math.max(0, toNum($(\"#nHeight\").value));\n  const act = Number($(\"#activity\").value);\n  const goal = $(\"#nGoal\").value;\n\n  saveState({\n    sex, nAge: $(\"#nAge\").value, nWeight: $(\"#nWeight\").value, nHeight: $(\"#nHeight\").value,\n    activity: $(\"#activity\").value, nGoal: goal\n  });\n\n  if (!age || !w || !h){\n    $(\"#kcalOut\").textContent = \"\u2014\";\n    $(\"#pOut\").textContent = \"\u2014\";\n    $(\"#cOut\").textContent = \"\u2014\";\n    $(\"#fOut\").textContent = \"\u2014\";\n    $(\"#nutriTips\").textContent = \"Completa edad, peso y estatura.\";\n    return;\n  }\n\n  \/\/ Mifflin-St Jeor\n  const s = sex === \"m\" ? 5 : -161;\n  const bmr = 10*w + 6.25*h - 5*age + s;\n  let tdee = bmr * act;\n\n  \/\/ ajuste objetivo\n  let delta = 0;\n  if (goal === \"cut\") delta = -0.15;        \/\/ -15%\n  if (goal === \"bulk\") delta = +0.10;       \/\/ +10%\n  const kcal = tdee * (1 + delta);\n\n  \/\/ macros simples (ajustables)\n  \/\/ Prote: cut 2.0 g\/kg, maintain 1.6, bulk 1.8\n  const pPerKg = goal === \"cut\" ? 2.0 : (goal === \"bulk\" ? 1.8 : 1.6);\n  const p = pPerKg * w;\n\n  \/\/ Grasas: 0.8 g\/kg (cut\/maintain), 1.0 g\/kg (bulk)\n  const fPerKg = goal === \"bulk\" ? 1.0 : 0.8;\n  const f = fPerKg * w;\n\n  \/\/ Carbos por diferencia cal\u00f3rica\n  const kcalFromP = p * 4;\n  const kcalFromF = f * 9;\n  const c = Math.max(0, (kcal - kcalFromP - kcalFromF) \/ 4);\n\n  $(\"#kcalOut\").textContent = `${Math.round(kcal)} kcal`;\n  $(\"#pOut\").textContent = `${Math.round(p)} g`;\n  $(\"#fOut\").textContent = `${Math.round(f)} g`;\n  $(\"#cOut\").textContent = `${Math.round(c)} g`;\n\n  let tips = \"\";\n  if (goal === \"cut\") tips = \"En d\u00e9ficit: prioriza prote\u00edna, verduras y adherencia. Ajusta calor\u00edas cada 10\u201314 d\u00edas seg\u00fan progreso.\";\n  if (goal === \"maintain\") tips = \"Mantenci\u00f3n: estabiliza ingestas y revisa rendimiento\/energ\u00eda. Ajusta por pasos diarios y entrenamiento.\";\n  if (goal === \"bulk\") tips = \"Volumen: super\u00e1vit moderado + progresi\u00f3n de cargas. Si sube grasa muy r\u00e1pido, baja 100\u2013200 kcal.\";\n  $(\"#nutriTips\").textContent = tips;\n}\n\n\/* =========================\n   INICIALIZACI\u00d3N\n========================= *\/\nfunction init(){\n  \/\/ bind autosave b\u00e1sicos\n  [\"mode\",\"rounding\",\"sharedReps\",\"sharedWeight\",\n   \"rmBench\",\"rmSquat\",\"rmDeadlift\",\"rmLegPress\",\"rmShoulder\",\n   \"age\",\"minutes\",\"goal\",\"sex\",\"nAge\",\"nWeight\",\"nHeight\",\"activity\",\"nGoal\"\n  ].forEach(bindAutosave);\n\n  \/\/ restaurar selects si vienen como string\n  const st = loadState();\n  if (st.mode) $(\"#mode\").value = st.mode;\n  if (st.rounding) $(\"#rounding\").value = st.rounding;\n  if (st.goal) $(\"#goal\").value = st.goal;\n  if (st.activity) $(\"#activity\").value = st.activity;\n  if (st.nGoal) $(\"#nGoal\").value = st.nGoal;\n  if (st.sex) $(\"#sex\").value = st.sex;\n\n  renderRMTable();\n  renderRoutines();\n  calcRoutines();\n\n  \/\/ listeners RM\n  $(\"#mode\").addEventListener(\"change\", () => {\n    saveState({ mode: $(\"#mode\").value });\n    renderRMTable();\n  });\n  $(\"#rounding\").addEventListener(\"change\", () => {\n    saveState({ rounding: $(\"#rounding\").value });\n    computeAllRM();\n    calcRoutines();\n  });\n\n  \/\/ inputs shared\n  [\"sharedReps\",\"sharedWeight\"].forEach(id=>{\n    $(\"#\"+id).addEventListener(\"input\", () => {\n      computeAllRM();\n      \/\/ si estamos en shared, reflejamos visualmente los inputs de fila\n      if ($(\"#mode\").value === \"shared\"){\n        FORMULAS.forEach(f=>{\n          const r = $(\"#sharedReps\").value;\n          const w = $(\"#sharedWeight\").value;\n          const repsEl = $(`#reps_${f.key}`);\n          const wEl = $(`#w_${f.key}`);\n          if (repsEl) repsEl.value = r || \"\";\n          if (wEl) wEl.value = w || \"\";\n        });\n      }\n    });\n  });\n\n  \/\/ event delegation para inputs por fila (perRow)\n  $(\"#rmTable\").addEventListener(\"input\", (e) => {\n    const mode = $(\"#mode\").value;\n    if (mode !== \"perRow\") return;\n    const t = e.target;\n    if (!(t instanceof HTMLInputElement)) return;\n    if (!t.id.startsWith(\"reps_\") && !t.id.startsWith(\"w_\")) return;\n    saveState({ [t.id]: t.value });\n    computeAllRM();\n  });\n\n  \/\/ Rutinas\n  $(\"#calcRoutines\").addEventListener(\"click\", calcRoutines);\n\n  \/\/ HR\n  $(\"#calcHR\").addEventListener(\"click\", calcHeartRate);\n  [\"age\",\"minutes\",\"goal\"].forEach(id=>{\n    $(\"#\"+id).addEventListener(\"input\", () => { \/* opcional live *\/ });\n  });\n  if ($(\"#age\").value) calcHeartRate();\n\n  \/\/ Nutri\n  $(\"#calcNutri\").addEventListener(\"click\", calcNutrition);\n  if ($(\"#nAge\").value && $(\"#nWeight\").value && $(\"#nHeight\").value) calcNutrition();\n\n  \/\/ clear all\n  $(\"#clearAll\").addEventListener(\"click\", () => {\n    localStorage.removeItem(LS_KEY);\n    location.reload();\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", init);\n<\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Herramientas NutriDeportiva: 1RM + Rutinas + FC + Nutrici\u00f3n Calculadoras: 1RM (multi-f\u00f3rmula) + Rutinas FullBody + FC + Nutrici\u00f3n Versi\u00f3n unificada, con datos replicables, guardado [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2458","post","type-post","status-publish","format-standard","hentry","category-noticias"],"_links":{"self":[{"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/posts\/2458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/comments?post=2458"}],"version-history":[{"count":17,"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/posts\/2458\/revisions"}],"predecessor-version":[{"id":2940,"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/posts\/2458\/revisions\/2940"}],"wp:attachment":[{"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/media?parent=2458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/categories?post=2458"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/tags?post=2458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}