findContainingBags = (input, target) => {
const bags = input.split('\n').map(parseRule);
const bagsContainedBy = bags.reduce((memo, bag) => {
bag.rules.forEach(([_, innerColor]) => {
if (memo.has(innerColor)) {
memo.get(innerColor).push(bag.color);
} else {
memo.set(innerColor, [bag.color]);
}
});
return memo;
}, new Map());
const bagSet = new Set();
recursiveBagSearch(bagsContainedBy, bagSet, target);
return bagSet;
}