#include #include #include #include #include #include #include #include #include #include namespace { auto Solve(std::string const& input, std::size_t n) -> std::size_t { std::array counts {}; std::size_t uniques {0}; auto const inc = [&](char c) { uniques += 1 == ++counts[static_cast(c)]; }; auto const dec = [&](char c) { uniques -= 0 == --counts[static_cast(c)]; }; for (auto const i : boost::irange(n)) { inc(input[i]); } for (auto const i : boost::irange(n, input.size())) { dec(input[i-n]); inc(input[i]); if (uniques == n) { return i+1; } } throw std::runtime_error{"bad input"}; } } // namespace TEST_SUITE("2022-06 examples") { TEST_CASE("examples") { CHECK(Solve("bvwbjplbgvbhsrlpgdmjqwftvncz", 4) == 5); CHECK(Solve("nppdvjthqldpwncqszvftbrmjlhg", 4) == 6); CHECK(Solve("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 4) == 10); CHECK(Solve("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 4) == 11); CHECK(Solve("mjqjpqmgbljsphdztnvjfqwrcgsmlb", 14) == 19); CHECK(Solve("bvwbjplbgvbhsrlpgdmjqwftvncz", 14) == 23); CHECK(Solve("nppdvjthqldpwncqszvftbrmjlhg", 14) == 23); CHECK(Solve("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg", 14) == 29); CHECK(Solve("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw", 14) == 26); } } auto Main(std::istream & in, std::ostream & out) -> void { std::string input; std::getline(in, input); out << "Part 1: " << Solve(input, 4) << std::endl; out << "Part 2: " << Solve(input, 14) << std::endl; }