#include "AdventHelpers/AdventOfCodeSolution.h" #include #include #include 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; }