diff options
-rw-r--r-- | src/2015/day14/aoc.cpp | 7 | ||||
-rw-r--r-- | src/2015/day14/aoc.h | 49 | ||||
-rw-r--r-- | test/test_2015.cpp | 4 |
3 files changed, 53 insertions, 7 deletions
diff --git a/src/2015/day14/aoc.cpp b/src/2015/day14/aoc.cpp index 0f3859c..dbab710 100644 --- a/src/2015/day14/aoc.cpp +++ b/src/2015/day14/aoc.cpp @@ -1,13 +1,14 @@ #include "aoc.h" namespace aoc2015 { -int day14(line_view file, int seconds) { +std::pair<int, int> day14(line_view file, int seconds) { olympics games; per_line(file, [&games](line_view lv) { games.parse(lv); return true; }); - auto p = games.best(seconds); - return p.second; + auto p1 = games.best(seconds); + auto p2 = games.best_points(seconds); + return {p1.second, p2.second}; } } // namespace aoc2015 diff --git a/src/2015/day14/aoc.h b/src/2015/day14/aoc.h index 1d00d73..63b584c 100644 --- a/src/2015/day14/aoc.h +++ b/src/2015/day14/aoc.h @@ -1,5 +1,6 @@ #pragma once #include "common.h" +#include <stack> #include <vector> namespace aoc2015 { @@ -18,6 +19,7 @@ struct reindeer { struct olympics { std::vector<reindeer> reindeers; + std::vector<int> points; int get_number(const char* p) { int d{0}; @@ -42,7 +44,7 @@ struct olympics { std::pair<line_view, int> d{{}, INT32_MIN}; for (auto& r : reindeers) { auto x = kilometers(r, s); - std::cout << r.name << ": " << x << std::endl; + // std::cout << r.name << ": " << x << std::endl; if (x > d.second) { d = {r.name, x}; } @@ -50,6 +52,46 @@ struct olympics { return d; } + void score(int s) { + std::vector<int> ps(reindeers.size()); + for (size_t i = 0; i < reindeers.size(); i++) { + ps[i] = kilometers(reindeers[i], s); + } + std::stack<int> x; + x.push(0); + for (size_t i = 1; i < ps.size(); i++) { + if (ps[i] > ps[x.top()]) { + while (!x.empty()) { + x.pop(); + } + x.push(i); + } + if (ps[i] == ps[x.top()]) { + x.push(i); + } + } + while (!x.empty()) { + points[x.top()] += 1; + x.pop(); + } + } + + std::pair<line_view, int> best_points(int s) { + for (int i = 1; i <= s; i++) { + score(i); + } + for (size_t i = 0; i < reindeers.size(); i++) { + std::cout << reindeers[i].name << ": " << points[i] << std::endl; + } + int x = 0; + for (size_t i = 1; i < points.size(); i++) { + if (points[i] > points[x]) { + x = i; + } + } + return {reindeers[x].name, points[x]}; + } + void parse(line_view lv) { const char* p1 = lv.contains("can"); const char* p2 = lv.contains("for"); @@ -62,8 +104,9 @@ struct olympics { r.rest_seconds = get_number(p3 + 4); // std::cout << r << std::endl; reindeers.push_back(r); + points.push_back(0); } -}; +}; // namespace aoc2015 -int day14(line_view, int); +std::pair<int, int> day14(line_view, int); } // namespace aoc2015 diff --git a/test/test_2015.cpp b/test/test_2015.cpp index 3b0fb1a..8bb83ce 100644 --- a/test/test_2015.cpp +++ b/test/test_2015.cpp @@ -161,5 +161,7 @@ TEST_CASE("Knights of the Dinner Table", "[day13]") { TEST_CASE("Reindeer Olympics", "[day14]") { line_view lv = load_file("../src/2015/day14/input"); - REQUIRE(0 == aoc2015::day14(lv, 2503)); + auto p = aoc2015::day14(lv, 2503); + REQUIRE(2640 == p.first); + REQUIRE(0 == p.second); } |