Skip to content

Commit 0391d29

Browse files
committed
Explicación Reto 5
1 parent 2a6e0bf commit 0391d29

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

retos/reto-5/README.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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 se queda quito, 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

Comments
 (0)