blob: f12ba25df0c99fe0005aea89e7680ba3bc3d54ef [file] [log] [blame]
import { readFileSync } from "fs";
const time = Date.now();
const input = readFileSync('day 4/input.txt').toString().split('\n');
interface Card {
id: number,
winningNums: number[],
cardNums: number[]
}
const cards: Card[] = [];
for (const line of input) {
const id: number = parseInt(line.match(/Card\s+(\d+)/)![1])
const withoutCardId = line.split(': ')[1]
const unformattedWinNums = withoutCardId.split('|')[0].trim().replace(/\s+/g, ' ');
const unformattedCardNums = withoutCardId.split('|')[1].trim().replace(/\s+/g, ' ');
const winningNums = unformattedWinNums.split(' ').map(i => parseInt(i));
const cardNums = unformattedCardNums.split(' ').map(i => parseInt(i));
cards.push({
id,
winningNums,
cardNums
})
}
const findMatches = (card: Card): number[] => {
const matches: number[] = []
card.cardNums.forEach(num => {
card.winningNums.includes(num) ? matches.push(num) : void 0;
})
return matches
}
// Part 1
(() => {
let sum = 0;
for(const card of cards) {
const matches = findMatches(card);
if(!(matches.length > 0)) continue;
let mult: number = 0;
matches.forEach((i, idx) => {
idx === 0 ? mult = 1 : mult *= 2
})
sum += mult ?? 0
}
console.log(`(Part 1) Points: ${sum}`)
})();
// Part 2
interface newCard extends Card {
copies: number
}
(() => {
const newCards: newCard[] = cards.map(card => {
return {...card, copies: 1}
});
for(let i = 0; i < newCards.length; i++) {
const card = newCards[i]
const matchCount = findMatches(card).length;
for(let j = matchCount; j > 0; j--) {
newCards[i+j].copies += (1 * card.copies);
}
}
console.log(`(Part 2) Total Scratchcards: ${newCards.reduce((acc, curr) => {
return acc + curr.copies;
}, 0)}`)
})();
console.log(`Total Time (In millis): ${Date.now() - time}`)