135 lines
3.2 KiB
C++
135 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 int mMaxPosition;
|
|
const int mMinPosition;
|
|
int mPosition;
|
|
const bool mDebug;
|
|
};
|
|
|
|
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));
|
|
|
|
switch (direction) {
|
|
case 'L':
|
|
dial.TurnLeft(amount);
|
|
break;
|
|
case 'R':
|
|
dial.TurnRight(amount);
|
|
break;
|
|
default:
|
|
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));
|
|
|
|
switch (direction) {
|
|
case 'L':
|
|
clicksAtZero += dial.TurnLeft(amount);
|
|
break;
|
|
case 'R':
|
|
clicksAtZero += dial.TurnRight(amount);
|
|
break;
|
|
default:
|
|
assert(false && "Invalid direction");
|
|
}
|
|
}
|
|
return std::to_string(clicksAtZero);
|
|
}
|
|
};
|
|
|
|
int main()
|
|
{
|
|
Day01Solution solution;
|
|
solution.SolveAll();
|
|
|
|
return 0;
|
|
}
|
|
|