From f8fb16b03a91621bddf3415e596ad618976cf945 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Tue, 19 Dec 2023 23:45:28 +0100 Subject: cleanup code --- src/day19.cpp | 99 ++++++++++++++++++++++------------------------------------- 1 file changed, 37 insertions(+), 62 deletions(-) (limited to 'src/day19.cpp') diff --git a/src/day19.cpp b/src/day19.cpp index c991d6d..a1d4eab 100644 --- a/src/day19.cpp +++ b/src/day19.cpp @@ -22,7 +22,7 @@ split(string_view line, string_view delimiter) vector res; - while ( (pos_end = line.find(delimiter, pos_start)) != std::string::npos ) { + while ( (pos_end = line.find(delimiter, pos_start)) != string::npos ) { auto token = line.substr(pos_start, pos_end - pos_start); pos_start = pos_end + delimiter.length(); @@ -36,37 +36,8 @@ split(string_view line, string_view delimiter) } void -part1() +part1(map>, string>> rules, const vector& parts) { - const auto input = split(read_file("data/day19.txt"), "\n\n"); - const auto rules_string = split(input[0], "\n"); - const auto parts = split(input[1], "\n"); - - map>, string>> rules; - - for ( const auto& rule: rules_string ) { - static const regex rules_pattern{ R"((.*)\{(.*),(.*)\})" }; - - smatch smatch; - if ( regex_search(rule, smatch, rules_pattern) ) { - string rule_name = smatch[1]; - string default_dest = smatch[3]; - - vector> sub_rules; - - for ( const auto& sub_rule: split(smatch[2].str(), ",") ) { - static const regex sub_rules_pattern{ R"((.)(.)(\d*):(.*))" }; - - std::smatch smatch2; - if ( regex_search(sub_rule, smatch2, sub_rules_pattern) ) { - sub_rules.emplace_back(smatch2[1], smatch2[2], stol(smatch2[3]), smatch2[4]); - } - } - - rules[rule_name] = make_tuple(sub_rules, default_dest); - } - } - long sum = 0; for ( const auto& part: parts ) { static const regex parts_pattern{ R"(\{x=(\d*),m=(\d*),a=(\d*),s=(\d*)\})" }; @@ -110,36 +81,9 @@ part1() } void -part2() +part2(map>, string>> rules) { - const auto input = split(read_file("data/day19.txt"), "\n\n"); - const auto rules_string = split(input[0], "\n"); - - const regex rules_pattern{ R"((.*)\{(.*),(.*)\})" }; - const regex sub_rules_pattern{ R"((.)(.)(\d*):(.*))" }; - - map>, string>> rules; - - for ( const auto& rule: rules_string ) { - smatch smatch; - if ( regex_search(rule, smatch, rules_pattern) ) { - string rule_name = smatch[1]; - string default_dest = smatch[3]; - - vector> sub_rules; - - for ( const auto& sub_rule: split(smatch[2].str(), ",") ) { - std::smatch smatch2; - if ( regex_search(sub_rule, smatch2, sub_rules_pattern) ) { - sub_rules.emplace_back(smatch2[1], smatch2[2], stol(smatch2[3]), smatch2[4]); - } - } - - rules[rule_name] = make_tuple(sub_rules, default_dest); - } - } - - function>, string)> count = [&](map> ranges, string name) -> long { + function>, string)> count = [&](map> ranges, const string& name) -> long { if ( name == "R" ) { return 0; } @@ -203,6 +147,37 @@ part2() int main() { - part1(); - part2(); + const auto input = split(read_file("data/day19.txt"), "\n\n"); + const auto rules_string = split(input[0], "\n"); + const auto parts = split(input[1], "\n"); + + map>, string>> rules; + + for ( const auto& rule: rules_string ) { + static const regex rules_pattern{ R"((.*)\{(.*),(.*)\})" }; + + smatch smatch; + if ( !regex_search(rule, smatch, rules_pattern) ) { + continue; + } + + string name = smatch[1]; + string default_rule = smatch[3]; + + vector> sub_rules; + + for ( const auto& sub_rule: split(smatch[2].str(), ",") ) { + static const regex sub_rules_pattern{ R"((.)(.)(\d*):(.*))" }; + + std::smatch smatch2; + if ( regex_search(sub_rule, smatch2, sub_rules_pattern) ) { + sub_rules.emplace_back(smatch2[1], smatch2[2], stol(smatch2[3]), smatch2[4]); + } + } + + rules[name] = make_tuple(sub_rules, default_rule); + } + + part1(rules, parts); + part2(rules); } -- cgit v1.3