Skip to content

Commit fe37f76

Browse files
committed
✨ add challenge-06 solution
1 parent facb1c4 commit fe37f76

File tree

3 files changed

+150
-0
lines changed

3 files changed

+150
-0
lines changed

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)