Add solution for 2025 Day 8

This commit is contained in:
Thraix
2025-12-08 21:48:49 +01:00
parent 4fb0b2c46c
commit a31feacf85
2 changed files with 110 additions and 11 deletions
+20
View File
@@ -0,0 +1,20 @@
162,817,812
57,618,57
906,360,560
592,479,940
352,342,300
466,668,158
542,29,236
431,825,988
739,650,466
52,470,668
216,146,977
819,987,18
117,168,530
805,96,715
346,949,466
970,615,88
941,993,340
862,61,35
984,92,344
425,690,689
+90 -11
View File
@@ -2,35 +2,114 @@
namespace y2025::day08
{
using InputType = std::vector<int>;
REGISTER_DAY(2025, Day08, InputType, int);
using InputType = std::vector<Index3D>;
REGISTER_DAY(2025, Day08, InputType, int64_t);
REGISTER_TEST_EXAMPLE(2025, Day08, ExampleInput, 1, 0);
REGISTER_TEST(2025, Day08, Input, 1, 0);
REGISTER_TEST_EXAMPLE(2025, Day08, ExampleInput, 2, 0);
REGISTER_TEST(2025, Day08, Input, 2, 0);
REGISTER_TEST_EXAMPLE(2025, Day08, ExampleInput, 1, 40);
REGISTER_TEST(2025, Day08, Input, 1, 122636);
REGISTER_TEST_EXAMPLE(2025, Day08, ExampleInput, 2, 25272);
REGISTER_TEST(2025, Day08, Input, 2, 9271575747);
READ_INPUT(input)
{
std::vector<int> vec;
std::vector<Index3D> vec;
std::string str;
while (std::getline(input, str))
{
std::stringstream ss{str};
int n;
ss >> n;
vec.emplace_back(n);
Index3D index;
ss >> index.x >> "," >> index.y >> "," >> index.z;
vec.emplace_back(index);
}
return vec;
}
std::multimap<int64_t, std::pair<Index3D, Index3D>> CalculateDistances(const std::vector<Index3D>& indices)
{
std::multimap<int64_t, std::pair<Index3D, Index3D>> distances;
for (int i = 0; i < indices.size(); i++)
{
for (int j = i + 1; j < indices.size(); j++)
{
Index3D offset = indices[i] - indices[j];
int64_t distance = (int64_t)offset.x * (int64_t)offset.x + (int64_t)offset.y * (int64_t)offset.y +
(int64_t)offset.z * (int64_t)offset.z;
distances.emplace(distance, std::pair{indices[i], indices[j]});
}
}
return distances;
}
void Connect(Index3D i1, Index3D i2, std::vector<std::set<Index3D>>& circuits)
{
int n1 = -1;
int n2 = -1;
for (int j = 0; j < circuits.size(); j++)
{
if (circuits[j].count(i1) != 0)
n1 = j;
if (circuits[j].count(i2) != 0)
n2 = j;
if (n1 != -1 && n2 != -1)
break;
}
if (n1 == -1 && n2 == -1)
{
circuits.emplace_back(std::set{i1, i2});
}
else if (n1 != -1 && n2 == -1)
{
circuits[n1].emplace(i2);
}
else if (n1 == -1 && n2 != -1)
{
circuits[n2].emplace(i1);
}
else if (n1 != -1 && n2 != -1 && n1 != n2)
{
std::set<Index3D> cpy = circuits[n2];
circuits[n1].insert(cpy.begin(), cpy.end());
circuits.erase(circuits.begin() + n2);
}
}
OUTPUT1(input)
{
return 0;
std::multimap<int64_t, std::pair<Index3D, Index3D>> distances = CalculateDistances(input);
std::vector<std::set<Index3D>> circuits;
auto it = distances.begin();
int count = isExample ? 10 : 1000;
for (int i = 0; i < count; i++, it++)
{
Connect(it->second.first, it->second.second, circuits);
}
std::sort(circuits.begin(),
circuits.end(),
[](const std::set<Index3D>& set1, const std::set<Index3D>& set2) { return set1.size() > set2.size(); });
int64_t product = 1;
for (int i = 0; i < 3; i++)
{
product *= circuits[i].size();
}
return product;
}
OUTPUT2(input)
{
return 0;
std::multimap<int64_t, std::pair<Index3D, Index3D>> distances = CalculateDistances(input);
std::vector<std::set<Index3D>> circuits;
for (int i = 0; i < input.size(); i++)
{
circuits.emplace_back(std::set{input[i]});
}
auto it = distances.begin();
for (; circuits.size() != 1; it++)
{
Connect(it->second.first, it->second.second, circuits);
}
it--;
return (int64_t)it->second.first.x * (int64_t)it->second.second.x;
}
}