|
| 1 | +# Reto 5 |
| 2 | + |
| 3 | +Santa 🎅 está probando su nuevo trineo eléctrico, el CyberReindeer, en una carretera del Polo Norte. La carretera se representa con una cadena de caracteres, donde: |
| 4 | + |
| 5 | +- . = Carretera |
| 6 | +- S = Trineo de Santa |
| 7 | +- \* = Barrera abierta |
| 8 | +- | = Barrera cerrada |
| 9 | + |
| 10 | +Ejemplo de carretera: `S...|....|.....` |
| 11 | + |
| 12 | +Cada unidad de tiempo, **el trineo avanza una posición a la derecha**. Si encuentra una barrera cerrada, se detiene hasta que la barrera se abra. Si está abierta, la atraviesa directamente. |
| 13 | + |
| 14 | +**Todas las barreras empiezan cerradas**, pero después de 5 unidades de tiempo, se abren todas **para siempre.** |
| 15 | + |
| 16 | +**Crea una función que simule el movimiento del trineo** durante un tiempo dado y **devuelva un array** de cadenas representando el estado de la carretera en cada unidad de tiempo: |
| 17 | + |
| 18 | +```js |
| 19 | +const road = "S..|...|.."; |
| 20 | +const time = 10; // unidades de tiempo |
| 21 | +const result = cyberReindeer(road, time); |
| 22 | + |
| 23 | +/* -> result: |
| 24 | +[ |
| 25 | +'S..|...|..', // estado inicial |
| 26 | +'.S.|...|..', // avanza el trineo la carretera |
| 27 | +'..S|...|..', // avanza el trineo la carretera |
| 28 | +'..S|...|..', // el trineo para en la barrera |
| 29 | +'..S|...|..', // el trineo para en la barrera |
| 30 | +'...S..._..', // se abre la barrera, el trineo avanza |
| 31 | +'..._S.._..', // avanza el trineo la carretera |
| 32 | +'..._.S._..', // avanza el trineo la carretera |
| 33 | +'..._..S_..', // avanza el trineo la carretera |
| 34 | +'..._...S..', // avanza por la barrera abierta |
| 35 | +] |
| 36 | +*/ |
| 37 | +``` |
| 38 | + |
| 39 | +El resultado es un **array donde cada elemento muestra la carretera en cada unidad de tiempo**. |
| 40 | + |
| 41 | +Ten en cuenta que **si el trineo está en la misma posición que una barrera**, entonces toma su lugar en el array. |
| 42 | + |
| 43 | +Los elfos se **inspiraron en este** [**reto de Code Wars**](https://www.codewars.com/kata/5d0ae91acac0a50232e8a547/javascript). |
| 44 | + |
| 45 | +# Solución |
| 46 | + |
| 47 | +Vamos a basar la solución en un regex que reemplazará `S.` y `S*`, ya que son los únicos movimientos válidos, pero tenemos un problema, y es que si pasamos por un `*`, debemos volver a ponerlo cuando hayamos avanzado nuevamente y esa posición quede atrás. |
| 48 | + |
| 49 | +Además, no olvidar que en el momento que pasen 5 segundos o iteraciones, debemos convertir todas las `|` a `*`. |
| 50 | + |
| 51 | +Lo que haremos para conservar los `*` es revisar si el reno se movió, en ese caso guardaremos la posición a la que se movió y en el siguiente movimiento la reemplazaremos, cosa que solo pasará hasta que el reno se pueda mover, ya que nuestro regex solo se ejecuta en movimientos válidos. |
| 52 | + |
| 53 | +Para guardar la posición y siguiente posición del reno, debemos usar una variable auxiliar, porque la del tiempo no mantiene los mismos valores de la posición del reno, puesto que a veces este no se mueve, esta variable, llamada `a` solo aumentará valor si el reno se movió: |
| 54 | + |
| 55 | +```js |
| 56 | +const newRoad = road.replace(/S[\.\*]/, `${b}S`); |
| 57 | +if (newRoad != road) { |
| 58 | + a++; |
| 59 | + b = road[a]; |
| 60 | +} |
| 61 | + |
| 62 | +// Se agrega el movimiento a la lista |
| 63 | + |
| 64 | +road = newRoad; |
| 65 | +moves.push(road); |
| 66 | +``` |
| 67 | + |
| 68 | +Algunas consideraciones: |
| 69 | + |
| 70 | +- `b` se debe iniciar en `let b = "."` |
| 71 | +- `moves` por defecto ya trae el camino original `let moves = [road]` |
| 72 | +- Ya que tenemos el camino original en `moves`, solo ejecutaremos el ciclo `time-1` veces `for (let i = 1; i < time; i++)` |
0 commit comments