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/day13.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 2015/src/day13.cpp (limited to '2015/src/day13.cpp') diff --git a/2015/src/day13.cpp b/2015/src/day13.cpp new file mode 100644 index 0000000..7256b81 --- /dev/null +++ b/2015/src/day13.cpp @@ -0,0 +1,108 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +auto +split(const string& line, char sep = ' ') +{ + vector parts; + stringstream input{ line }; + + for ( string part; getline(input, part, sep); ) { + parts.emplace_back(part); + } + + return parts; +} + +auto +read_file(string_view filename) +{ + fstream input{ filename }; + set names; + map, long> table; + + for ( string line; getline(input, line); ) { + if ( line.ends_with(".") ) { + line.pop_back(); + } + + auto parts = split(line); + + auto start = parts[0]; + auto units = parts[2] == "gain" ? stol(parts[3]) : -stol(parts[3]); + auto end = parts[10]; // NOLINT + + table[{ start, end }] = units; + + names.insert(start); + } + return table; +} + +void +part1(map, long>& table) +{ + set unique_names; + for ( const auto& item: table ) { + unique_names.insert(get<0>(item.first)); + } + vector names{ begin(unique_names), end(unique_names) }; + + long happiness_sofar = numeric_limits::min(); + do { + long happiness = 0; + for ( size_t idx = 0; idx != names.size(); ++idx ) { + auto next_idx = (idx + 1) % names.size(); + + happiness += table[{ names[idx], names[next_idx] }]; + happiness += table[{ names[next_idx], names[idx] }]; + } + + happiness_sofar = max(happiness_sofar, happiness); + } while ( next_permutation(begin(names), end(names)) ); + cout << happiness_sofar << endl; +} + +void +part2(map, long>& table) +{ + set unique_names; + for ( const auto& item: table ) { + unique_names.insert(get<0>(item.first)); + } + vector names{ begin(unique_names), end(unique_names) }; + names.emplace_back("Hartkode"); + + long happiness_sofar = numeric_limits::min(); + do { + long happiness = 0; + for ( size_t idx = 0; idx != names.size(); ++idx ) { + auto next_idx = (idx + 1) % names.size(); + + happiness += table[{ names[idx], names[next_idx] }]; + happiness += table[{ names[next_idx], names[idx] }]; + } + + happiness_sofar = max(happiness_sofar, happiness); + } while ( next_permutation(begin(names), end(names)) ); + cout << happiness_sofar << endl; +} + +int +main() +{ + auto table = read_file("data/day13.txt"); + part1(table); + part2(table); +} -- cgit v1.3