Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6220eb4

Browse files
Merge pull request #17 from marcode24/2023
✨ Add challenge-25 solution
2 parents f42f125 + fab3a2b commit 6220eb4

File tree

4 files changed

+144
-0
lines changed

4 files changed

+144
-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+
});

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ npm run test 'year'/'challenge'/index.test.js
8080
| 22 | [Lenguaje de programación](https://adventjs.dev/es/challenges/2023/22) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/22-lenguaje-de-programacion) |
8181
| 23 | [La comida de navidad](https://adventjs.dev/es/challenges/2023/23) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/23-la-comida-de-navidad) |
8282
| 24 | [Brincos en la escalera](https://adventjs.dev/es/challenges/2023/24) | 🟡 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/24-brincos-en-la-escalera) |
83+
| 25 | [Calculando distancias](https://adventjs.dev/challenges/2023/25) | 🟡 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/25-calculando-distancias) |
8384

8485
Difficulties legend:
8586
🟢 Easy 🟡 Medium 🔴 Hard

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /