Created
April 4, 2021 08:07
-
-
Save jerolan/1506af3573af4d083dbb14d73cf7e52a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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