Skip to content

Commit 4a782cd

Browse files
authored
Merge pull request #7 from marcode24/2023
✨ add challenge-05 solution
2 parents f8a861a + fe37f76 commit 4a782cd

File tree

6 files changed

+329
-0
lines changed

6 files changed

+329
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Reto 05: El cybertruck de santa
2+
3+
## Problema
4+
5+
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:
6+
7+
- **. = Carretera**
8+
- **S = Trineo de Santa**
9+
- **\* = Barrera abierta**
10+
- **| = Barrera cerrada**
11+
12+
Ejemplo de carretera: `S...|....|.....`
13+
14+
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.
15+
16+
**Todas las barreras empiezan cerradas,** pero después de 5 unidades de tiempo, se abren todas **para siempre.**
17+
18+
**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:
19+
20+
```js
21+
const road = 'S..|...|..'
22+
const time = 10 // unidades de tiempo
23+
const result = cyberReindeer(road, time)
24+
25+
/* -> result:
26+
[
27+
'S..|...|..', // estado inicial
28+
'.S.|...|..', // avanza el trineo la carretera
29+
'..S|...|..', // avanza el trineo la carretera
30+
'..S|...|..', // el trineo para en la barrera
31+
'..S|...|..', // el trineo para en la barrera
32+
'...S...*..', // se abre la barrera, el trineo avanza
33+
'...*S..*..', // avanza el trineo la carretera
34+
'...*.S.*..', // avanza el trineo la carretera
35+
'...*..S*..', // avanza el trineo la carretera
36+
'...*...S..', // avanza por la barrera abierta
37+
]
38+
*/
39+
```
40+
41+
El resultado es un **array donde cada elemento muestra la carretera en cada unidad de tiempo.**
42+
43+
Ten en cuenta que **si el trineo está en la misma posición que una barrera,** entonces toma su lugar en el array.
44+
45+
Los elfos **se inspiraron en este reto de Code Wars.**
46+
47+
## Mi solución
48+
49+
```js
50+
const cyberReindeer = (road, time) => {
51+
const moves = [road];
52+
let currentPosition = 0;
53+
let b = '.';
54+
55+
for (let position = 1; position < time; position++) {
56+
if (position === 5) road = road.replace(/\|/g, '*');
57+
const newRoad = road.replace(/S[.*]/, `${b}S`);
58+
59+
if (newRoad !== road) {
60+
currentPosition++;
61+
b = road[currentPosition];
62+
}
63+
64+
road = newRoad;
65+
moves.push(road);
66+
}
67+
68+
return moves;
69+
};
70+
```
71+
72+
## Explicación de mi solución
73+
74+
1. Creo un array `moves` donde voy a guardar el estado de la carretera en cada unidad de tiempo.
75+
2. Creo una variable `currentPosition` que me va a indicar la posición actual del trineo en la carretera.
76+
3. Creo una variable `b` que me va a indicar el estado de la barrera en la posición actual del trineo.
77+
4. Recorro la carretera `time` veces.
78+
5. Si la posición actual es igual a 5, entonces reemplazo todas las barreras `|` por barreras abiertas `*`.
79+
6. Creo una nueva carretera `newRoad` donde reemplazo la posición actual del trineo `S` por el estado de la barrera `b` y el trineo `S`.
80+
7. Si la nueva carretera es diferente a la carretera anterior, entonces incremento la posición actual del trineo y actualizo el estado de la barrera `b`.
81+
8. Actualizo la carretera `road` con la nueva carretera `newRoad`.
82+
9. Agrego la carretera `road` al array `moves`.
83+
10. Retorno el array `moves`.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const cyberReindeer = (road, time) => {
2+
const moves = [road];
3+
let currentPosition = 0;
4+
let b = '.';
5+
6+
for (let position = 1; position < time; position++) {
7+
if (position === 5) road = road.replace(/\|/g, '*');
8+
const newRoad = road.replace(/S[.*]/, `${b}S`);
9+
10+
if (newRoad !== road) {
11+
currentPosition++;
12+
b = road[currentPosition];
13+
}
14+
15+
road = newRoad;
16+
moves.push(road);
17+
}
18+
19+
return moves;
20+
};
21+
22+
module.exports = cyberReindeer;
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
const cyberReindeer = require('./index');
2+
3+
describe('05 => El cybertruck de santa', () => {
4+
const testCases = [
5+
{
6+
input: ['S..|...|..', 10],
7+
output: [
8+
'S..|...|..',
9+
'.S.|...|..',
10+
'..S|...|..',
11+
'..S|...|..',
12+
'..S|...|..',
13+
'...S...*..',
14+
'...*S..*..',
15+
'...*.S.*..',
16+
'...*..S*..',
17+
'...*...S..',
18+
],
19+
},
20+
{
21+
input: ['S.|.', 4],
22+
output: [
23+
'S.|.',
24+
'.S|.',
25+
'.S|.',
26+
'.S|.',
27+
],
28+
},
29+
{
30+
input: ['S.|.|.', 7],
31+
output: [
32+
'S.|.|.',
33+
'.S|.|.',
34+
'.S|.|.',
35+
'.S|.|.',
36+
'.S|.|.',
37+
'..S.*.',
38+
'..*S*.',
39+
],
40+
},
41+
{
42+
input: ['S.|..', 6],
43+
output: [
44+
'S.|..',
45+
'.S|..',
46+
'.S|..',
47+
'.S|..',
48+
'.S|..',
49+
'..S..',
50+
],
51+
},
52+
{
53+
input: ['S.|.|.|......|.||.........', 8],
54+
output: [
55+
'S.|.|.|......|.||.........',
56+
'.S|.|.|......|.||.........',
57+
'.S|.|.|......|.||.........',
58+
'.S|.|.|......|.||.........',
59+
'.S|.|.|......|.||.........',
60+
'..S.*.*......*.**.........',
61+
'..*S*.*......*.**.........',
62+
'..*.S.*......*.**.........',
63+
],
64+
},
65+
];
66+
67+
it('should return an array type', () => {
68+
expect(Array.isArray(cyberReindeer('S|.....', 5))).toBe(true);
69+
});
70+
71+
it.each(testCases)('should return $output', ({ input, output }) => {
72+
expect(cyberReindeer(...input)).toEqual(output);
73+
});
74+
});

