mirror of
https://github.com/SebastianStork/advent-of-code.git
synced 2026-01-21 14:31:34 +01:00
Improve solutions for 2024 day 2 and 3
This commit is contained in:
parent
55e7f3c862
commit
1526a11a09
2 changed files with 37 additions and 20 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue