From c8f0000c4db17305ca6404d7cc47803482f4d642 Mon Sep 17 00:00:00 2001 From: Thraix Date: Thu, 6 Aug 2026 22:17:35 +0200 Subject: [PATCH] Add solution for 2016 Day 1 --- res/2016/day01/test_input.txt | 2 +- src/2016/Day01.cpp | 58 ++++++++++++++++++++++++++++++----- src/common/lib/Array2D.h | 14 +++++++++ 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/res/2016/day01/test_input.txt b/res/2016/day01/test_input.txt index 00c8c89..1d6615f 100644 --- a/res/2016/day01/test_input.txt +++ b/res/2016/day01/test_input.txt @@ -1 +1 @@ -R5, L5, R5, R3 +R8, R4, R4, R8 diff --git a/src/2016/Day01.cpp b/src/2016/Day01.cpp index 0189836..c7087b9 100644 --- a/src/2016/Day01.cpp +++ b/src/2016/Day01.cpp @@ -2,30 +2,72 @@ namespace y2016::day01 { - REGISTER_DAY(2016, Day01, std::vector, int); + struct Move + { + char r; + int count; + }; - REGISTER_TEST_EXAMPLE(2016, Day01, ExampleInput, 1, 0); - REGISTER_TEST(2016, Day01, Input, 1, 0); - REGISTER_TEST_EXAMPLE(2016, Day01, ExampleInput, 2, 0); - REGISTER_TEST(2016, Day01, Input, 2, 0); + 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::vector vec; std::string str; - while (getline(input, 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) { - return 0; + 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; } } diff --git a/src/common/lib/Array2D.h b/src/common/lib/Array2D.h index 88c6ba9..fde1f5d 100644 --- a/src/common/lib/Array2D.h +++ b/src/common/lib/Array2D.h @@ -9,6 +9,20 @@ struct Index2D int x = -1; int y = -1; + void RotateCW() + { + int tmp = y; + y = x; + x = -tmp; + } + + void RotateCCW() + { + int tmp = y; + y = -x; + x = tmp; + } + bool IsValid() { return x != -1 && y != -1;