Public
Edited
Dec 7, 2023
Insert cell
Insert cell
rank = (hand, order = "23456789TJQKA") =>
[...hand]
.map((c) => order.indexOf(c) + 1)
.reverse()
.reduce((n, d, i) => n + 13 ** i * d)
Insert cell
type = (hand) => {
const groups = d3.rollup(
hand,
(r) => r.length,
(c) => c
);
const sizes = d3.sort(groups.values());
switch (groups.size) {
case 1:
return 6; // five of a kind
case 2:
return sizes[0] === 1
? 5 // four of a kind
: 4; // full house
case 3:
return sizes[2] === 3
? 3 // three of a kind
: 2; // two pair
case 4:
return 1; // one pair
default:
return 0; // high card
}
}
Insert cell
parsed = input
.trim()
.split("\n")
.map((line) => {
const [hand, score] = line.split(" ")
return { hand, score: +score };
})
Insert cell
part1 = d3
.sort(
parsed,
(d) => type(d.hand),
(d) => rank(d.hand)
)
.reduce((sum, d, i) => sum + d.score * (i + 1), 0)
Insert cell
type2 = (hand) => {
const groups = d3.rollup(
hand,
(r) => r.length,
(c) => c
);
if (groups.size > 1 && groups.has("J")) {
const j = groups.get("J");
groups.delete("J");
const [k, v] = d3.sort(groups.entries(), ([k, v]) => v).reverse()[0];
groups.set(k, v + j);
}
const sizes = d3.sort(groups.values());
switch (groups.size) {
case 1:
return 6; // five of a kind
case 2:
return sizes[0] === 1
? 5 // four of a kind
: 4; // full house
case 3:
return sizes[2] === 3
? 3 // three of a kind
: 2; // two pair
case 4:
return 1; // one pair
default:
return 0; // high card
}
}
Insert cell
part2 = d3
.sort(
parsed,
(d) => type2(d.hand),
(d) => rank(d.hand, "J23456789TQKA")
)
.reduce((sum, d, i) => sum + d.score * (i + 1), 0)
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more