Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Timer de rounds kickboxing</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="timer-container">
<h1>Timer de rounds</h1>
<p id="timer-estado">Round 1 - 3s</p>
<div class="botones">
<button id="boton-iniciar">Iniciar</button>
<button id="boton-pausar">Pausar</button>
<button id="boton-reiniciar">Reiniciar</button>
</div>
</main>
<script src="maria-montepeque.js"></script>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
// 65. Timer de rounds kickboxing - Resolucion Maria Montepeque

const configTimer = { duracionRoundSeg: 3, duracionDescansoSeg: 2, totalRounds: 2 };

function esConfigValida(config) {
return (
config &&
Number.isInteger(config.duracionRoundSeg) &&
config.duracionRoundSeg > 0 &&
Number.isInteger(config.duracionDescansoSeg) &&
config.duracionDescansoSeg > 0 &&
Number.isInteger(config.totalRounds) &&
config.totalRounds > 0
);
}

function crearEstadoInicial(config) {
return {
faseActual: 'round',
roundActual: 1,
segundosRestantes: config.duracionRoundSeg,
corriendo: false,
finalizado: false
};
}

function avanzarUnSegundo(estado, config) {
if (estado.finalizado || !estado.corriendo) return estado;

if (estado.segundosRestantes > 1) {
return { ...estado, segundosRestantes: estado.segundosRestantes - 1 };
}

if (estado.faseActual === 'round') {
if (estado.roundActual >= config.totalRounds) {
return { ...estado, faseActual: 'finalizado', segundosRestantes: 0, corriendo: false, finalizado: true };
}
return { ...estado, faseActual: 'descanso', segundosRestantes: config.duracionDescansoSeg };
}

return { ...estado, faseActual: 'round', roundActual: estado.roundActual + 1, segundosRestantes: config.duracionRoundSeg };
}

function pausarTimer(estado) {
return { ...estado, corriendo: false };
}

function reanudarTimer(estado) {
return estado.finalizado ? estado : { ...estado, corriendo: true };
}

function reiniciarTimer(config) {
return crearEstadoInicial(config);
}

function simularSegundos(config, cantidadSegundos) {
if (!esConfigValida(config)) {
return { valido: false, motivo: 'configuracion invalida (duraciones o rounds deben ser enteros positivos)' };
}

let estado = reanudarTimer(crearEstadoInicial(config));
const historial = [{ ...estado }];

for (let i = 0; i < cantidadSegundos; i += 1) {
estado = avanzarUnSegundo(estado, config);
historial.push({ ...estado });
}

return { valido: true, config, historial, estadoFinal: estado };
}

function renderizarEstado(estado) {
if (typeof document === 'undefined') return;
const elemento = document.querySelector('#timer-estado');
if (!elemento) return;

elemento.textContent = estado.finalizado
? 'Finalizado'
: `${estado.faseActual === 'round' ? 'Round' : 'Descanso'} ${estado.roundActual} - ${estado.segundosRestantes}s`;
}

function inicializarTimer(config) {
if (typeof document === 'undefined') return;

let estado = crearEstadoInicial(config);
let intervalo = null;
renderizarEstado(estado);

const botonIniciar = document.querySelector('#boton-iniciar');
const botonPausar = document.querySelector('#boton-pausar');
const botonReiniciar = document.querySelector('#boton-reiniciar');

function tick() {
estado = avanzarUnSegundo(estado, config);
renderizarEstado(estado);
if (estado.finalizado && intervalo) {
clearInterval(intervalo);
intervalo = null;
}
}

if (botonIniciar) {
botonIniciar.addEventListener('click', () => {
if (estado.finalizado) return;
estado = reanudarTimer(estado);
if (!intervalo) intervalo = setInterval(tick, 1000);
});
}

if (botonPausar) {
botonPausar.addEventListener('click', () => {
estado = pausarTimer(estado);
if (intervalo) {
clearInterval(intervalo);
intervalo = null;
}
});
}

if (botonReiniciar) {
botonReiniciar.addEventListener('click', () => {
if (intervalo) {
clearInterval(intervalo);
intervalo = null;
}
estado = reiniciarTimer(config);
renderizarEstado(estado);
});
}
}

console.log('Caso 1: timer de 2 rounds (3s round, 2s descanso), se simulan 8 segundos hasta finalizar');
console.log(JSON.stringify(simularSegundos(configTimer, 8), null, 2));

console.log('\nCaso 2: configuracion invalida (duracion de round en 0)');
console.log(JSON.stringify(simularSegundos({ duracionRoundSeg: 0, duracionDescansoSeg: 2, totalRounds: 2 }, 5), null, 2));

inicializarTimer(configTimer);
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
body {
font-family: sans-serif;
background-color: #10131a;
color: #eef1f7;
display: flex;
justify-content: center;
padding: 3rem;
}

.timer-container {
text-align: center;
}

#timer-estado {
font-size: 1.8rem;
font-weight: bold;
margin: 1rem 0;
}

.botones {
display: flex;
gap: 0.5rem;
justify-content: center;
}

.botones button {
padding: 0.6rem 1rem;
border-radius: 4px;
border: none;
background-color: #4c9aff;
color: #10131a;
cursor: pointer;
}
Loading