DEV Community

Cover image for AdventJS 2023: Reto del Día 6
Fenriuz
Fenriuz

Posted on • Updated on

AdventJS 2023: Reto del Día 6

Solución al reto #6 del AdventJS 2023
Solución del reto anterior
Solución del siguiente reto

Descripción del Reto

Los elfos están catalogando los renos de Santa 🦌 según la distancia que pueden recorrer.

Para ello tienen una cadena de texto movements donde cada caracter representa la dirección del movimiento del reno:

  • > = Avanza a la derecha
  • < = Avanza a la izquierda
  • * = Puede avanzar o retroceder Por ejemplo, si el movimiento es >>*<, va hacia la derecha dos veces, luego puede ir a derecha o izquierda (lo que maximice la distancia recorrida final) y luego ir a la izquierda.

Los elfos quieren saber cuál es la máxima distancia que recorre el reno al finalizar todos los movimientos.

En el ejemplo anterior, la máxima distancia que recorre el reno es 2. Va a la derecha dos veces +2, luego con el * puede ir a la derecha otra vez para maximizar la distancia +1 y luego va a la izquierda -1.

Crea una función maxDistance que reciba la cadena de texto movements y devuelva la máxima distancia que puede recorrer el reno en cualquier dirección:

const movements = '>>*<'
const result = maxDistance(movements)
console.log(result) // -> 2

const movements2 = '<<<>'
const result2 = maxDistance(movements2)
console.log(result2) // -> 2

const movements3 = '>***>'
const result3 = maxDistance(movements3)
console.log(result3) // -> 5
Enter fullscreen mode Exit fullscreen mode

Ten en cuenta que no importa si es a la izquierda o la derecha, la distancia es el valor absoluto de la distancia recorrida máxima al finalizar los movimientos.

Análisis

El objetivo es lograr encontrar la distancia máxima que pueden recorrer los renos. No importa si la recorren a la izquierda o derecha, el punto es encontrar la máxima distancia.

Entradas

  1. Movimientos(movements): Un string con los movimientos, donde cada caracter representa la dirección del movimiento del reno.

Salida

  • El número de la distancia máxima que se puede alcanzar con esos movimientos

Consideraciones

  • Se debe encontrar la distancia máxima sin importar si el movimiento es hacia la derecha o hacia la izquierda.

Solución

Resolver este ejercicio no es tan complicado y como siempre tenemos muchos caminos y alternativas.
Un enfoque sencillo es contar cuánto se repite cada movimiento y posterior a eso hacer la suma final para encontrar el resultado.

Código

/**
 * Calcula la distancia máxima basada en los movimientos dados.
 *
 * @param {string} movements - Una cadena que representa los movimientos.
 * @returns {number} La distancia máxima.
 */
function maxDistance(movements) {
    // Inicializa el objeto de direcciones con valores predeterminados
    const directions = {
        "<": 0, // Representa movimiento hacia la izquierda
        ">": 0  // Representa movimiento hacia la derecha
        "*": 0, // Representa movimiento a cualquier dirección
    };

    // Cuenta las ocurrencias de cada movimiento
    for (const movement of movements) {
        directions[movement] += 1;
    }

    // Calcula la distancia máxima
    // Math.abs() devuelve el valor absoluto de un número
    return Math.abs(directions["<"] - directions[">"]) + directions["*"];
}

Enter fullscreen mode Exit fullscreen mode

Soluciones de la comunidad

Solución por cristianstu:

function maxDistance(movements) {
    const a = movements.split(/>/g).length - 1
    const b = movements.split(/</g).length - 1
    const c = movements.length - a - b;

    return Math.abs(a - b) + c
}
Enter fullscreen mode Exit fullscreen mode

Solución por jfes29:

function maxDistance(movements) {
  let movements1 = movements.replaceAll("*", "");
  let movements2 = movements1.replaceAll("<", "");
  let movements3 = movements1.replaceAll(">", "");

  return movements.length - 2 * Math.min(movements2.length, movements3.length);
}
Enter fullscreen mode Exit fullscreen mode

Y ese fue el reto para el 5 de diciembre y sus soluciones. ¿Tienes otra solución alternativa? ¡Déjala en los comentarios!

Top comments (0)