diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/2015/day15/aoc.cpp | 4 | ||||
-rw-r--r-- | src/2015/day15/aoc.h | 15 |
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 |