#include #include #include #include #include using namespace aocpp; namespace { auto Step(std::vector & spin, int steps) -> void { std::uint32_t cursor = spin.size() - 1; for (int i = 0; i < steps; i++) { cursor = spin[cursor]; } spin.push_back(spin[cursor]); spin[cursor] = spin.size() - 1; cursor = spin.size() - 1; } auto Part1(std::uint64_t jump, std::uint64_t iterations) -> std::uint64_t { std::vector spin {0}; for (int j = 0; j < iterations; j++) { Step(spin, jump); } return spin.back(); } auto Part2(std::uint64_t jump, std::uint64_t iterations) -> std::uint64_t { std::uint64_t cursor = 0; std::uint64_t after_zero = -1; for (std::uint64_t i = 1; i <= iterations; ++i) { cursor += jump; cursor %= i; if (cursor == 0) { after_zero = i; } cursor++; } return after_zero; } } // namespace TEST_SUITE("2017-17 examples") { TEST_CASE("example") { std::vector spin {0}; Step(spin, 3); REQUIRE(spin == std::vector{1,0}); Step(spin, 3); REQUIRE(spin == std::vector{2,0,1}); Step(spin, 3); REQUIRE(spin == std::vector{2,0,3,1}); CHECK(Part1(3, 2017) == 638); } } auto main(int argc, char** argv) -> int { int steps; *Startup(argc, argv) >> steps; std::cout << "Part 1: " << Part1(steps, 2017) << std::endl; std::cout << "Part 2: " << Part2(steps, 50'000'000) << std::endl; }