#include #include #include #include #include #include int main() { std::fstream input("input"); std::string currentLine = "", lineOfOperations = ""; std::vector lines{}; std::vector results{}; std::vector startPositionOfOperations{}; while (std::getline(input, currentLine, '\n')) { lines.push_back(currentLine); } // Just removing the operations for a for loop below lineOfOperations = lines.back(); lines.pop_back(); // Since only 3 possibilities are '+', '*', and ' ' uint64_t count = 0; for (char character : lineOfOperations) { if (character != ' ') { startPositionOfOperations.push_back(count); } count++; } // Now we have each coloums length :^) count = 0; uint64_t total = 0; for (uint64_t PositionOfAnOperation : startPositionOfOperations) { std::vector currentOperationLines{}; bool isAddition = lineOfOperations[PositionOfAnOperation] == '+'; uint64_t thisOperationsResult = 0, number = 0, NextPositionOfAnOperation = startPositionOfOperations[std::min( ++count, startPositionOfOperations.size())]; // Storing these will ease our work for (std::string line : lines) { currentOperationLines.push_back( line.substr(PositionOfAnOperation, NextPositionOfAnOperation - PositionOfAnOperation)); } // Building the numbers like this was the easiest way, however I don't think // its efficient by any means for (uint16_t index = 0; index < currentOperationLines.begin()->length(); index++) { std::string builtNumber = ""; for (std::string subLine : currentOperationLines) { if (subLine[index] == ' ') { continue; } builtNumber.push_back(subLine[index]); } // Empty line, ignore if (builtNumber.empty()) { continue; } if (isAddition) { thisOperationsResult += std::stoull(builtNumber); continue; } if (thisOperationsResult != 0) { thisOperationsResult *= std::stoull(builtNumber); continue; } thisOperationsResult = std::stoull(builtNumber); } total += thisOperationsResult; } std::cout << total << std::endl; return 0; }