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.

Revisions

  1. jerolan created this gist Apr 4, 2021.
    94 changes: 94 additions & 0 deletions timeDifference.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,94 @@
    // 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);
    }