Advent JS 2021 - Dias 21 a 25

Día 21: “La ruta de los regalos”

Dificultad: Difícil

Primer ejercicio en el que se puede utilizar el método Object.values (junto con un reduce una vez más) para obtener los valores de un mapa de forma rápida y sencilla.

La dificultad recae en el algoritmo, yo opte por almacenar el número de paquetes por step y validar que nunca había mas de la capacidad máxima.

return Object.values(
    trips.reduce((acc, trip) => {
      const [items, start, end] = trip;
      for (let j = start; j < end; j++) {
        acc[j] = (acc[j] ?? 0) + items;
      }
      return acc;
    }, {})
  ).every((v) => v <= capacity);

Día 22: “¿Cuantos adornos necesita el árbol?"

Dificultad: Normal

Otro ejercicio más de recursión, mis favoritos! En este caso debemos atravesar un árbol por cada uno de sus nodos hasta que lleguemos al final.

function countDecorations(bigTree) {
  if (!bigTree) return 0;
  const { value, left, right } = bigTree;
  return countDecorations(right) + countDecorations(left) + value;
}

Día 23: “¿Puedes reconfigurar las fábricas para no parar de crear regalos?"

Dificultad: Muy Difícil

Y llegó el ejercicio más difícil de todo el Advent, clasificado como muy difícil te puedes hacer una idea de que esta va costar resolverlo.

Dicho todo eso y tras varias iteraciones conseguí resolverlo de forma sencilla:

return (
    from.length === to.length &&
    new Set([...from]).size === new Set([...to]).size
  );

La clave estaba en detectar caracteres únicos para después comparar las listas.

Día 24: “Comparando árboles de Navidad”

Dificultad: Normal

Otro dia mas aplicando recursion, no hay mucho más que añadir después de ver el día 22 ya.

Día 25: “El último juego y hasta el año que viene 👋”

Dificultad: Normal

Y después de 25 días de retos y diversión llega el momento de terminar el AdventJS.

Hoy aplicaremos la recursión para detectar dónde se encuentra el ratón y la comida para después movernos y comprobar si nuestro ratón va a comer algo.

function canMouseEat(direction, game) {
  const mouse = {};
  const food = [];
  for (let i = 0; i < game.length; i++) {
    for (let j = 0; j < game[0].length; j++) {
      if (game[i][j] === 'm') {
        mouse.x = j;
        mouse.y = i;
      }
      if (game[i][j] === '*') food.push(`${j},${i}`);
    }
  }

  const move = moveMouse(mouse, direction);
  return food.includes(move);
}

function moveMouse(mouse, direction) {
  if (direction === 'up') return `${mouse.x},${mouse.y - 1}`;
  if (direction === 'down') return `${mouse.x},${mouse.y + 1}`;
  if (direction === 'left') return `${mouse.x - 1},${mouse.y}`;
  return `${mouse.x + 1},${mouse.y}`;
}