#include #include #include #include #include #include #include #include namespace { auto fuel1(std::int64_t weight) -> std::int64_t { return weight / 3 - 2; } auto fuel2(std::int64_t weight) -> std::int64_t { std::int64_t total = 0; for(;;) { weight = fuel1(weight); if (weight <= 0) break; total += weight; } return total; } } TEST_SUITE("documented examples") { TEST_CASE("part 1") { REQUIRE(fuel1(12) == 2); REQUIRE(fuel1(14) == 2); REQUIRE(fuel1(1969) == 654); REQUIRE(fuel1(100756) == 33583); } TEST_CASE("part 2") { REQUIRE(fuel2(14) == 2); REQUIRE(fuel2(1969) == 966); REQUIRE(fuel2(100756) == 50346); } } auto Main(std::istream & in, std::ostream & out) -> void { std::int64_t weight; std::int64_t part1 = 0; std::int64_t part2 = 0; while (in >> weight) { part1 += fuel1(weight); part2 += fuel2(weight); } out << "Part 1: " << part1 << std::endl; out << "Part 2: " << part2 << std::endl; }