aoc-2023/day_4/solve_2.ts

44 lines
1.6 KiB
TypeScript
Raw Permalink Normal View History

2024-12-09 22:41:02 +09:00
type LottaryCard = {
id: number,
winningNumbers: number[],
numbersYouHave: number[]
}
function parseInput(line: string){
const m = /Card\s+(\d+):\s+((?:\d+\s*)+)\|\s+((?:\d+\s*)+)/.exec(line.trim());
if (!m){
throw new Error("Invalid line: " + line);
}
const id = parseInt(m[1]);
const winningNumbers = m[2].split(" ").filter(x => x.trim().length > 0).map(x => parseInt(x.trim()));
const numbersYouHave = m[3].split(" ").filter(x => x.trim().length > 0).map(x => parseInt(x.trim()));
return {id, winningNumbers, numbersYouHave};
}
function getMatchingsOfCard(card: LottaryCard){
const points = card.winningNumbers
.filter(x => card.numbersYouHave.indexOf(x) !== -1)
.length;
return points;
}
const input = await Deno.readTextFile("input.txt");
// const input = `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 lines = input.split("\n").map(x => x.trim()).filter(x => x.length > 0);
const cards = lines.map(parseInput);
const scratchCards = new Array(cards.length).fill(1);
for (let i = 0; i < cards.length; i++){
const card = cards[i];
const matchings = getMatchingsOfCard(card);
for (let j = i + 1; j < Math.min(matchings + i + 1, cards.length); j++){
scratchCards[j] += scratchCards[i];
}
console.log(scratchCards);
}
console.log(`Total: ${scratchCards.reduce((a, b) => a + b, 0)}`);