This commit is contained in:
Feiko Wielsma 2025-12-10 09:41:58 +00:00
parent 9a3e228f00
commit b359a6dd54

View file

@ -70,12 +70,12 @@ static auto getDistances(const std::vector<Point> &pointVec) -> auto {
return sortedMap; return sortedMap;
} }
static auto doTheThing(const std::vector<Point> &pointVec, int numberToTake) -> auto { static auto doTheThing(const std::vector<Point> &pointVec, int numberToTake) -> long long {
auto distanceMap = getDistances(pointVec); auto distanceMap = getDistances(pointVec);
std::map<Point, int> pointToCircuitMap{}; std::map<Point, int> pointToCircuitMap{};
std::unordered_map<int, std::vector<Point>> circuitMap; std::unordered_map<int, std::vector<Point>> circuitMap;
int currentCircuit = 0; int currentCircuit = 0;
for (const auto &[combination, distance] : distanceMap | std::views::take(numberToTake)) { for (const auto &[combination, distance] : distanceMap) {
const auto &[left, right] = combination; const auto &[left, right] = combination;
// std::println("DistanceMap: {}:{} = {}", left, right, distance); // std::println("DistanceMap: {}:{} = {}", left, right, distance);
@ -84,13 +84,19 @@ static auto doTheThing(const std::vector<Point> &pointVec, int numberToTake) ->
int rightCircuit = pointToCircuitMap[right]; int rightCircuit = pointToCircuitMap[right];
// std::println("Left circuit: {}. Right circuit: {}", leftCircuit, rightCircuit); // std::println("Left circuit: {}. Right circuit: {}", leftCircuit, rightCircuit);
if (leftCircuit != rightCircuit) { if (leftCircuit != rightCircuit) {
// std::println("Fuck: {} to {}", left, right); std::println("Merge: {} to {}", left, right);
for (const auto &rightCircuitPoint : circuitMap[rightCircuit]) { for (const auto &rightCircuitPoint : circuitMap[rightCircuit]) {
pointToCircuitMap[rightCircuitPoint] = leftCircuit; pointToCircuitMap[rightCircuitPoint] = leftCircuit;
} }
circuitMap[leftCircuit].append_range(circuitMap[rightCircuit]); circuitMap[leftCircuit].append_range(circuitMap[rightCircuit]);
circuitMap.erase(rightCircuit); circuitMap.erase(rightCircuit);
// std::println("mergesize: {}", circuitMap[leftCircuit].size());
if (circuitMap[leftCircuit].size() >= pointVec.size()) {
return (long long)std::get<0>(left) * (long long)std::get<0>(right);
}
} }
} else if (pointToCircuitMap.contains(left)) { } else if (pointToCircuitMap.contains(left)) {
int leftCircuit = pointToCircuitMap[left]; int leftCircuit = pointToCircuitMap[left];
@ -98,12 +104,22 @@ static auto doTheThing(const std::vector<Point> &pointVec, int numberToTake) ->
pointToCircuitMap[right] = pointToCircuitMap[left]; pointToCircuitMap[right] = pointToCircuitMap[left];
circuitMap[leftCircuit].push_back(right); circuitMap[leftCircuit].push_back(right);
// std::println("leftsize: {}", circuitMap[leftCircuit].size());
if (circuitMap[leftCircuit].size() >= pointVec.size()) {
return (long long)std::get<0>(left) * (long long)std::get<0>(right);
}
} else if (pointToCircuitMap.contains(right)) { } else if (pointToCircuitMap.contains(right)) {
int rightCircuit = pointToCircuitMap[right]; int rightCircuit = pointToCircuitMap[right];
// std::println("Only right exists: {} to {}", left, right); // std::println("Only right exists: {} to {}", left, right);
pointToCircuitMap[left] = pointToCircuitMap[right]; pointToCircuitMap[left] = pointToCircuitMap[right];
circuitMap[rightCircuit].push_back(left); circuitMap[rightCircuit].push_back(left);
// std::println("rightsize: {}", circuitMap[rightCircuit].size());
if (circuitMap[rightCircuit].size() >= pointVec.size()) {
return (long long)std::get<0>(left) * (long long)std::get<0>(right);
}
} else { } else {
currentCircuit++; currentCircuit++;
pointToCircuitMap[left] = currentCircuit; pointToCircuitMap[left] = currentCircuit;
@ -145,11 +161,11 @@ auto main() -> int {
auto realPuzzle = parseInput("puzzle_input"); auto realPuzzle = parseInput("puzzle_input");
if (realPuzzle) { if (realPuzzle) {
auto realResult = doTheThing(*realPuzzle, 1000); // auto realResult = doTheThing(*realPuzzle, 1000);
std::println("P1 Real result: {}", realResult); // std::println("P1 Real result: {}", realResult);
// auto realResultP2 = treePartTwo(*realPuzzle); auto realResultP2 = doTheThing(*realPuzzle, 1000);
// std::println("P1 Real result: {}", realResultP2); std::println("P2 Real result: {}", realResultP2);
} else { } else {
std::print("{}\n", realPuzzle.error()); std::print("{}\n", realPuzzle.error());
} }