diff --git a/res/2016/day02/test_input.txt b/res/2016/day02/test_input.txt index e69de29..5139196 100644 --- a/res/2016/day02/test_input.txt +++ b/res/2016/day02/test_input.txt @@ -0,0 +1,4 @@ +ULL +RRDDD +LURDL +UUUUD diff --git a/src/2016/Day02.cpp b/src/2016/Day02.cpp index f6b75e1..00d1d19 100644 --- a/src/2016/Day02.cpp +++ b/src/2016/Day02.cpp @@ -2,30 +2,125 @@ namespace y2016::day02 { - REGISTER_DAY(2016, Day02, std::vector, int); + REGISTER_DAY(2016, Day02, std::vector, std::string); - REGISTER_TEST_EXAMPLE(2016, Day02, ExampleInput, 1, 0); - REGISTER_TEST(2016, Day02, Input, 1, 0); - REGISTER_TEST_EXAMPLE(2016, Day02, ExampleInput, 2, 0); - REGISTER_TEST(2016, Day02, Input, 2, 0); + REGISTER_TEST_EXAMPLE(2016, Day02, ExampleInput, 1, "1985"); + REGISTER_TEST(2016, Day02, Input, 1, "14894"); + REGISTER_TEST_EXAMPLE(2016, Day02, ExampleInput, 2, "5DB3"); + REGISTER_TEST(2016, Day02, Input, 2, "26B96"); READ_INPUT(input) { - std::vector vec; + std::vector vec; std::string str; while (getline(input, str)) { + vec.emplace_back(str); } return vec; } + char IndexToChar1(Index2D index) + { + return (index.x + index.y * 3) + '1'; + } + + char IndexToChar2(Index2D index) + { + if (index.y == 0) + return '1'; + if (index.y == 1) + return '2' + index.x - 1; + if (index.y == 2) + return '5' + index.x; + if (index.y == 3) + return 'A' + index.x - 1; + if (index.y == 4) + return 'D'; + return 'X'; + } + + void ClampX(Index2D& pos) + { + if (pos.y == 0 || pos.y == 4) + pos.x = std::clamp(pos.x, 2, 2); + if (pos.y == 1 || pos.y == 3) + pos.x = std::clamp(pos.x, 1, 3); + if (pos.y == 2) + pos.x = std::clamp(pos.x, 0, 4); + } + + void ClampY(Index2D& pos) + { + if (pos.x == 0 || pos.x == 4) + pos.y = std::clamp(pos.y, 2, 2); + if (pos.x == 1 || pos.x == 3) + pos.y = std::clamp(pos.y, 1, 3); + if (pos.x == 2) + pos.y = std::clamp(pos.y, 0, 4); + } + OUTPUT1(input) { - return 0; + Index2D pos{1, 1}; + std::string code = ""; + for (const auto& instructions : input) + { + for (const auto& instruction : instructions) + { + switch (instruction) + { + case 'R': + pos.x++; + break; + case 'L': + pos.x--; + break; + case 'U': + pos.y--; + break; + case 'D': + pos.y++; + break; + } + pos.x = std::clamp(pos.x, 0, 2); + pos.y = std::clamp(pos.y, 0, 2); + } + code += IndexToChar1(pos); + } + return code; } OUTPUT2(input) { - return 0; + Index2D pos{0, 2}; + std::string code = ""; + for (const auto& instructions : input) + { + for (const auto& instruction : instructions) + { + switch (instruction) + { + case 'R': + pos.x++; + ClampX(pos); + break; + case 'L': + pos.x--; + ClampX(pos); + break; + case 'U': + pos.y--; + ClampY(pos); + break; + case 'D': + pos.y++; + ClampY(pos); + break; + } + } + code += IndexToChar2(pos); + } + return code; } }