#include #include #include #include #include using namespace std; string read_file(string_view filename) { fstream input{ filename }; return { istream_iterator{ input }, {} }; } void part1(const string& data) { static const regex pattern(R"(mul\(\d{1,3},\d{1,3}\))"); long sum = 0; for ( auto it = sregex_iterator(data.begin(), data.end(), pattern); it != sregex_iterator(); ++it ) { long lhs = 0; long rhs = 0; sscanf(it->str().c_str(), "mul(%ld,%ld)", &lhs, &rhs); sum += lhs * rhs; } cout << sum << endl; } void part2(const string& data) { static const regex pattern(R"(do\(\)|don't\(\)|mul\(\d{1,3},\d{1,3}\))"); long sum = 0; bool state = true; for ( auto it = sregex_iterator(data.begin(), data.end(), pattern); it != sregex_iterator(); ++it ) { if ( it->str() == "do()" ) { state = true; } else if ( it->str() == "don't()" ) { state = false; } else if ( state ) { long lhs = 0; long rhs = 0; sscanf(it->str().c_str(), "mul(%ld,%ld)", &lhs, &rhs); sum += lhs * rhs; } } cout << sum << endl; } int main() { auto data = read_file("data/day03.txt"); part1(data); part2(data); }