#include #include #include #include using namespace std; namespace { vector read_file(const filesystem::path& filename) { ifstream file{ filename }; vector data; for ( int number{}; file >> number; ) { data.emplace_back(number); } return data; } void part1(const vector& data) { size_t idx = 0; int sum = 0; function func = [&] { auto count_child = data.at(idx++); auto count_meta = data.at(idx++); while ( count_child-- > 0 ) { func(); } while ( count_meta-- > 0 ) { sum += data.at(idx++); } }; func(); cout << "Part 1: " << sum << '\n'; } void part2(const vector& data) { size_t idx = 0; function func = [&] { const auto count_child = data.at(idx++); const auto count_meta = data.at(idx++); vector child_values; for ( int i = 0; i != count_child; ++i ) { child_values.emplace_back(func()); } int value = 0; for ( int i = 0; i != count_meta; ++i ) { auto meta = data.at(idx++); if ( count_child == 0 ) { value += meta; } else { meta--; if ( meta >= 0 && meta < count_child ) { value += child_values[static_cast(meta)]; } } } return value; }; cout << "Part 2: " << func() << '\n'; } } // namespace int main() { auto data = read_file("data/day08.txt"); part1(data); part2(data); }