#include "common/aoc.h" namespace y2016::day01 { struct Move { char r; int count; }; REGISTER_DAY(2016, Day01, std::vector, int); REGISTER_TEST_EXAMPLE(2016, Day01, ExampleInput, 1, 8); REGISTER_TEST(2016, Day01, Input, 1, 271); REGISTER_TEST_EXAMPLE(2016, Day01, ExampleInput, 2, 4); REGISTER_TEST(2016, Day01, Input, 2, 153); READ_INPUT(input) { std::vector vec; std::string str; while (getline(input, str, ' ')) { Move move; move.r = str[0]; move.count = std::strtol(&str[1], nullptr, 10); vec.emplace_back(move); } return vec; } OUTPUT1(input) { Index2D dir{1, 0}; Index2D pos{0, 0}; for (int i = 0; i < input.size(); i++) { if (input[i].r == 'R') dir.RotateCW(); else dir.RotateCCW(); pos = pos + dir * input[i].count; } return Helper::ManhattanDistance(pos, Index2D{0, 0}); } OUTPUT2(input) { Index2D dir{1, 0}; Index2D pos{0, 0}; std::set visited; visited.emplace(pos); for (int i = 0; i < input.size(); i++) { if (input[i].r == 'R') dir.RotateCW(); else dir.RotateCCW(); for (int j = 0; j < input[i].count; j++) { pos = pos + dir; if (visited.count(pos) != 0) { return Helper::ManhattanDistance(pos, Index2D{0, 0}); } visited.emplace(pos); } } return 0; } }