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}`;
}