2023/06-los-renos-a-prueba/README.md

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

2023/06-los-renos-a-prueba/index.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/* eslint-disable no-restricted-syntax */
2+
3+
// complejidad: 4
4+
const maxDistance1 = (movements) => {
5+
const { move, stars } = movements.split('').reduce((acc, movement) => {
6+
if (movement === '>') acc.move++;
7+
else if (movement === '<') acc.move--;
8+
else acc.stars++;
9+
return acc;
10+
}, { move: 0, stars: 0 });
11+
12+
return Math.abs(move) + stars;
13+
};
14+
15+
// complejidad: 3
16+
// para el problema es la que mas da puntos
17+
const maxDistance2 = (movements) => {
18+
let move = 0;
19+
let stars = 0;
20+
21+
for (const movement of movements) {
22+
if (movement === '>') move++;
23+
else if (movement === '<') move--;
24+
else stars++;
25+
}
26+
27+
return Math.abs(move) + stars;
28+
};
29+
30+
// complejidad: 1
31+
const maxDistance3 = (movements) => {
32+
const left = movements.match(/</g)?.length ?? 0;
33+
const right = movements.match(/>/g)?.length ?? 0;
34+
const stars = movements.match(/\*/g)?.length ?? 0;
35+
return Math.abs(left - right) + stars;
36+
};
37+
38+
// complejidad: 1
39+
const maxDistance4 = (movements) => {
40+
const counts = { '<': 0, '>': 0, '*': 0 };
41+
42+
for (const movement of movements) {
43+
counts[movement]++;
44+
}
45+
46+
return Math.abs(counts['<'] - counts['>']) + counts['*'];
47+
};
48+
49+
module.exports = {
50+
maxDistance1,
51+
maxDistance2,
52+
maxDistance3,
53+
maxDistance4,
54+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const {
2+
maxDistance1, maxDistance2, maxDistance3, maxDistance4,
3+
} = require('./index');
4+
5+
describe('06 => Los renos a prueba', () => {
6+
const testCases = [
7+
{
8+
input: '>>*<',
9+
output: 2,
10+
},
11+
{
12+
input: '<<<<<',
13+
output: 5,
14+
},
15+
{
16+
input: '>***>',
17+
output: 5,
18+
},
19+
{
20+
input: '**********',
21+
output: 10,
22+
},
23+
];
24+
25+
it('should return a number type', () => {
26+
expect(typeof maxDistance1('')).toBe('number');
27+
expect(typeof maxDistance2('')).toBe('number');
28+
expect(typeof maxDistance3('')).toBe('number');
29+
expect(typeof maxDistance4('')).toBe('number');
30+
});
31+
32+
it.each(testCases)('should return $output', ({ input, output }) => {
33+
expect(maxDistance1(input)).toBe(output);
34+
expect(maxDistance2(input)).toBe(output);
35+
expect(maxDistance3(input)).toBe(output);
36+
expect(maxDistance4(input)).toBe(output);
37+
});
38+
});

0 commit comments

Comments
 (0)