From 8c96639ec1f6757570510fc27f1c5fabece35eaf Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 16 Nov 2025 13:23:34 +0100 Subject: aoc 2018, days 1-11 --- 2018/src/day08.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 2018/src/day08.cpp (limited to '2018/src/day08.cpp') diff --git a/2018/src/day08.cpp b/2018/src/day08.cpp new file mode 100644 index 0000000..9c2a093 --- /dev/null +++ b/2018/src/day08.cpp @@ -0,0 +1,88 @@ +#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); +} -- cgit v1.3