Files
AdventOfCode/2024/day2.hpp
2025-11-03 22:11:31 +00:00

89 lines
1.8 KiB
C++

#include "aoc.hpp"
class Day02 : public AOCDay
{
public:
Day02() {}
~Day02() {}
int Day() override {return 2;}
bool isSafe(const std::vector<int>& levels)
{
if (levels.size() < 2)
return true;
int dir = (levels[1] - levels[0] > 0) ? 1 : -1;
for (size_t i = 1; i < levels.size(); ++i)
{
int diff = levels[i] - levels[i - 1];
if (diff == 0)
return false;
if (std::abs(diff) > 3)
return false;
if ((diff > 0 ? 1 : -1) != dir)
return false;
}
return true;
}
bool isSafeWithDampener(const std::vector<int>& levels)
{
// Already safe
if (isSafe(levels))
return true;
// BRUTE FORCE
for (size_t i = 0; i < levels.size(); ++i)
{
std::vector<int> copy = levels;
copy.erase(copy.begin() + i);
if (isSafe(copy))
return true;
}
return false;
}
int PartOne(File& f) override
{
f.SplitBy(" ");
int safe = 0;
for (int i = 0; i < f.Lines().size(); ++i)
{
std::vector<int> nums;
for (auto& token : f.TokensForLine(i))
nums.push_back(std::atoi(token.Data.c_str()));
if (isSafe(nums))
safe++;
}
return safe;
}
int PartTwo(File& f) override
{
int safe = 0;
for (int i = 0; i < f.Lines().size(); ++i)
{
std::vector<int> nums;
for (auto& token : f.TokensForLine(i))
nums.push_back(std::atoi(token.Data.c_str()));
if (isSafeWithDampener(nums))
safe++;
}
return safe;
}
};
ADD_AOC_DAY(Day02);