Improve solutions for 2024 day 2 and 3

This commit is contained in:
SebastianStork 2024-12-11 23:16:12 +01:00
parent 55e7f3c862
commit 1526a11a09
2 changed files with 37 additions and 20 deletions

View file

@ -4,8 +4,9 @@
using namespace std; using namespace std;
void readInput(vector<vector<int>> &list) vector<vector<int>> readInput()
{ {
vector<vector<int>> list;
string line; string line;
while (getline(cin, line)) { while (getline(cin, line)) {
list.push_back({}); list.push_back({});
@ -15,6 +16,7 @@ void readInput(vector<vector<int>> &list)
list.back().push_back(value); list.back().push_back(value);
} }
} }
return list;
} }
int getIndexOfUnsafeValue(const vector<int> &report) int getIndexOfUnsafeValue(const vector<int> &report)
@ -67,8 +69,7 @@ int calculateNumberOfSafeReports(const vector<vector<int>> &list, const bool app
int main() int main()
{ {
vector<vector<int>> list; vector<vector<int>> list = readInput();
readInput(list);
// Part one // Part one
cout << "Number of safe reports: " << calculateNumberOfSafeReports(list, false) << endl; cout << "Number of safe reports: " << calculateNumberOfSafeReports(list, false) << endl;

View file

@ -23,8 +23,10 @@ bool isNumber(const string &potentialNumber)
return true; return true;
} }
string getNextValidInstruction(string &line, const bool considerConditionals, bool &doMultiplication) string getNextValidInstruction(string &line, bool *doMultiplication = nullptr)
{ {
const bool considerConditionals = doMultiplication;
while (true) { while (true) {
{ {
size_t mulPosition = line.find("mul("); size_t mulPosition = line.find("mul(");
@ -35,17 +37,14 @@ string getNextValidInstruction(string &line, const bool considerConditionals, bo
if (considerConditionals) { if (considerConditionals) {
size_t doPosition = line.find("do()"); size_t doPosition = line.find("do()");
size_t dontPosition = line.find("don't()"); size_t dontPosition = line.find("don't()");
if ((doPosition < mulPosition) && (dontPosition < mulPosition)) { if ((doPosition < mulPosition) && (dontPosition < mulPosition)) {
if (doPosition > dontPosition) { *doMultiplication = doPosition > dontPosition;
doMultiplication = true;
} else {
doMultiplication = false;
}
} else { } else {
if (doPosition < mulPosition) { if (doPosition < mulPosition) {
doMultiplication = true; *doMultiplication = true;
} else if (dontPosition < mulPosition) { } else if (dontPosition < mulPosition) {
doMultiplication = false; *doMultiplication = false;
} }
} }
} }
@ -53,7 +52,7 @@ string getNextValidInstruction(string &line, const bool considerConditionals, bo
line.erase(0, mulPosition); line.erase(0, mulPosition);
} }
if (considerConditionals && !doMultiplication) { if (considerConditionals && !*doMultiplication) {
line.erase(0, 4); line.erase(0, 4);
continue; continue;
} }
@ -98,19 +97,36 @@ int getInstructionResult(const string &instruction)
return number1 * number2; return number1 * number2;
} }
int getResult(vector<string> lines, const bool considerConditionals) int calculateSumIgnoringConditionals(vector<string> lines)
{
int result = 0;
for (string &line : lines) {
while (true) {
string instruction = getNextValidInstruction(line);
if (instruction.empty()) {
break;
}
result += getInstructionResult(instruction);
}
}
return result;
}
int calculateSumConsideringConditionals(vector<string> lines)
{ {
int result = 0; int result = 0;
bool doMultiplication = true; bool doMultiplication = true;
for (string &line : lines) { for (string &line : lines) {
while (true) { while (true) {
string instruction = getNextValidInstruction(line, string instruction = getNextValidInstruction(line, &doMultiplication);
considerConditionals, if (instruction.empty()) {
doMultiplication);
if (instruction == "") {
break; break;
} }
result += getInstructionResult(instruction); result += getInstructionResult(instruction);
} }
} }
@ -123,9 +139,9 @@ int main()
vector<string> lines = readInput(); vector<string> lines = readInput();
// Part one // Part one
cout << "Sum of all the multiplication: " << getResult(lines, false) << endl; cout << "Sum of all the multiplications: " << calculateSumIgnoringConditionals(lines) << endl;
// Part two // Part two
cout << "Sum of all the multiplication (when taking the conditional statements into account): " cout << "Sum of all the multiplications (when taking the conditional statements into account): "
<< getResult(lines, true) << endl; << calculateSumConsideringConditionals(lines) << endl;
} }