|
| 1 | +# Reto 06: Los renos a prueba |
| 2 | + |
| 3 | +## Problema |
| 4 | + |
| 5 | +Los elfos están catalogando los renos de Santa 🦌 según la distancia que pueden recorrer. |
| 6 | + |
| 7 | +Para ello tienen una cadena de texto movements donde cada caracter representa la dirección del movimiento del reno: |
| 8 | + |
| 9 | +- **\> = Avanza a la derecha** |
| 10 | +- **< = Avanza a la izquierda** |
| 11 | +- **\* = Puede avanzar o retroceder** |
| 12 | + |
| 13 | +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. |
| 14 | + |
| 15 | +Los elfos quieren saber cuál es la máxima distancia que recorre el reno **al finalizar todos los movimientos.** |
| 16 | + |
| 17 | +**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. |
| 18 | + |
| 19 | +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:** |
| 20 | + |
| 21 | +```js |
| 22 | +const movements = '>>*<' |
| 23 | +const result = maxDistance(movements) |
| 24 | +console.log(result) // -> 2 |
| 25 | + |
| 26 | +const movements2 = '<<<>' |
| 27 | +const result2 = maxDistance(movements2) |
| 28 | +console.log(result2) // -> 2 |
| 29 | + |
| 30 | +const movements3 = '>***>' |
| 31 | +const result3 = maxDistance(movements3) |
| 32 | +console.log(result3) // -> 5 |
| 33 | +``` |
| 34 | + |
| 35 | +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.** |
| 36 | + |
| 37 | +## Mi solucion |
| 38 | + |
| 39 | +```js |
| 40 | +const maxDistance1 = (movements) => { |
| 41 | + const { move, stars } = movements.split('').reduce((acc, movement) => { |
| 42 | + if (movement === '>') acc.move++; |
| 43 | + else if (movement === '<') acc.move--; |
| 44 | + else acc.stars++; |
| 45 | + return acc; |
| 46 | + }, { move: 0, stars: 0 }); |
| 47 | + |
| 48 | + return Math.abs(move) + stars; |
| 49 | +}; |
| 50 | +``` |
| 51 | + |
| 52 | +## Explicación de mi solución |
| 53 | + |
| 54 | +1. Primero separamos los movimientos en un array de caracteres con `split('')`. |
| 55 | +2. Luego con `reduce` vamos a ir sumando los movimientos a la derecha y a la izquierda y los asteriscos. |
| 56 | +3. Al finalizar el `reduce` tenemos un objeto con la cantidad de movimientos a la derecha, a la izquierda y los asteriscos. |
| 57 | +4. Para obtener la distancia máxima, sumamos los movimientos a la derecha y a la izquierda y le sumamos los asteriscos. |
| 58 | +5. Como la distancia puede ser negativa, usamos `Math.abs` para obtener el valor absoluto de la distancia. |
0 commit comments