From bdd35a7bee7f23c912d0c453abc263805d8d8ccf Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 7 Nov 2025 12:04:46 +0100 Subject: aoc 2017, days 21-25 --- 2017/src/day24.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 2017/src/day24.cpp (limited to '2017/src/day24.cpp') diff --git a/2017/src/day24.cpp b/2017/src/day24.cpp new file mode 100644 index 0000000..fa4148c --- /dev/null +++ b/2017/src/day24.cpp @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include + +using namespace std; + +namespace { + +vector> +read_file(const filesystem::path& filename) +{ + ifstream file{ filename }; + vector> data; + + long lhs = 0; + long rhs = 0; + char sep = 0; + + while ( file >> lhs >> sep >> rhs ) { + data.emplace_back(lhs, rhs); + } + return data; +} + +long +strongest(const vector>& data, long current = 0, const set& used = {}) +{ + long best_strength = 0; + + for ( size_t i = 0; i != data.size(); ++i ) { + if ( used.contains(i) ) { + continue; + } + + auto [lhs, rhs] = data.at(i); + if ( lhs == current || rhs == current ) { + auto next_port = (lhs == current) ? rhs : lhs; + auto new_used{ used }; + new_used.emplace(i); + auto strength = lhs + rhs + strongest(data, next_port, new_used); + best_strength = max(best_strength, strength); + } + } + + return best_strength; +} + +tuple +strongest_and_longest(const vector>& data, long current = 0, const set& used = {}) +{ + long best_strength = 0; + size_t best_length = 0; + + for ( size_t i = 0; i != data.size(); ++i ) { + if ( used.contains(i) ) { + continue; + } + + auto [lhs, rhs] = data.at(i); + if ( lhs == current || rhs == current ) { + auto next_port = (lhs == current) ? rhs : lhs; + auto new_used{ used }; + new_used.emplace(i); + auto [sub_strength, sub_length] = strongest_and_longest(data, next_port, new_used); + + auto total_strength = sub_strength + lhs + rhs; + auto total_length = sub_length + 1; + + if ( total_length > best_length || (total_length == best_length && total_strength > best_strength) ) { + best_strength = total_strength; + best_length = total_length; + } + } + } + + return make_tuple(best_strength, best_length); +} + +void +part1(const vector>& data) +{ + cout << "Part1: " << strongest(data) << '\n'; +} + +void +part2(const vector>& data) +{ + auto [strength, length] = strongest_and_longest(data); + cout << "Part2: " << strength << '\n'; +} + +} // namespace + +int +main() +{ + auto data = read_file("data/day24.txt"); + part1(data); + part2(data); +} -- cgit v1.3