Skip to content

Commit f76c8f5

Browse files
committed
Cambiar de nuevo los tests a js y test reto 6
1 parent e6134e2 commit f76c8f5

File tree

7 files changed

+100
-0
lines changed

7 files changed

+100
-0
lines changed
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

retos/reto-6/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 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++)`

retos/reto-6/reto6.test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
const maxDistance = require('./main.ts')
2+
3+
test('Test #01 - Returns a number', () => {
4+
expect(
5+
typeof maxDistance('>>*<')
6+
).toBe('number')
7+
})
8+
9+
test('Test #02 - maxDistance(">>*<")', () => {
10+
expect(maxDistance(">>*<")).toStrictEqual(2)
11+
})
12+
13+
14+
test('Test #03 - maxDistance("<<<<<")', () => {
15+
expect(maxDistance("<<<<<")).toStrictEqual(5)
16+
})
17+
18+
test('Test #04 - maxDistance(">***>")', () => {
19+
expect(maxDistance(">***>")).toStrictEqual(5)
20+
})
21+
22+
test('Test #05 - maxDistance("**********")', () => {
23+
expect(maxDistance("**********")).toStrictEqual(10)
24+
})
25+
26+
test('Test #06 - maxDistance("<<**>>")', () => {
27+
expect(maxDistance("<<**>>")).toStrictEqual(2)
28+
})

0 commit comments

Comments
 (0)