Solution for Day 1 in C++
This commit is contained in:
130
2025/Cpp/Day01/Day01.cpp
Normal file
130
2025/Cpp/Day01/Day01.cpp
Normal file
@@ -0,0 +1,130 @@
|
||||
#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()
|
||||
{
|
||||
Day01Solution solution;
|
||||
solution.SolveAll();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user