Skip to content

Commit e398257

Browse files
committed
✨ Add challenge-25 solution
1 parent f42f125 commit e398257

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# Reto 25: Calculando distancias
2+
3+
## Problema
4+
5+
**Ya ha entregado Santa Claus 🎅 todos los regalos** a los niños pero quieren revisar si pueden mejorar de cara al año que viene.
6+
7+
Los elfos quieren saber c**uántos movimientos ha hecho Santa Claus** 🛷 para entregar todos los regalos. Para ello, te dan un mapa de la ciudad con la ubicación de cada niño y de Santa.
8+
9+
El mapa es una cadena de texto multi línea donde cada caracter representa una casilla. Los niños se representan por números del 1 al 9 y Santa Claus por la letra S. El resto de casillas son .
10+
11+
Santa Claus sólo puede moverse hacia arriba, abajo, izquierda o derecha, y cada movimiento cuenta como 1 km. Además, siempre empieza en la posición S y debe entregar los regalos en orden, del 1 al 9.
12+
13+
```js
14+
const map = `.....1....
15+
..S.......
16+
..........
17+
....3.....
18+
......2...`
19+
20+
const result = travelDistance(map)
21+
console.log(result) // -> 12 km
22+
/*
23+
De la S al niño 1: 4 movimientos
24+
Del niño 1 al 2: 5 movimientos
25+
Del niño 2 al 3: 3 movimientos
26+
Total: 12 movimientos
27+
*/
28+
29+
const result2 = travelDistance(`..S.1...`)
30+
console.log(result2) // -> 2
31+
```
32+
33+
Escribe una función travelDistance que reciba un mapa y devuelva la distancia total que ha recorrido Santa Claus según la posición de los niños.
34+
35+
Ten en cuenta que:
36+
37+
- El mapa no tiene por qué ser cuadrado.
38+
- El mapa siempre tendrá al menos un niño.
39+
- El mapa siempre tendrá una posición inicial para Santa Claus.
40+
- Los números de los niños nunca se repiten.
41+
42+
## Mi solución
43+
44+
```js
45+
function travelDistance(map) {
46+
const roadmapArr = map.split('\n');
47+
const roadmap = roadmapArr.join('');
48+
const rows = roadmapArr.length;
49+
const cols = roadmapArr[0].length;
50+
const len = roadmap.length;
51+
const santaPos = roadmap.indexOf('S');
52+
53+
let gift = 1;
54+
let movements = 0;
55+
let santaCol = santaPos % cols;
56+
let santaRow = Math.floor((santaPos * rows) / len);
57+
const numbers = roadmap.replace(/\.|S/g, '');
58+
59+
// eslint-disable-next-line no-restricted-syntax, no-underscore-dangle, no-unused-vars
60+
for (const _num of numbers) {
61+
const giftPos = roadmap.indexOf(`${gift}`);
62+
const giftCol = giftPos % cols;
63+
const giftRow = Math.floor((giftPos * rows) / len);
64+
movements += Math.abs(santaRow - giftRow);
65+
movements += Math.abs(santaCol - giftCol);
66+
santaCol = giftCol;
67+
santaRow = giftRow;
68+
gift++;
69+
}
70+
return movements;
71+
}
72+
```
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
function travelDistance(map) {
2+
const roadmapArr = map.split('\n');
3+
const roadmap = roadmapArr.join('');
4+
const rows = roadmapArr.length;
5+
const cols = roadmapArr[0].length;
6+
const len = roadmap.length;
7+
const santaPos = roadmap.indexOf('S');
8+
9+
let gift = 1;
10+
let movements = 0;
11+
let santaCol = santaPos % cols;
12+
let santaRow = Math.floor((santaPos * rows) / len);
13+
const numbers = roadmap.replace(/\.|S/g, '');
14+
15+
// eslint-disable-next-line no-restricted-syntax, no-underscore-dangle, no-unused-vars
16+
for (const _num of numbers) {
17+
const giftPos = roadmap.indexOf(`${gift}`);
18+
const giftCol = giftPos % cols;
19+
const giftRow = Math.floor((giftPos * rows) / len);
20+
movements += Math.abs(santaRow - giftRow);
21+
movements += Math.abs(santaCol - giftCol);
22+
santaCol = giftCol;
23+
santaRow = giftRow;
24+
gift++;
25+
}
26+
return movements;
27+
}
28+
29+
module.exports = travelDistance;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const travelDistance = require('./index');
2+
3+
describe('25 => Calculando distancias', () => {
4+
const testCases = [
5+
{
6+
input: '.....1....\n..S.......\n..........\n....3.....\n......2...',
7+
output: 12,
8+
},
9+
{
10+
input: '..S.1...',
11+
output: 2,
12+
},
13+
{
14+
input: '.....2....\n..S.......\n..........\n....1.....\n......3...',
15+
output: 13,
16+
},
17+
{
18+
input: '3....1....\n..S.......\n.........2\n..........\n......4...',
19+
output: 31,
20+
},
21+
{
22+
input: 'S1',
23+
output: 1,
24+
},
25+
{
26+
input: '1....S',
27+
output: 5,
28+
},
29+
{
30+
input: 'S12....3',
31+
output: 7,
32+
},
33+
];
34+
35+
it('should return a number type', () => {
36+
expect(typeof travelDistance(testCases[0].input)).toBe('number');
37+
});
38+
39+
it.each(testCases)('should return $output', ({ input, output }) => {
40+
expect(travelDistance(input)).toBe(output);
41+
});
42+
});

0 commit comments

Comments
 (0)