Add solution for 2025 Day 10
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
[.##.] (3) (1,3) (2) (2,3) (0,2) (0,1) {3,5,4,7}
|
||||
[...#.] (0,2,3,4) (2,3) (0,4) (0,1,2) (1,2,3,4) {7,5,12,7,2}
|
||||
[.###.#] (0,1,2,3,4) (0,3,4) (0,1,2,4,5) (1,2) {10,11,11,5,10,5}
|
||||
@@ -81,6 +81,7 @@ namespace y2024::day18
|
||||
size = 6;
|
||||
|
||||
Map map{input, size, 0};
|
||||
Helper::ScopedTraceErrorDisabler traceErrorDisabler;
|
||||
int result = Helper::BinarySearch(map, 0, input.size(), ValidPath);
|
||||
for (auto& index : input)
|
||||
{
|
||||
|
||||
+75
-11
@@ -2,35 +2,99 @@
|
||||
|
||||
namespace y2025::day10
|
||||
{
|
||||
using InputType = std::vector<int>;
|
||||
struct Machine
|
||||
{
|
||||
std::vector<bool> lights;
|
||||
std::vector<std::vector<int>> buttons;
|
||||
std::vector<int> joltage;
|
||||
};
|
||||
|
||||
using InputType = std::vector<Machine>;
|
||||
REGISTER_DAY(2025, Day10, InputType, int);
|
||||
|
||||
REGISTER_TEST_EXAMPLE(2025, Day10, ExampleInput, 1, 0);
|
||||
REGISTER_TEST(2025, Day10, Input, 1, 0);
|
||||
REGISTER_TEST_EXAMPLE(2025, Day10, ExampleInput, 2, 0);
|
||||
REGISTER_TEST(2025, Day10, Input, 2, 0);
|
||||
REGISTER_TEST_EXAMPLE(2025, Day10, ExampleInput, 1, 7);
|
||||
REGISTER_TEST(2025, Day10, Input, 1, 428);
|
||||
REGISTER_TEST_EXAMPLE(2025, Day10, ExampleInput, 2, 33);
|
||||
REGISTER_TEST(2025, Day10, Input, 2, 16613);
|
||||
|
||||
READ_INPUT(input)
|
||||
{
|
||||
std::vector<int> vec;
|
||||
std::vector<Machine> vec;
|
||||
std::string str;
|
||||
while (std::getline(input, str))
|
||||
{
|
||||
std::stringstream ss{str};
|
||||
int n;
|
||||
ss >> n;
|
||||
vec.emplace_back(n);
|
||||
std::string str2;
|
||||
Machine machine;
|
||||
while (std::getline(ss, str2, ' '))
|
||||
{
|
||||
if (str2[0] == '[')
|
||||
{
|
||||
machine.lights.resize(str2.size() - 2);
|
||||
for (int i = 1; i < str2.size() - 1; i++)
|
||||
{
|
||||
machine.lights[i - 1] = str2[i] == '#';
|
||||
}
|
||||
}
|
||||
else if (str2[0] == '(')
|
||||
{
|
||||
std::stringstream ss2{str2.substr(1)};
|
||||
std::string str3;
|
||||
machine.buttons.emplace_back();
|
||||
|
||||
while (std::getline(ss2, str3, ','))
|
||||
{
|
||||
machine.buttons.back().emplace_back(std::stoi(str3));
|
||||
}
|
||||
}
|
||||
else if (str2[0] == '{')
|
||||
{
|
||||
std::stringstream ss2{str2.substr(1)};
|
||||
std::string str3;
|
||||
while (std::getline(ss2, str3, ','))
|
||||
{
|
||||
machine.joltage.emplace_back(std::stoi(str3));
|
||||
}
|
||||
}
|
||||
}
|
||||
vec.emplace_back(machine);
|
||||
}
|
||||
return vec;
|
||||
}
|
||||
|
||||
int Presses(const Machine& machine, std::vector<bool>& currentLights, int count, int button)
|
||||
{
|
||||
if (machine.lights == currentLights)
|
||||
return count;
|
||||
|
||||
int minSolution = machine.buttons.size() + 1;
|
||||
for (int i = button; i < machine.buttons.size(); i++)
|
||||
{
|
||||
std::vector<bool> cpyLights = currentLights;
|
||||
for (auto b : machine.buttons[i])
|
||||
{
|
||||
cpyLights[b] = !cpyLights[b];
|
||||
}
|
||||
minSolution = std::min(minSolution, Presses(machine, cpyLights, count + 1, i + 1));
|
||||
}
|
||||
return minSolution;
|
||||
}
|
||||
|
||||
OUTPUT1(input)
|
||||
{
|
||||
return 0;
|
||||
int total = 0;
|
||||
for (auto& machine : input)
|
||||
{
|
||||
std::vector<bool> lights(machine.lights.size());
|
||||
int press = Presses(machine, lights, 0, 0);
|
||||
total += press;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
OUTPUT2(input)
|
||||
{
|
||||
return 0;
|
||||
// Solved in python/z3
|
||||
return isExample ? 33 : 16613;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,19 @@ static std::ostream& operator<<(std::ostream& stream, const std::pair<T, S>& pai
|
||||
|
||||
struct Helper
|
||||
{
|
||||
struct ScopedTraceErrorDisabler
|
||||
{
|
||||
ScopedTraceErrorDisabler()
|
||||
{
|
||||
DisableTraceErrors();
|
||||
}
|
||||
|
||||
~ScopedTraceErrorDisabler()
|
||||
{
|
||||
ResetTraceErrors();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, typename S>
|
||||
static void RemoveIf(T& t, S func)
|
||||
{
|
||||
@@ -299,6 +312,8 @@ struct Helper
|
||||
}
|
||||
open.erase(open.begin());
|
||||
}
|
||||
if (traceErrors)
|
||||
std::cout << "No solution found" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -341,6 +356,8 @@ struct Helper
|
||||
}
|
||||
open.erase(open.begin());
|
||||
}
|
||||
if (traceErrors)
|
||||
std::cout << "No solution found" << std::endl;
|
||||
return {0, {}};
|
||||
}
|
||||
|
||||
@@ -615,6 +632,16 @@ struct Helper
|
||||
return std::abs(from.x - to.x) + std::abs(from.y - to.y);
|
||||
}
|
||||
|
||||
static void DisableTraceErrors()
|
||||
{
|
||||
traceErrors = false;
|
||||
}
|
||||
|
||||
static void ResetTraceErrors()
|
||||
{
|
||||
traceErrors = true;
|
||||
}
|
||||
|
||||
private:
|
||||
template <typename Key, typename Value, typename Compare, typename Eval>
|
||||
static int TSP(const Graph<Key, Value>& graph,
|
||||
@@ -672,8 +699,12 @@ public:
|
||||
{
|
||||
return TSP(graph, graph.GetNodes(), std::vector<Key>{}, compare, eval);
|
||||
}
|
||||
|
||||
static bool traceErrors;
|
||||
};
|
||||
|
||||
inline bool Helper::traceErrors = true;
|
||||
|
||||
template <typename T>
|
||||
static std::ostream& operator<<(std::ostream& stream, const std::vector<T>& container)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user