Advertisement
Guest User

Untitled

a guest
Dec 4th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. namespace day3 {
  2.     namespace fs = std::filesystem;
  3.  
  4.     inline std::string read_file(fs::path const& path) {
  5.         std::ifstream reader(path);
  6.         return {std::istreambuf_iterator(reader), std::istreambuf_iterator<char>{}};
  7.     }
  8.  
  9.     inline int part_one(std::string const& data) {
  10.         std::regex const pattern(R"(mul\((\d{1,3}),(\d{1,3})\))");
  11.         std::sregex_iterator const begin(data.begin(), data.end(), pattern);
  12.         std::sregex_iterator const end;
  13.  
  14.         auto muls = std::ranges::subrange(begin, end) | std::views::transform([](auto&& match) {
  15.             return std::stoi(match[1].str()) * std::stoi(match[2].str());
  16.         });
  17.  
  18.         return std::ranges::fold_left(muls, 0, std::plus<>{});
  19.     }
  20.  
  21.     inline int part_two(std::string const& data) {
  22.         std::regex const pattern(R"(mul\((\d{1,3}),(\d{1,3})\)|do\(\)|don't\(\))");
  23.         std::sregex_iterator const begin(data.begin(), data.end(), pattern);
  24.         std::sregex_iterator const end;
  25.  
  26.         bool ignore = false;
  27.         auto muls = std::ranges::subrange(begin, end) | std::views::transform([&ignore](auto&& match) {
  28.             if (match[0].str() == "don't()") {
  29.                 ignore = true;
  30.                 return 0;
  31.             }
  32.             else if (match[0].str() == "do()") {
  33.                 ignore = false;
  34.                 return 0;
  35.             }
  36.  
  37.             return ignore ? 0 : std::stoi(match[1].str()) * std::stoi(match[2].str());
  38.         });
  39.  
  40.         return std::ranges::fold_left(muls, 0, std::plus<>{});
  41.     }
  42. }
  43.  
  44. int main() {
  45.     auto path = std::filesystem::current_path().parent_path() / "day3" / "input.txt";
  46.     auto data = day3::read_file(path);
  47.  
  48.     std::println("Part one: {}", day3::part_one(data));
  49.     std::println("Part two: {}", day3::part_two(data));
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement