Skip to content

Instantly share code, notes, and snippets.

@jerolan
Created April 4, 2021 08:07
Show Gist options
  • Save jerolan/1506af3573af4d083dbb14d73cf7e52a to your computer and use it in GitHub Desktop.
Save jerolan/1506af3573af4d083dbb14d73cf7e52a to your computer and use it in GitHub Desktop.
// stringChallenge va a divide el problema en dos pequeñas soluciones
// conocer el valor en 24 horas, para hacer las fácil una comparación de tiempo entre 0 y 24
// convertir las horas en minutos para hacer una diferencia simple
function stringChallenge(strArr) {
// pair nos va a servir como auxiliar para comparar los elementos en el arreglo
// podríamos hacer una doble iteración y seria una solución fácil, pero no optima
let pair = [];
// min es el valor actual, de la diferencia entre las horas
// la estaremos actualizando a medida que hagamos las comparaciones
let min = 0;
for (let i = 0; i < strArr.length; i++) {
let in12 = strArr[i];
// de forma optimista agregamos los primeros dos elementos del arreglo en los
// pares, ya que por ahora no tenemos suficiente información para las comparaciones
if (i <= 1) {
pair.push(in12);
// calculamos el valor inical de min, en caso de que el arreglo solo tenga 2 elementos
// ya tenemos el valor necesario, de otra forma, lo usaremos para comparar `pair` con los demas valores
if (i === 1) {
min = calcPairDiff(pair);
}
continue;
}
let in24 = to24(in12);
let tail = pair[0];
let head = pair[1];
// con nuestros valores auxiliares, comparamos el numero en cuestion
// si la diferencia actual, es menor que el primer elemento en el par
// lo guardaremos para la siguiente iteración
if (min > calcPairDiff([tail, in24])) {
pair[0] = in12;
min = calcPairDiff([tail, in24]);
}
// si la diferencia actual, es menor que el segundo elemento en el par
// lo guardaremos para la siguiente iteración
if (min > calcPairDiff([head, in24])) {
pair[1] = in12;
min = calcPairDiff([head, in24]);
}
// si al final de las iteraciones, no apareció algún numero menor que el actual
// entonces ya tenemos el valor deseado.
}
return min;
}
// funcion de ayuda, para convertir las horas de 12 a 24 hrs
function to24(str) {
const spit = str.replace("am", "").replace("pm", "").split(":");
const hours = parseInt(spit[0], 10);
const minutes = parseInt(spit[1], 10);
let in24;
if (str.includes("pm")) {
in24 = hours + 12 === 24 ? "12" : hours + 12;
} else {
in24 = hours + 12 === 24 ? "24" : hours;
}
return `${in24}:${minutes}`;
}
// funcion de ayuda, para convertir las horas en minutos, solo funciona con horas en 24hrs
function toMinutes(hourIn24) {
const spit = hourIn24.split(":");
const hours = parseInt(spit[0], 10);
const minutes = parseInt(spit[1], 10);
return hours * 60 + minutes;
}
// funcion de ayuda, que nos ayuda a calcular la diferencia en un par
// exclusivamente, para arreglos con 2 elementos
// si miras donde usamos esta funcion mas arriba, encontraras que,
// creamos 2 "pares" temporales, [el valor que se esta iterando + tail], [el valor que se esta iterando + head]
// esto nos ayuda a reducir el codigo, y ademas tenemos una solucion simple que podemos reusar par todos los casos
function calcPairDiff(pair) {
let tail = pair[0];
let tailIn24 = to24(tail);
let tailInMinutes = toMinutes(tailIn24);
let head = pair[1];
let headIn24 = to24(head);
let headInMinutes = toMinutes(headIn24);
return Math.abs(tailInMinutes - headInMinutes);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment