From 566dbf51f27b6e181826b8de6c1cb98b4a680fe8 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 15 Nov 2024 16:57:33 +0100 Subject: aoc 2015, days 12, 13 and 14 --- 2015/src/day12.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 2015/src/day12.cpp (limited to '2015/src/day12.cpp') diff --git a/2015/src/day12.cpp b/2015/src/day12.cpp new file mode 100644 index 0000000..2bb2e78 --- /dev/null +++ b/2015/src/day12.cpp @@ -0,0 +1,78 @@ +#include +#include +#include +#include + +// JSON parsing +#include + +using namespace std; +using json = nlohmann::json; + +string +read_file(string_view filename) +{ + fstream input{ filename }; + return { istreambuf_iterator{ input }, {} }; +} + +template +void +recursive_iterate(const json& j, UnaryFunction f) // NOLINT +{ + for ( auto it = j.begin(); it != j.end(); ++it ) { + if ( it->is_structured() ) { + recursive_iterate(*it, f); + } + else { + f(it); + } + } +} + +void +part1(string_view document) +{ + auto json = json::parse(document); + + long sum = 0; + recursive_iterate(json, [&](json::const_iterator iter) { + if ( iter.value().is_number() ) { + sum += iter.value().get(); + } + }); + cout << sum << endl; +} + +void +part2(string_view document) +{ + json::parser_callback_t parser_callback = [](int /*depth*/, json::parse_event_t event, json& parsed) { + if ( event == json::parse_event_t::object_end ) { + for ( auto it = parsed.begin(); it != parsed.end(); ++it ) { + if ( it.value().is_string() && it.value().get() == "red" ) { + return false; + } + } + } + return true; + }; + + auto json = json::parse(document, parser_callback); + + long sum = 0; + recursive_iterate(json, [&](json::const_iterator iter) { + if ( iter.value().is_number() ) { + sum += iter.value().get(); + } + }); + cout << sum << endl; +} + +int +main() +{ + auto document = read_file("data/day12.txt"); + part1(document); + part2(document); +} -- cgit v1.3