|
| 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 | +``` |
0 commit comments