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)}`);