diff --git a/2019/10.cpp b/2019/10.cpp index 5aec55a..6e28f5a 100644 --- a/2019/10.cpp +++ b/2019/10.cpp @@ -1,9 +1,12 @@ #include #include -#include +#include #include #include -#include +#include +#include + +#include #include #include @@ -87,7 +90,7 @@ auto Part1(Grid const& grid) { return std::make_pair(best, base); } -auto Part2(Grid const& grid, Coord base) { +auto Part2(Grid const& grid, Coord base, std::size_t n) { std::map, std::vector> targets; // arrange all the other asteroids by their angle relative to the base @@ -107,7 +110,7 @@ auto Part2(Grid const& grid, Coord base) { // Remove 199 asteroids from the asteroid list auto cursor = targets.begin(); - for (std::size_t n = 199; n > 0; n--) { + for (; n > 1; n--) { if (targets.empty()) { throw std::runtime_error{"no solution to part 2"}; } cursor->second.pop_back(); @@ -129,9 +132,85 @@ auto Part2(Grid const& grid, Coord base) { } // namespace +TEST_SUITE("documented examples") { + + char const* bigexample = + ".#..##.###...#######\n" + "##.############..##.\n" + ".#.######.########.#\n" + ".###.#######.####.#.\n" + "#####.##.#.##.###.##\n" + "..#####..#.#########\n" + "####################\n" + "#.####....###.#.#.##\n" + "##.#################\n" + "#####.##.###..####..\n" + "..######..##.#######\n" + "####.##.####...##..#\n" + ".#####..#.######.###\n" + "##...#.##########...\n" + "#.##########.#######\n" + ".####.#.###.###.#.##\n" + "....##.##.###..#####\n" + ".#.#.###########.###\n" + "#.#.#.#####.####.###\n" + "###.##.####.##.#..##\n"; + + TEST_CASE("part 1") { + auto test = [](Coord base, std::size_t count, std::string text) { + std::istringstream in {std::move(text)}; + auto [count_, base_] = Part1(Grid::Parse(in)); + REQUIRE(count_ == count); + REQUIRE(base_ == base); + }; + test({3,4}, 8, + ".#..#\n" + ".....\n" + "#####\n" + "....#\n" + "...##\n"); + test({1,2}, 35, + "#.#...#.#.\n" + ".###....#.\n" + ".#....#...\n" + "##.#.#.#.#\n" + "....#.#.#.\n" + ".##..###.#\n" + "..#...##..\n" + "..##....##\n" + "......#...\n" + ".####.###.\n"); + test({6,3}, 41, + ".#..#..###\n" + "####.###.#\n" + "....###.#.\n" + "..###.##.#\n" + "##.##.#.#.\n" + "....###..#\n" + "..#.#..#.#\n" + "#..#.#.###\n" + ".##...##.#\n" + ".....#.#..\n"); + test({11,13}, 210, bigexample); + } + TEST_CASE("part 2") { + auto test = [](std::size_t answer, Coord base, std::size_t nth, std::string text) { + std::istringstream in {std::move(text)}; + REQUIRE(answer == Part2(Grid::Parse(in), base, nth)); + }; + test(1403, {8,3}, 36, + ".#....#####...#..\n" + "##...##.#####..##\n" + "##...#...#.#####.\n" + "..#.....X...###..\n" + "..#.#.....#....##\n"); + test(802, {11,13}, 200, bigexample); + } +} + auto main(int argc, char** argv) -> int { auto grid = Grid::Parse(Startup(argc, argv)); auto [part1, base] = Part1(grid); std::cout << "Part 1: " << part1 << std::endl; - std::cout << "Part 2: " << Part2(grid, base) << std::endl; + std::cout << "Part 2: " << Part2(grid, base, 200) << std::endl; }