Skip to content

Instantly share code, notes, and snippets.

@fernandezmm
Created November 12, 2025 03:47
Show Gist options
  • Save fernandezmm/873424cb43570ba662389b65d681fbca to your computer and use it in GitHub Desktop.
Save fernandezmm/873424cb43570ba662389b65d681fbca to your computer and use it in GitHub Desktop.
<style>
.calculadora-torneo-na{font-family:sans-serif;background-color:#f9f9f9;border:1px solid #ddd;padding:15px;max-width:900px;margin:20px auto}.calculadora-torneo-na h2,.calculadora-torneo-na h3{text-align:center;color:#333;border-bottom:1px solid #eee;padding-bottom:8px}.calculadora-torneo-na h3{font-size:1.1em;color:#555;margin-top:20px}.contenedor-partidos{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;margin-bottom:20px}.partido{display:flex;align-items:center;justify-content:space-between;background:#fff;padding:8px;border:1px solid #e0e0e0}.partido[data-interzonal-key]{border:2px solid #0073aa}.partido-equipo{flex:1;font-size:.9em;font-weight:700}.partido-equipo.local{text-align:right;margin-right:5px}.partido-equipo.visitante{text-align:left;margin-left:5px}.partido-input{width:40px;text-align:center;font-size:1em;font-weight:700;border:1px solid #ccc;padding:4px}.partido-vs{font-size:.8em;color:#777;margin:0 4px}.calculadora-botones{display:flex;justify-content:center;gap:10px;margin:20px 0}.calculadora-botones button{padding:10px 20px;font-size:1em;font-weight:700;border:none;cursor:pointer}.calculadora-btn-calcular{background-color:#0073aa;color:#fff}.calculadora-btn-reset{background-color:#d54e21;color:#fff}.contenedor-tablas{display:grid;grid-template-columns:1fr;gap:20px}.tabla-posiciones{width:100%;border-collapse:collapse;font-size:.9em}.tabla-posiciones th,.tabla-posiciones td{border:1px solid #e0e0e0;padding:6px 4px;text-align:center}.tabla-posiciones th{background-color:#f0f0f0;font-weight:700}.tabla-posiciones td:nth-child(2){text-align:left;padding-left:5px;font-weight:500}.tabla-posiciones td:nth-child(3){font-weight:700;background-color:#f5f5f5}.tabla-posiciones tr.clasificado{background-color:#e0f7fa}.tabla-posiciones tr.clasificado td:nth-child(3){background-color:#d0f0f8}
</style>
<!-- CALCULADORA LITE -->
<div class="calculadora-torneo-na" id="calculadora-lite">
<h2>CALCULADORA DE LA CLASIFICACIÓN</h2>
<h3>Partidos que definen los Octavos de Final</h3>
<div class="contenedor-partidos">
<div class="partido" data-local="Estudiantes" data-visitante="Argentinos">
<span class="partido-equipo local">Estudiantes</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Argentinos</span>
</div>
<div
class="partido"
data-local="Central Córdoba"
data-visitante="Banfield"
>
<span class="partido-equipo local">C. Córdoba</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Banfield</span>
</div>
<div class="partido" data-local="Barracas" data-visitante="Huracán">
<span class="partido-equipo local">Barracas</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Huracán</span>
</div>
<div class="partido" data-local="Belgrano" data-visitante="Unión">
<span class="partido-equipo local">Belgrano</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Unión</span>
</div>
<div class="partido" data-local="Defensa" data-visitante="Ind. Rivadavia">
<span class="partido-equipo local">Defensa</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Ind. Rivadavia</span>
</div>
<div class="partido" data-local="Lanús" data-visitante="Atl. Tucumán">
<span class="partido-equipo local">Lanús</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Atl. Tucumán</span>
</div>
<div class="partido" data-local="San Lorenzo" data-visitante="Sarmiento">
<span class="partido-equipo local">San Lorenzo</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Sarmiento</span>
</div>
<div class="partido" data-local="Instituto" data-visitante="Talleres">
<span class="partido-equipo local">Instituto</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Talleres</span>
</div>
<div class="partido" data-local="Platense" data-visitante="Gimnasia">
<span class="partido-equipo local">Platense</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Gimnasia</span>
</div>
<div
class="partido"
data-local="Aldosivi"
data-visitante="San Martín"
data-interzonal-key="Ald-SM"
>
<span class="partido-equipo local">Aldosivi</span>
<input
class="partido-input local-score"
type="number"
min="0"
data-interzonal-input="Ald-SM-local"
/>
<span class="partido-vs">vs</span>
<input
class="partido-input visitante-score"
type="number"
min="0"
data-interzonal-input="Ald-SM-visitante"
/>
<span class="partido-equipo visitante">San Martín</span>
</div>
<div class="partido" data-local="Godoy Cruz" data-visitante="Riestra">
<span class="partido-equipo local">Godoy Cruz</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Riestra</span>
</div>
<div class="partido" data-local="Independiente" data-visitante="Central">
<span class="partido-equipo local">Independiente</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Central</span>
</div>
<div class="partido" data-local="Vélez" data-visitante="River">
<span class="partido-equipo local">Vélez</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">River</span>
</div>
<div class="partido" data-local="Newell's" data-visitante="Racing">
<span class="partido-equipo local">Newell's</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Racing</span>
</div>
<div class="partido" data-local="Boca Jrs." data-visitante="Tigre">
<span class="partido-equipo local">Boca Jrs.</span>
<input class="partido-input local-score" type="number" min="0" />
<span class="partido-vs">vs</span>
<input class="partido-input visitante-score" type="number" min="0" />
<span class="partido-equipo visitante">Tigre</span>
</div>
</div>
<div class="calculadora-botones">
<button class="calculadora-btn-calcular">Calcular Posiciones</button>
<button class="calculadora-btn-reset">Resetear</button>
</div>
<div
style="
color: #333;
font-size: 0.9em;
margin: 20px 0 15px 0;
text-align: center;
"
>
<span style="background-color: #e0f7fa"
><span
style="
border-radius: 4px;
border: 1px solid #b2ebf2;
padding: 3px 8px;
"
>&nbsp;</span
></span
>
= Clasificado a Octavos de Final
</div>
<div class="contenedor-tablas">
<div class="grupo">
<h3>GRUPO A</h3>
<figure class="table">
<table class="tabla-posiciones">
<thead>
<tr>
<th>#</th>
<th>Equipos</th>
<th>PTS</th>
<th>J</th>
<th>Gol</th>
<th>+/-</th>
<th>G</th>
<th>E</th>
<th>P</th>
</tr>
</thead>
<tbody id="tabla-body-a"></tbody>
</table>
</figure>
</div>
<div class="grupo">
<h3>GRUPO B</h3>
<figure class="table">
<table class="tabla-posiciones">
<thead>
<tr>
<th>#</th>
<th>Equipos</th>
<th>PTS</th>
<th>J</th>
<th>Gol</th>
<th>+/-</th>
<th>G</th>
<th>E</th>
<th>P</th>
</tr>
</thead>
<tbody id="tabla-body-b"></tbody>
</table>
</figure>
</div>
</div>
</div>
<script>
const dataA={'Boca Jrs.':[26,15,26,12,7,5,3],Unión:[24,15,20,13,6,6,3],'Central Córdoba':[23,15,16,10,5,8,2],Tigre:[22,15,14,11,5,7,3],Barracas:[22,15,18,16,5,7,3],Racing:[22,15,15,13,6,4,5],Argentinos:[21,15,16,12,6,3,6],Estudiantes:[21,15,16,16,6,3,6],Banfield:[20,15,14,20,6,2,7],Belgrano:[19,15,13,11,4,7,4],Defensa:[19,15,14,17,5,4,6],Huracán:[19,15,9,14,5,4,6],Aldosivi:[15,15,9,16,4,3,8],"Newell's":[14,15,13,22,3,5,7],'Ind. Rivadavia':[13,15,12,17,2,7,6]};
const dataB={Central:[31,15,18,7,8,7,0],Riestra:[27,15,18,11,8,3,4],Lanús:[27,15,17,12,8,3,4],Vélez:[25,15,19,12,7,4,4],'San Lorenzo':[23,15,12,10,6,5,4],River:[21,15,20,15,6,3,6],Talleres:[20,15,9,12,5,5,5],'San Martín':[19,15,11,12,4,7,4],Sarmiento:[19,15,12,16,5,4,6],Gimnasia:[19,15,11,16,6,1,8],'Atl. Tucumán':[18,15,16,19,5,3,7],Independiente:[15,15,13,13,3,6,6],Instituto:[15,15,9,17,3,6,6],Platense:[12,15,12,22,2,6,7],'Godoy Cruz':[11,15,10,18,1,8,6]};
function renderizar(tbody,data,filterKeys){if(!tbody)return;const arr=filterKeys.map(nombre=>{const s=data[nombre],df=s[2]-s[3];return{nombre:nombre,pts:s[0],j:s[1],gf:s[2],gc:s[3],df:df,g:s[4],e:s[5],p:s[6]}});arr.sort((a,b)=>{if(a.pts!==b.pts)return b.pts-a.pts;if(a.df!==b.df)return b.df-a.df;return b.gf-a.gf});tbody.innerHTML="";arr.forEach((eq,i)=>{const row=document.createElement("tr");row.dataset.team=eq.nombre;if(i<8){row.classList.add("clasificado")}row.innerHTML=`<td>${i+1}</td><td>${eq.nombre}</td><td>${eq.pts}</td><td>${eq.j}</td><td>${eq.gf}:${eq.gc}</td><td>${eq.df>0?"+":""}${eq.df}</td><td>${eq.g}</td><td>${eq.e}</td><td>${eq.p}</td>`;tbody.appendChild(row)})}
document.addEventListener("DOMContentLoaded",()=>{const c=document.getElementById("calculadora-lite");if(!c)return;const btnsCalc=c.querySelectorAll(".calculadora-btn-calcular"),btnsReset=c.querySelectorAll(".calculadora-btn-reset"),tbodyA=c.querySelector("#tabla-body-a"),tbodyB=c.querySelector("#tabla-body-b");c.querySelectorAll("[data-interzonal-input]").forEach(input=>{input.addEventListener("input",e=>{const key=e.target.dataset.interzonalInput,val=e.target.value;c.querySelectorAll(`[data-interzonal-input="${key}"]`).forEach(other=>{if(other!==e.target)other.value=val})})});const calcular=()=>{let dA=JSON.parse(JSON.stringify(dataA)),dB=JSON.parse(JSON.stringify(dataB)),dG={...dA,...dB},proc=new Set();c.querySelectorAll(".partido").forEach(p=>{const lN=p.dataset.local,vN=p.dataset.visitante,key=[lN,vN].sort().join("-");if(proc.has(key))return;const lS_i=p.querySelector(".local-score"),vS_i=p.querySelector(".visitante-score"),lS=parseInt(lS_i.value,10),vS=parseInt(vS_i.value,10);if(!isNaN(lS)&&!isNaN(vS)){proc.add(key);const dL=dG[lN],dV=dG[vN];if(!dL||!dV)return;dL[1]++;dV[1]++;dL[2]+=lS;dL[3]+=vS;dV[2]+=vS;dV[3]+=lS;if(lS>vS){dL[0]+=3;dL[4]++;dV[6]++}else if(vS>lS){dV[0]+=3;dV[4]++;dL[6]++}else{dL[0]+=1;dV[0]+=1;dL[5]++;dV[5]++}}});renderizar(tbodyA,dG,Object.keys(dataA));renderizar(tbodyB,dG,Object.keys(dataB))};const reset=()=>{c.querySelectorAll(".partido-input").forEach(i=>{i.value=""});renderizar(tbodyA,dataA,Object.keys(dataA));renderizar(tbodyB,dataB,Object.keys(dataB))};btnsCalc.forEach(b=>b.addEventListener("click",calcular));btnsReset.forEach(b=>b.addEventListener("click",reset));reset()});
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment