From 3e568910717079595f2785607a86080f745364ef Mon Sep 17 00:00:00 2001 From: Eric Mertens Date: Thu, 24 Nov 2022 23:49:08 -0800 Subject: [PATCH] 2017-11 --- 2017/11.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++++ 2017/14.cpp | 6 +-- 2017/CMakeLists.txt | 3 ++ 3 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 2017/11.cpp diff --git a/2017/11.cpp b/2017/11.cpp new file mode 100644 index 0000000..0ffec6e --- /dev/null +++ b/2017/11.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace { + +/* + \ n / +nw +--+ ne + / \ +-+ +- + \ / +sw +--+ se + / s \ +*/ + +struct Hex { + std::int64_t q, r, s; +}; + +constexpr Hex HEX_N { 0, -1, 1 }; +constexpr Hex HEX_NE { 1, -1, 0 }; +constexpr Hex HEX_SE { 1, 0, -1 }; +constexpr Hex HEX_S { 0, 1, -1 }; +constexpr Hex HEX_SW { -1, 1, 0 }; +constexpr Hex HEX_NW { -1, 0, 1 }; + +auto operator+(Hex a, Hex b) -> Hex { + return {a.q + b.q, a.r + b.r, a.s + b.s }; +} + +auto operator+=(Hex & a, Hex b) -> Hex & { + a.q += b.q; a.r += b.r; a.s += b.s; + return a; +} + +auto hex_distance(Hex hex) -> std::int64_t { + return (std::abs(hex.q) + std::abs(hex.r) + std::abs(hex.s)) / 2; +} + +auto Walk(std::string const& commands) +-> std::pair +{ + Hex here {}; + std::int64_t part2 = 0; + for (auto const& command : aocpp::SplitOn(commands, ",")) { + here += + "n" == command ? HEX_N : + "ne" == command ? HEX_NE : + "nw" == command ? HEX_NW : + "s" == command ? HEX_S : + "se" == command ? HEX_SE : + "sw" == command ? HEX_SW : + throw std::runtime_error{"bad input"}; + part2 = std::max(part2, hex_distance(here)); + } + return {hex_distance(here), part2}; +} + +} // namespace + +TEST_SUITE("2017-11 examples") { + TEST_CASE("example 1") { + auto [p1,p2] = Walk("ne,ne,ne"); + CHECK(p1 == 3); + CHECK(p2 == 3); + } + TEST_CASE("example 2") { + auto [p1,p2] = Walk("ne,ne,sw,sw"); + CHECK(p1 == 0); + CHECK(p2 == 2); + } + TEST_CASE("example 3") { + auto [p1,p2] = Walk("ne,ne,s,s"); + CHECK(p1 == 2); + CHECK(p2 == 2); + } + TEST_CASE("example 4") { + auto [p1,p2] = Walk("se,sw,se,sw,sw"); + CHECK(p1 == 3); + CHECK(p2 == 3); + } +} + +auto main(int argc, char** argv) -> int { + std::string line; + std::getline(*aocpp::Startup(argc, argv), line); + auto [part1, part2] = Walk(line); + std::cout << "Part 1: " << part1 << std::endl; + std::cout << "Part 2: " << part2 << std::endl; +} \ No newline at end of file diff --git a/2017/14.cpp b/2017/14.cpp index c97cc6d..4418943 100644 --- a/2017/14.cpp +++ b/2017/14.cpp @@ -9,20 +9,18 @@ #include #include -#include #include namespace { -using Grid = std::vector>; +using Grid = std::array, 128>; auto MakeRows(std::string input) -> Grid { Grid rows; - rows.reserve(128); input += "-"; for (int i = 0; i < 128; i++) { - rows.emplace_back(knothash::hash(input + std::to_string(i))); + rows[i] = knothash::hash(input + std::to_string(i)); } return rows; diff --git a/2017/CMakeLists.txt b/2017/CMakeLists.txt index 50d0749..7ee3bc3 100644 --- a/2017/CMakeLists.txt +++ b/2017/CMakeLists.txt @@ -7,6 +7,9 @@ target_link_libraries(2017_06 aocpp) add_executable(2017_10 10.cpp) target_link_libraries(2017_10 aocpp knothash) +add_executable(2017_11 11.cpp) +target_link_libraries(2017_11 aocpp) + add_executable(2017_14 14.cpp) target_link_libraries(2017_14 aocpp knothash)