From 4b6c1b0e539d9fc37b646af5865b75aaa5b49bfc Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Wed, 13 Nov 2024 22:20:30 +0100 Subject: aoc 2015, days 5, 6 and 7 --- 2015/src/day07.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 2015/src/day07.cpp (limited to '2015/src/day07.cpp') diff --git a/2015/src/day07.cpp b/2015/src/day07.cpp new file mode 100644 index 0000000..f24d5af --- /dev/null +++ b/2015/src/day07.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +auto +read_file(string_view filename) +{ + fstream input{ filename }; + map deps; + + for ( string line; getline(input, line); ) { + const auto pos = line.find(" -> "); + if ( pos == string::npos ) { + continue; + } + + deps[line.substr(pos + 4)] = line.substr(0, pos); + } + + return deps; +} + +// NOLINTBEGIN +uint16_t +solve(map& deps, const string& dep) +{ + map cache; + + function solve = [&](const string& dep) -> uint16_t { + if (cache.contains(dep)) { + return cache[dep]; + } + + uint16_t value = 0; + if (sscanf(dep.c_str(), "%" SCNu16, &value) == 1) { + return cache[dep] = value; + } + + const auto& line = deps[dep]; + + static const size_t MAX = 11; + char lhs[MAX], rhs[MAX]; + + if ( sscanf(line.c_str(), "%10s AND %10s", lhs, rhs) == 2 ) { + value = solve(lhs) & solve(rhs); + } + else if ( sscanf(line.c_str(), "%10s OR %10s", lhs, rhs) == 2 ) { + value = solve(lhs) | solve(rhs); + } + else if ( sscanf(line.c_str(), "%10s LSHIFT %10s", lhs, rhs) == 2 ) { + value = static_cast(solve(lhs) << solve(rhs)); + } + else if ( sscanf(line.c_str(), "%10s RSHIFT %10s", lhs, rhs) == 2 ) { + value = static_cast(solve(lhs) >> solve(rhs)); + } + else if ( sscanf(line.c_str(), "NOT %10s", lhs) == 1 ) { + value = ~solve(lhs); + } + else { + value = solve(line); + } + + return cache[dep] = value; + }; + + return solve(dep); +} +// NOLINTEND + +auto +part1(map& deps) +{ + auto result = solve(deps, "a"); + cout << result << endl; + return result; +} + +void +part2(map& deps, uint16_t result) +{ + deps["b"] = to_string(result); + cout << solve(deps, "a") << endl; +} + +int +main() +{ + auto deps = read_file("data/day07.txt"); + auto result = part1(deps); + part2(deps, result); +} -- cgit v1.3