Public
Edited
Nov 27, 2022
1 star
Insert cell
Insert cell
Insert cell
function orbitGraph(input) {
return input
.map((orbit) => orbit.split(")").reverse())
.reduce((g, e) => g.addEdge(...e), Graph());
}
Insert cell
Insert cell
function sortedPlanets(input) {
return orbitGraph(input).topologicalSort();
}
Insert cell
Insert cell
function part1(input) {
const oFreqs = new Map();
const oGraph = orbitGraph(input);
const accumulateInnerPlanets = (p) => {
const pInner = oGraph.adjacent(p);
// Because tree, will only have 1 parent, or 0 if root.
if (pInner.length === 1) {
AOC.addToFreqTable(oFreqs, pInner[0]);
return accumulateInnerPlanets(pInner[0]);
}
return oFreqs;
};
sortedPlanets(input).forEach((p) => accumulateInnerPlanets(p));
return AOC.sum([...oFreqs.values()]);
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function part2(input) {
const oGraph = orbitGraph(input);
const sanPlanets = new Set(oGraph.shortestPath("SAN", "COM"));
const youPlanets = new Set(oGraph.shortestPath("YOU", "COM"));
const commonPlanets = AOC.intersection(sanPlanets, youPlanets);
return (
AOC.difference(youPlanets, commonPlanets).size +
+AOC.difference(sanPlanets, commonPlanets).size -
2
);
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
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