Skip to content

Commit

Permalink
Merge pull request #17 from marcode24/2023
Browse files Browse the repository at this point in the history
✨ Add challenge-25 solution
  • Loading branch information
marcode24 authored Jan 16, 2024
2 parents f42f125 + fab3a2b commit 6220eb4
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 0 deletions.
72 changes: 72 additions & 0 deletions 2023/25-calculando-distancias/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Reto 25: Calculando distancias

## Problema

**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.

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.

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 .

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.

```js
const map = `.....1....
..S.......
..........
....3.....
......2...`

const result = travelDistance(map)
console.log(result) // -> 12 km
/*
De la S al niño 1: 4 movimientos
Del niño 1 al 2: 5 movimientos
Del niño 2 al 3: 3 movimientos
Total: 12 movimientos
*/

const result2 = travelDistance(`..S.1...`)
console.log(result2) // -> 2
```

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.

Ten en cuenta que:

- El mapa no tiene por qué ser cuadrado.
- El mapa siempre tendrá al menos un niño.
- El mapa siempre tendrá una posición inicial para Santa Claus.
- Los números de los niños nunca se repiten.

## Mi solución

```js
function travelDistance(map) {
const roadmapArr = map.split('\n');
const roadmap = roadmapArr.join('');
const rows = roadmapArr.length;
const cols = roadmapArr[0].length;
const len = roadmap.length;
const santaPos = roadmap.indexOf('S');

let gift = 1;
let movements = 0;
let santaCol = santaPos % cols;
let santaRow = Math.floor((santaPos * rows) / len);
const numbers = roadmap.replace(/\.|S/g, '');

// eslint-disable-next-line no-restricted-syntax, no-underscore-dangle, no-unused-vars
for (const _num of numbers) {
const giftPos = roadmap.indexOf(`${gift}`);
const giftCol = giftPos % cols;
const giftRow = Math.floor((giftPos * rows) / len);
movements += Math.abs(santaRow - giftRow);
movements += Math.abs(santaCol - giftCol);
santaCol = giftCol;
santaRow = giftRow;
gift++;
}
return movements;
}
```
29 changes: 29 additions & 0 deletions 2023/25-calculando-distancias/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
function travelDistance(map) {
const roadmapArr = map.split('\n');
const roadmap = roadmapArr.join('');
const rows = roadmapArr.length;
const cols = roadmapArr[0].length;
const len = roadmap.length;
const santaPos = roadmap.indexOf('S');

let gift = 1;
let movements = 0;
let santaCol = santaPos % cols;
let santaRow = Math.floor((santaPos * rows) / len);
const numbers = roadmap.replace(/\.|S/g, '');

// eslint-disable-next-line no-restricted-syntax, no-underscore-dangle, no-unused-vars
for (const _num of numbers) {
const giftPos = roadmap.indexOf(`${gift}`);
const giftCol = giftPos % cols;
const giftRow = Math.floor((giftPos * rows) / len);
movements += Math.abs(santaRow - giftRow);
movements += Math.abs(santaCol - giftCol);
santaCol = giftCol;
santaRow = giftRow;
gift++;
}
return movements;
}

module.exports = travelDistance;
42 changes: 42 additions & 0 deletions 2023/25-calculando-distancias/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
const travelDistance = require('./index');

describe('25 => Calculando distancias', () => {
const testCases = [
{
input: '.....1....\n..S.......\n..........\n....3.....\n......2...',
output: 12,
},
{
input: '..S.1...',
output: 2,
},
{
input: '.....2....\n..S.......\n..........\n....1.....\n......3...',
output: 13,
},
{
input: '3....1....\n..S.......\n.........2\n..........\n......4...',
output: 31,
},
{
input: 'S1',
output: 1,
},
{
input: '1....S',
output: 5,
},
{
input: 'S12....3',
output: 7,
},
];

it('should return a number type', () => {
expect(typeof travelDistance(testCases[0].input)).toBe('number');
});

it.each(testCases)('should return $output', ({ input, output }) => {
expect(travelDistance(input)).toBe(output);
});
});
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ npm run test 'year'/'challenge'/index.test.js
| 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) |
| 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) |
| 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) |
| 25 | [Calculando distancias](https://adventjs.dev/challenges/2023/25) | 🟡 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/25-calculando-distancias) |

Difficulties legend:
🟢 Easy 🟡 Medium 🔴 Hard
Expand Down

0 comments on commit 6220eb4

Please sign in to comment.