aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/2015/day15/aoc.cpp4
-rw-r--r--src/2015/day15/aoc.h15
2 files changed, 12 insertions, 7 deletions
diff --git a/src/2015/day15/aoc.cpp b/src/2015/day15/aoc.cpp
index ee6f864..6a6867c 100644
--- a/src/2015/day15/aoc.cpp
+++ b/src/2015/day15/aoc.cpp
@@ -2,7 +2,7 @@
namespace aoc2015 {
-int day15(line_view file) {
+int day15(line_view file, int* cals) {
recipe r;
per_line(file, [&r](line_view lv) {
r.parse(lv);
@@ -11,7 +11,7 @@ int day15(line_view file) {
std::vector<int> combos;
int best{0};
- r.measure(100, 0, combos, &best);
+ r.measure(100, 0, combos, &best, cals);
return best;
}
} // namespace aoc2015
diff --git a/src/2015/day15/aoc.h b/src/2015/day15/aoc.h
index 56a083e..e74150e 100644
--- a/src/2015/day15/aoc.h
+++ b/src/2015/day15/aoc.h
@@ -22,28 +22,33 @@ struct ingredient {
struct recipe {
std::vector<ingredient> ingredients;
- int score(const std::vector<int>& is) {
+ int score(const std::vector<int>& is, int* cals) {
int capacity = 0;
int durability = 0;
int flavor = 0;
int texture = 0;
+ int calories = 0;
for (size_t i = 0; i < ingredients.size(); i++) {
capacity += is[i] * ingredients[i].capacity;
durability += is[i] * ingredients[i].durability;
flavor += is[i] * ingredients[i].flavor;
texture += is[i] * ingredients[i].texture;
+ calories += is[i] * ingredients[i].calories;
}
if (capacity < 0 || durability < 0 || flavor < 0 || texture < 0) {
return 0;
}
+ if (cals != nullptr && calories != *cals) {
+ return 0;
+ }
return capacity * durability * flavor * texture;
}
// backtrace
- void measure(int total, size_t index, std::vector<int>& combos, int* best) {
+ void measure(int total, size_t index, std::vector<int>& combos, int* best, int* cals) {
if (index == ingredients.size() - 1) { // last ingredient
combos.push_back(total);
- int s = score(combos);
+ int s = score(combos, cals);
// std::cout << "{" << s << " -> ";
// for (auto i : {0, 1, 2, 3}) {
@@ -60,7 +65,7 @@ struct recipe {
for (int x = 1; x < total; x++) {
combos.push_back(x);
- measure(total - x, index + 1, combos, best);
+ measure(total - x, index + 1, combos, best, cals);
combos.pop_back();
}
}
@@ -94,6 +99,6 @@ struct recipe {
}
};
-int day15(line_view);
+int day15(line_view, int* cals = nullptr);
} // namespace aoc2015