JavaScript
Ended up misreading the instructions due to trying to go fast. Built up a system to compare hand values like its poker before I realized its not poker
Likely last day im going to be able to write code for due to exams coming up
Code Block
// Part 1
// ======
function part1(input) {
const lines = input.replaceAll("\r", "").split("\n");
const hands = lines.map((line) => line.split(" "));
const sortedHands = hands.sort((a, b) => {
const handA = calculateHandValue(a[0]);
const handB = calculateHandValue(b[0]);
if (handA > handB) {
return -1;
} else if (handA < handB) {
return 1;
} else {
for (let i = 0; i < 5; i++) {
const handACard = convertToNumber(a[0].split("")[i]);
const handBCard = convertToNumber(b[0].split("")[i]);
if (handACard > handBCard) {
return 1;
} else if (handACard < handBCard) {
return -1;
}
}
}
});
return sortedHands
.filter((hand) => hand[0] != "")
.reduce((acc, hand, i) => {
return acc + hand[1] * (i + 1);
}, 0);
}
function convertToNumber(card) {
switch (card) {
case "A":
return 14;
case "K":
return 13;
case "Q":
return 12;
case "J":
return 11;
case "T":
return 10;
default:
return parseInt(card);
}
}
function calculateHandValue(hand) {
const dict = {};
hand.split("").forEach((card) => {
if (dict[card]) {
dict[card] += 1;
} else {
dict[card] = 1;
}
});
// 5
if (Object.keys(dict).length === 1) {
return 1;
}
// 4
if (Object.keys(dict).filter((key) => dict[key] === 4).length === 1) {
return 2;
}
// 3 + 2
if (
Object.keys(dict).filter((key) => dict[key] === 3).length === 1 &&
Object.keys(dict).filter((key) => dict[key] === 2).length === 1
) {
return 3;
}
// 3
if (Object.keys(dict).filter((key) => dict[key] === 3).length === 1) {
return 4;
}
// 2 + 2
if (Object.keys(dict).filter((key) => dict[key] === 2).length === 2) {
return 5;
}
// 2
if (Object.keys(dict).filter((key) => dict[key] === 2).length === 1) {
return 6;
}
return 7;
}
// Part 2
// ======
function part2(input) {
const lines = input.replaceAll("\r", "").split("\n");
const hands = lines.map((line) => line.split(" "));
const sortedHands = hands.sort((a, b) => {
const handA = calculateHandValuePart2(a[0]);
const handB = calculateHandValuePart2(b[0]);
if (handA > handB) {
return -1;
} else if (handA < handB) {
return 1;
} else {
for (let i = 0; i < 5; i++) {
const handACard = convertToNumberPart2(a[0].split("")[i]);
const handBCard = convertToNumberPart2(b[0].split("")[i]);
if (handACard > handBCard) {
return 1;
} else if (handACard < handBCard) {
return -1;
}
}
}
});
return sortedHands
.filter((hand) => hand[0] != "")
.reduce((acc, hand, i) => {
console.log(acc, hand, i + 1);
return acc + hand[1] * (i + 1);
}, 0);
}
function convertToNumberPart2(card) {
switch (card) {
case "A":
return 14;
case "K":
return 13;
case "Q":
return 12;
case "J":
return 1;
case "T":
return 10;
default:
return parseInt(card);
}
}
function calculateHandValuePart2(hand) {
const dict = {};
let jokers = 0;
hand.split("").forEach((card) => {
if (card === "J") {
jokers += 1;
return;
}
if (dict[card]) {
dict[card] += 1;
} else {
dict[card] = 1;
}
});
// 5
if (jokers === 5 || Object.keys(dict).length === 1) {
return 1;
}
// 4
if (
jokers === 4 ||
(jokers === 3 &&
Object.keys(dict).filter((key) => dict[key] === 1).length >= 1) ||
(jokers === 2 &&
Object.keys(dict).filter((key) => dict[key] === 2).length === 1) ||
(jokers === 1 &&
Object.keys(dict).filter((key) => dict[key] === 3).length === 1) ||
Object.keys(dict).filter((key) => dict[key] === 4).length === 1
) {
return 2;
}
// 3 + 2
if (
(Object.keys(dict).filter((key) => dict[key] === 3).length === 1 &&
Object.keys(dict).filter((key) => dict[key] === 2).length === 1) ||
(Object.keys(dict).filter((key) => dict[key] === 2).length === 2 &&
jokers === 1)
) {
return 3;
}
// 3
if (
Object.keys(dict).filter((key) => dict[key] === 3).length === 1 ||
(Object.keys(dict).filter((key) => dict[key] === 2).length === 1 &&
jokers === 1) ||
(Object.keys(dict).filter((key) => dict[key] === 1).length >= 1 &&
jokers === 2) ||
jokers === 3
) {
return 4;
}
// 2 + 2
if (
Object.keys(dict).filter((key) => dict[key] === 2).length === 2 ||
(Object.keys(dict).filter((key) => dict[key] === 2).length === 1 &&
jokers === 1)
) {
return 5;
}
// 2
if (
Object.keys(dict).filter((key) => dict[key] === 2).length === 1 ||
jokers
) {
return 6;
}
return 7;
}
export default { part1, part2 };
servers been going down to update every so often. Usually you can get in after a bit when that happens and its up atm