Files
AdventOfCode/2025/Cpp/Day01/Day01.cpp
2025-12-01 16:33:20 -05:00

133 lines
3.2 KiB
C++

#include "AdventHelpers/AdventOfCodeSolution.h"
#include <iostream>
#include <cassert>
#include <string>
class Dial {
public:
Dial(bool debug = false, int initialPosition = 50, int minPosition = 0, int maxPosition = 99)
: mDebug(debug)
, mPosition(initialPosition)
, mMinPosition(minPosition)
, mMaxPosition(maxPosition)
{
}
// Returns number of times it passes 0
int TurnLeft(int amount) {
int clicksAtZero = 0;
if (mDebug) std::cout << "Turning left " << amount << " from " << mPosition;
while (amount > 0) {
if (mPosition == 0) {
mPosition = mMaxPosition;
}
else {
mPosition--;
if (mPosition == 0) clicksAtZero++;
}
amount--;
}
assert(amount == 0);
if (mDebug) std::cout << " Ended at: " << mPosition << std::endl;
return clicksAtZero;
}
// Returns number of times it passes 0
int TurnRight(int amount) {
int clicksAtZero = 0;
if (mDebug) std::cout << "Turning right " << amount << " from " << mPosition;
while (amount > 0) {
if (mPosition == mMaxPosition) {
mPosition = 0;
clicksAtZero++;
}
else {
mPosition++;
}
amount--;
}
assert(amount == 0);
if (mDebug) std::cout << " Ended at: " << mPosition << std::endl;
return clicksAtZero;
}
int GetPosition() const {
return mPosition;
}
private:
const bool mDebug;
const int mMaxPosition;
const int mMinPosition;
int mPosition;
};
class Day01Solution : public AdventHelpers::AdventOfCodeSolution
{
public:
virtual std::string SolveProblem01(AdventHelpers::InputFileHelper& inputFile) override {
Dial dial;
int password = 0;
for (const auto& line : inputFile) {
assert(line.length() >= 2);
char direction = line[0];
int amount = std::stoi(line.substr(1));
if (direction == 'L') {
dial.TurnLeft(amount);
}
else if (direction == 'R') {
dial.TurnRight(amount);
}
else {
assert(false && "Invalid direction");
}
if (dial.GetPosition() == 0) {
password++;
}
}
return std::to_string(password);
}
virtual std::string SolveProblem02(AdventHelpers::InputFileHelper& inputFile) override {
Dial dial;
int clicksAtZero = 0;
for (const auto& line : inputFile) {
assert(line.length() >= 2);
char direction = line[0];
int amount = std::stoi(line.substr(1));
if (direction == 'L') {
clicksAtZero += dial.TurnLeft(amount);
}
else if (direction == 'R') {
clicksAtZero += dial.TurnRight(amount);
}
else {
assert(false && "Invalid direction");
}
}
return std::to_string(clicksAtZero);
}
};
int main(const char *argv[], int argc)
{
Day01Solution solution;
solution.SolveAll();
return 0;
}