blob: f12ba25df0c99fe0005aea89e7680ba3bc3d54ef [file] [log] [blame]
Samuel Shuert2f7487d2023-12-04 20:53:43 -05001import { readFileSync } from "fs";
2
Samuel Shuert6e7cbc12023-12-05 20:11:54 -05003const time = Date.now();
Samuel Shuert2f7487d2023-12-04 20:53:43 -05004const input = readFileSync('day 4/input.txt').toString().split('\n');
5
6interface Card {
7 id: number,
8 winningNums: number[],
9 cardNums: number[]
10}
11
12const cards: Card[] = [];
13
14for (const line of input) {
15 const id: number = parseInt(line.match(/Card\s+(\d+)/)![1])
16 const withoutCardId = line.split(': ')[1]
17 const unformattedWinNums = withoutCardId.split('|')[0].trim().replace(/\s+/g, ' ');
18 const unformattedCardNums = withoutCardId.split('|')[1].trim().replace(/\s+/g, ' ');
19 const winningNums = unformattedWinNums.split(' ').map(i => parseInt(i));
20 const cardNums = unformattedCardNums.split(' ').map(i => parseInt(i));
21
22 cards.push({
23 id,
24 winningNums,
25 cardNums
26 })
27}
28
29const findMatches = (card: Card): number[] => {
30 const matches: number[] = []
31 card.cardNums.forEach(num => {
32 card.winningNums.includes(num) ? matches.push(num) : void 0;
33 })
34
35 return matches
36}
37
38// Part 1
39(() => {
40 let sum = 0;
41 for(const card of cards) {
42
43 const matches = findMatches(card);
44 if(!(matches.length > 0)) continue;
45 let mult: number = 0;
46 matches.forEach((i, idx) => {
47 idx === 0 ? mult = 1 : mult *= 2
48 })
49
50 sum += mult ?? 0
51
52 }
53 console.log(`(Part 1) Points: ${sum}`)
54})();
55
56// Part 2
57
58interface newCard extends Card {
59 copies: number
60}
61
62(() => {
63 const newCards: newCard[] = cards.map(card => {
64 return {...card, copies: 1}
65 });
66
67 for(let i = 0; i < newCards.length; i++) {
68 const card = newCards[i]
69 const matchCount = findMatches(card).length;
70 for(let j = matchCount; j > 0; j--) {
71 newCards[i+j].copies += (1 * card.copies);
72 }
73
74 }
75
76 console.log(`(Part 2) Total Scratchcards: ${newCards.reduce((acc, curr) => {
77 return acc + curr.copies;
78 }, 0)}`)
Samuel Shuert6e7cbc12023-12-05 20:11:54 -050079})();
80
81
82console.log(`Total Time (In millis): ${Date.now() - time}`)