import fs from "fs"; enum HandType { highCard, onePair, twoPair, threeOfAKind, fullHouse, fourOfAKind, fiveOfAKind, } const cardStrength = [ "2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A", ]; function classifyHand(hand: string) { const cards = hand.split(""); const counts = Array.from(new Set(cards)) .map((card) => cards.filter((c) => c === card).length) .sort() .reverse(); if (counts[0] === 5) return HandType.fiveOfAKind; if (counts[0] === 4) return HandType.fourOfAKind; if (counts[0] === 3 && counts[1] === 2) return HandType.fullHouse; if (counts[0] === 3) return HandType.threeOfAKind; if (counts[0] === 2 && counts[1] === 2) return HandType.twoPair; if (counts[0] === 2) return HandType.onePair; return HandType.highCard; } const input = fs .readFileSync("./input.txt") .toString() .split("\n") .slice(0, -1) .map((line) => { const match = line.match(/(.....) (\d+)/); if (!match) throw new Error("Unexpected format"); return { hand: match[1], bid: Number(match[2]), type: classifyHand(match[1]), }; }) .sort((a, b) => { const diff = a.type - b.type; if (diff) return diff; return [0, 1, 2, 3, 4].reduce((acc, index) => { return acc ? acc : cardStrength.indexOf(a.hand[index]) - cardStrength.indexOf(b.hand[index]); }, 0); }) .reduce((sum, item, index) => sum + item.bid * (index + 1), 0); console.log({ input });