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
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
- 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["*"];
}
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
}
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);
}
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)