Skip to content

Advent of Code 2023 Day Four

Published: at 02:08 AM

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