AdventJS 2023: Reto del Día 6
Tags: spanish, webdev, node, challenge
Published: 2023-12-07 17:51:53

Solución al [reto #6](https://adventjs.dev/es/challenges/2023/6) del [AdventJS 2023](https://adventjs.dev/es)
[Solución del reto anterior](https://dev.to/fenriuz/adventjs-2023-reto-del-dia-5-1dpk)
[Solución del siguiente reto](https://dev.to/fenriuz/adventjs-2023-reto-del-dia-7-57nm)

{%- # TOC start (generated with https://github.com/derlin/bitdowntoc) -%}

- [Descripción del Reto](#descripción-del-reto)
- [Análisis](#análisis)
   * [Entradas](#entradas)
   * [Salida](#salida)
   * [Consideraciones](#consideraciones)
- [Solución](#solución)
   * [Código](#código)
   * [Soluciones de la comunidad](#soluciones-de-la-comunidad)

{%- # TOC end -%}

## 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:

```javascript
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
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
```javascript
/**
 * 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](https://github.com/cristianstu):

```javascript
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](https://github.com/jfes29):

```javascript
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!