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 getPointsOfCard(card: LottaryCard){
    const points = card.winningNumbers
        .filter(x => card.numbersYouHave.indexOf(x) !== -1)
        .length;
    return Math.floor(Math.pow(2,points - 1));
}

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);
console.log(cards[2])
console.log(cards.map(card=> getPointsOfCard(card)).reduce((a, b) => a + b, 0));