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/day14.cpp | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 2015/src/day14.cpp (limited to '2015/src/day14.cpp') diff --git a/2015/src/day14.cpp b/2015/src/day14.cpp new file mode 100644 index 0000000..a877630 --- /dev/null +++ b/2015/src/day14.cpp @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; + +using record_type = tuple; + +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 }; + vector records; + + for ( string line; getline(input, line); ) { + auto parts = split(line); + records.emplace_back(parts[0], stol(parts[3]), stol(parts[6]), stol(parts[13])); // NOLINT + } + return records; +} + +static const size_t max_seconds = 2503; + +map> +calculate_distances(const vector& records) +{ + map> distances; + + for ( const auto& [name, speed, sec, sec2]: records ) { + long distance = 0; + for ( size_t second = 0; second != max_seconds; ) { + for ( size_t i = 0; second != max_seconds && i != (size_t) sec; ++i ) { + distance += speed; + ++second; + distances[name].emplace_back(distance); + } + for ( long i = 0; second != max_seconds && i != sec2; ++i ) { + ++second; + distances[name].emplace_back(distance); + } + } + } + return distances; +} + +void +part1(const vector& records) +{ + auto distances = calculate_distances(records); + long distance = numeric_limits::min(); + + for ( const auto& record: records ) { + auto name = get<0>(record); + auto final_distance = distances[name].back(); + distance = max(distance, final_distance); + } + + cout << distance << endl; +} + +void +part2(const vector& records) +{ + auto distances = calculate_distances(records); + + map points; + for ( size_t second = 0; second != max_seconds; ++second ) { + auto max_distance = numeric_limits::min(); + for ( const auto& record: records ) { + auto name = get<0>(record); + max_distance = max(max_distance, distances[name][second]); + } + + for ( const auto& record: records ) { + auto name = get<0>(record); + if ( distances[name][second] == max_distance ) { + ++points[name]; + } + } + } + + auto max_points = numeric_limits::min(); + for ( const auto& [name, points]: points ) { + max_points = max(max_points, points); + } + cout << max_points << endl; +} + +int +main() +{ + auto records = read_file("data/day14.txt"); + part1(records); + part2(records); +} -- cgit v1.3