diff --git a/Aufgabe 7/CMakeLists.txt b/Aufgabe 7/CMakeLists.txt new file mode 100644 index 0000000..5d9c13c --- /dev/null +++ b/Aufgabe 7/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.31) +project(Aufgabe_7) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(Aufgabe_7 main.cpp) diff --git a/Aufgabe 7/main.cpp b/Aufgabe 7/main.cpp new file mode 100644 index 0000000..c111df4 --- /dev/null +++ b/Aufgabe 7/main.cpp @@ -0,0 +1,107 @@ +#include +#include +#include +#include +struct Equation { + uint64_t testValue; + std::vector numbers; + + Equation(uint64_t testValue, const std::vector &numbers) : testValue(testValue), numbers(numbers) {} +}; + +std::vector readTextFromFile(const std::string& fileName) { + std::vector lines; + std::ifstream file(fileName); + if (!file) { // Überprüft, ob die Datei geöffnet werden konnte + std::cerr << "Fehler: Datei konnte nicht geöffnet werden: " << fileName << std::endl; + return lines; + } + std::string s; + while(getline(file, s)) { + lines.push_back(s); + } + return lines; +} + +std::vector splitString(const std::string& input, char ch) { + std::vector splittedString; + size_t pos = input.find(ch); + size_t initialPos = 0; + + while(pos != std::string::npos) { + splittedString.push_back(input.substr(initialPos, pos - initialPos)); + initialPos = pos + 1; + pos = input.find(ch, initialPos); + } + + splittedString.push_back(input.substr(initialPos, std::min(pos, input.size()) - initialPos)); + + return splittedString; +} + +std::vector parseEquations(std::vector& stringEquations) { + std::vector equations; + for(const auto& s : stringEquations) { + std::vector splittedString = splitString(s, ':'); + uint64_t testValue = std::stoull(splittedString[0]); + std::vector numbers; + std::vector euqationNumberString = splitString(splittedString[1], ' '); + + for(int i=1; i< euqationNumberString.size(); i++) { + numbers.push_back(std::stoull(euqationNumberString[i])); + } + equations.emplace_back(testValue, numbers); + } + return equations; +} + +bool backtrack(int index, uint64_t current_value, const Equation& equation) { + // Basisfall: We have processed all numbers + if(index == equation.numbers.size()) { + return current_value == equation.testValue; + } + + // Recursive case + uint64_t next_number = equation.numbers.at(index); + + // Option 1 : Add the next number + if(backtrack(index + 1, current_value + next_number, equation)) { + return true; + } + + if(backtrack(index + 1, current_value * next_number, equation)) { + return true; + } + + return false; +} + +bool isEquationCorrect(const Equation& equation) { + return backtrack(1, equation.numbers[0], equation); +} + +std::vector determineCorrectEquations(std::vector& equations) { + std::vector correctEquations; + for(const auto& equation : equations) { + if(isEquationCorrect(equation)) { + correctEquations.push_back(equation); + } + } + return correctEquations; +} + +uint64_t calcTotalCalibResult(std::vector& equations) { + uint64_t sum = 0; + for(const auto& eq : equations) { + sum += eq.testValue; + } + return sum; +} + +int main() { + std::vector input = readTextFromFile("../input.txt"); + std::vector equatons = parseEquations(input); + std::vector correctEquations = determineCorrectEquations(equatons); + std::cout << "The total calibration value is " << calcTotalCalibResult(correctEquations) << std::endl; + return 0; +}