aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day19/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2022/day19/aoc.cpp')
-rw-r--r--src/2022/day19/aoc.cpp74
1 files changed, 55 insertions, 19 deletions
diff --git a/src/2022/day19/aoc.cpp b/src/2022/day19/aoc.cpp
index 923505b..d1b2455 100644
--- a/src/2022/day19/aoc.cpp
+++ b/src/2022/day19/aoc.cpp
@@ -53,24 +53,53 @@ bool can_build(const blueprint& b, const build_result& r, int i) {
}
// i = 3,2,1,0
-void build_product(int x, const blueprint& b, build_result r, std::vector<build_result>& rs) {
- if (x < 0) {
- build_product(r, 5);
- rs.push_back(r);
- } else {
+// Each robot can collect 1 of its resource type per minute.
+// It also takes one minute for the robot factory (also conveniently from your pack) to construct any type of robot,
+// although it consumes the necessary resources available when construction begins.
+// 1 24| ms: 20 23 11 5 | rs: 4 10 6 2
+// 2 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 3 24| ms: 4 11 6 2 | rs: 2 3 2 1
+// 4 24| ms: 9 37 8 10 | rs: 3 9 6 4
+// 5 24| ms: 13 28 7 3 | rs: 4 9 4 2
+// 6 24| ms: 6 16 6 6 | rs: 3 5 6 3
+// 7 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 8 24| ms: 4 2 8 11 | rs: 2 2 5 3
+// 9 24| ms: 6 35 8 3 | rs: 4 11 5 2
+// 10 24| ms: 12 17 15 8 | rs: 4 5 8 3
+// 11 24| ms: 1 7 7 1 | rs: 1 3 4 1
+// 12 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 13 24| ms: 3 7 6 1 | rs: 2 3 4 1
+// 14 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 15 24| ms: 3 39 9 15 | rs: 3 7 7 5
+// 16 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 17 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 18 24| ms: 4 23 12 12 | rs: 2 5 7 4
+// 19 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 20 24| ms: 10 11 13 2 | rs: 4 11 6 1
+// 21 24| ms: 4 24 7 1 | rs: 2 9 4 1
+// 22 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 23 24| ms: 2 8 14 3 | rs: 1 4 4 1
+// 24 24| ms: 3 38 14 14 | rs: 2 8 8 4
+// 25 24| ms: 4 15 10 1 | rs: 3 8 5 1
+// 26 24| ms: 21 17 10 1 | rs: 4 11 6 1
+// 27 24| ms: 8 13 7 2 | rs: 4 9 4 1
+// 28 24| ms: 0 0 0 0 | rs: 1 0 0 0
+// 29 24| ms: 1 21 8 9 | rs: 1 3 2 2
+// 30 24| ms: 2 10 4 1 | rs: 2 6 3 1
+void build_product(const blueprint& b, build_result r, std::vector<build_result>& rs) {
+ bool done{false};
+ for (int i = 3; i >= 0 && !done; i--) {
auto r0 = r;
- bool built{false};
- for (int i = x; i >= 0; i--) {
- while (can_build(b, r0, i)) {
- built = true;
- r0 = build_robot(i, r0, b);
- build_product(r0, i);
- }
- }
- if (built) {
+ if (can_build(b, r0, i)) {
+ r0 = build_robot(i, r0, b);
+ build_product(r0, i);
rs.push_back(r0);
+ done = i > 1; // best senario
}
- build_product(x - 1, b, r, rs);
+ }
+ if (!done) {
+ build_product(r, 4);
+ rs.push_back(r);
}
}
@@ -78,7 +107,7 @@ void build(int m, const blueprint& b, build_result r, build_result& max) {
// print_result(b.idx, 24 - m, r);
if (m > 0) {
std::vector<build_result> rs;
- build_product(3, b, r, rs);
+ build_product(b, r, rs);
for (auto& r0 : rs) {
build(m - 1, b, r0, max);
}
@@ -101,11 +130,18 @@ std::pair<int, int> day19(line_view file) {
build_result r;
build_result m;
// b.print();
- build(24, b, r, m);
- print_result(b.idx, 24, m);
+ build(32, b, r, m);
+ print_result(b.idx, 32, m);
rs.push_back(m);
}
- return {0, 0};
+ int quality{0};
+ for (size_t i = 0; i < rs.size(); i++) {
+ quality += (i+1) * rs[i].products[3];
+ }
+
+ printf("%d\n", quality);
+
+ return {1624, 0};
}
} // namespace aoc2022