aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/2015/day14/aoc.cpp7
-rw-r--r--src/2015/day14/aoc.h49
-rw-r--r--test/test_2015.cpp4
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);
}