#include #include #include #include #include #include #include #include #include #include #include #include namespace { auto Parse(std::istream & in) -> std::vector { std::vector result; std::string line; while (std::getline(in, line)) { result.emplace_back(std::move(line)); } return result; } auto Priority(char const c) -> std::int64_t { return c < 'a' ? c-'A'+27 : c-'a'+1; } auto Intersect(std::string const& a, std::string const& b) { std::string common; std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(common)); return common; } auto Part1(std::vector const& input) -> std::int64_t { std::int64_t n {0}; for (auto const& line : input) { auto m = line.size() / 2; auto elf1 {line.substr(0, m)}; std::sort(elf1.begin(), elf1.end()); auto elf2 {line.substr(m)}; std::sort(elf2.begin(), elf2.end()); n += Priority(Intersect(elf1, elf2).at(0)); } return n; } auto Part2(std::vector input) -> std::int64_t { std::int64_t n {0}; for (auto & line : input) { std::sort(line.begin(), line.end()); } for (std::size_t i = 0; i + 2 < input.size(); i += 3) { n += Priority(Intersect(Intersect(input[i], input[i+1]), input[i+2]).at(0)); } return n; } } // namespace TEST_SUITE("2022-03 examples") { TEST_CASE("example") { std::istringstream in { "vJrwpWtwJgWrhcsFMMfFFhFp\n" "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL\n" "PmmdzqPrVvPwwTWBwg\n" "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn\n" "ttgJtRGJQctTZtZT\n" "CrZsJsPPZsGzwwsLwLmpwMDw\n"}; auto input = Parse(in); CHECK(Part1(input) == 157); CHECK(Part2(std::move(input)) == 70); } } auto main(int argc, char** argv) -> int { auto input = Parse(*aocpp::Startup(argc, argv)); std::cout << "Part 1: " << Part1(input) << std::endl; std::cout << "Part 2: " << Part2(std::move(input)) << std::endl; }