44 lines
1.6 KiB
TypeScript
44 lines
1.6 KiB
TypeScript
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)}`); |