Here’s my solution to Day Four of Advent of Code.
Part 1
Once again, I reused a good bit of Part One on Part Two.
const testInput = `Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11`;
const parseInput = input => {
return input.split("\n").map((card, index) => {
const [, cardData] = card.split(": ");
const [winning, player] = cardData.split("|").map(str => str.trim());
const winningNumbers = parseNumbers(winning);
const playerNumbers = parseNumbers(player);
const totalWins = Array.from(playerNumbers).reduce(
(acc, card) => acc + winningNumbers.has(card),
0
);
return { id: index + 1, totalWins };
});
};
const parseNumbers = nums => {
return new Set(
nums
.replace(/ +/g, " ")
.split(" ")
.map(num => parseInt(num))
);
};
const sumPoints = cards => {
return cards.reduce(
(acc, card) => acc + (card.totalWins ? 2 ** (card.totalWins - 1) : 0),
0
);
};
console.log(sumPoints(parseInput(testInput))); // 13
Part 2
const sumCards = input => {
const cards = [...input];
for (let i = 0; i < cards.length; i++) {
for (let j = 0; j < cards[i].totalWins; j++) {
cards.push(input[cards[i].id + j]);
}
}
return cards.length;
};
console.log(sumCards(parseInput(testInput))); // 30