update Readme to Day07
This commit is contained in:
97
Day07/js/solution.js
Normal file
97
Day07/js/solution.js
Normal file
@@ -0,0 +1,97 @@
|
||||
const fs = require('fs');
|
||||
|
||||
function readHands(filePath) {
|
||||
try {
|
||||
const data = fs.readFileSync(filePath, 'utf-8');
|
||||
console.log(`Reading hands from ${filePath}...`);
|
||||
return data.trim().split('\n').map(line => line.split(' '));
|
||||
} catch (err) {
|
||||
console.error(`Error reading file ${filePath}: ${err}`);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
function replaceFaceCards(hand) {
|
||||
return hand.replace(/T/g, 'a')
|
||||
.replace(/J/g, '1')
|
||||
.replace(/Q/g, 'c')
|
||||
.replace(/K/g, 'd')
|
||||
.replace(/A/g, 'e');
|
||||
}
|
||||
|
||||
function calculateStrength(hand) {
|
||||
hand = replaceFaceCards(hand);
|
||||
const counts = hand.split('').reduce((acc, card) => {
|
||||
acc[card] = (acc[card] || 0) + 1;
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
if ('1' in counts) {
|
||||
let maxCount = Math.max(...Object.values(counts));
|
||||
let maxCard = Object.keys(counts).find(card => counts[card] === maxCount && card !== '1');
|
||||
|
||||
if (maxCard) {
|
||||
counts[maxCard] += counts['1'];
|
||||
delete counts['1'];
|
||||
}
|
||||
}
|
||||
|
||||
const sortedCounts = Object.values(counts).sort((a, b) => b - a);
|
||||
|
||||
console.log(`Hand: ${hand}, Counts: ${sortedCounts}`);
|
||||
|
||||
if (sortedCounts.toString() === '5') return 10;
|
||||
if (sortedCounts.toString() === '1,4') return 9;
|
||||
if (sortedCounts.toString() === '2,3') return 8;
|
||||
if (sortedCounts.toString() === '1,1,3') return 7;
|
||||
if (sortedCounts.toString() === '1,2,2') return 6;
|
||||
if (sortedCounts.toString() === '1,1,1,2') return 5;
|
||||
if (sortedCounts.toString() === '1,1,1,1,1') return 4;
|
||||
|
||||
throw new Error(`Invalid hand: ${hand}, Counts: ${sortedCounts}`);
|
||||
}
|
||||
|
||||
function handKey(hand) {
|
||||
return calculateStrength(hand[0]);
|
||||
}
|
||||
|
||||
function calculateTotalWinnings(filePath) {
|
||||
try {
|
||||
const hands = readHands(filePath);
|
||||
console.log("Sorting hands based on strength...");
|
||||
hands.sort((a, b) => handKey(b) - handKey(a));
|
||||
|
||||
console.log("Calculating total winnings...");
|
||||
return hands.reduce((acc, [hand, bid], index) => {
|
||||
const winnings = (index + 1) * parseInt(bid, 10);
|
||||
console.log(`Hand: ${hand}, Rank: ${index + 1}, Bid: ${bid}, Winnings: ${winnings}`);
|
||||
return acc + winnings;
|
||||
}, 0);
|
||||
} catch (err) {
|
||||
console.error(`Error calculating winnings: ${err}`);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
function runTest(filePath, expected) {
|
||||
console.log(`Running test with ${filePath}...`);
|
||||
try {
|
||||
const totalWinnings = calculateTotalWinnings(filePath);
|
||||
console.assert(totalWinnings === expected, `Test failed, expected ${expected} but got ${totalWinnings}`);
|
||||
console.log(`Test passed: ${totalWinnings}`);
|
||||
} catch (err) {
|
||||
console.error(`Test failed: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
function main() {
|
||||
try {
|
||||
runTest("../test.txt", 5905);
|
||||
const result = calculateTotalWinnings("../input.txt");
|
||||
console.log(`Total result from input.txt: ${result}`);
|
||||
} catch (err) {
|
||||
console.error(`An error occurred: ${err}`);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user