aboutsummaryrefslogtreecommitdiff
path: root/src/2016/day10/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2016/day10/aoc.cpp')
-rw-r--r--src/2016/day10/aoc.cpp36
1 files changed, 19 insertions, 17 deletions
diff --git a/src/2016/day10/aoc.cpp b/src/2016/day10/aoc.cpp
index 5b694d1..79c87b2 100644
--- a/src/2016/day10/aoc.cpp
+++ b/src/2016/day10/aoc.cpp
@@ -77,8 +77,8 @@ void parse_two(const char* p) {
void give(bot* b0, bot* b1, int v, int i) {
if (b1 != nullptr) {
- const char* ds[2] = {"bot", "output"};
- printf("%d give %d[%s] value %d\n", b0->idx, b1->idx, ds[(int)b1->is_output], v);
+ // const char* ds[2] = {"bot", "output"};
+ // printf("%d give %d[%s] value %d\n", b0->idx, b1->idx, ds[(int)b1->is_output], v);
if (b1->is_output) {
b1->get(v);
} else {
@@ -88,25 +88,30 @@ void give(bot* b0, bot* b1, int v, int i) {
}
}
-int robot_work(int l, int h) {
- int idx = INT32_MAX;
- while (idx == INT32_MAX) {
+int64_t robot_work(int l, int h, int* idx) {
+ while (true) {
+ size_t n{0};
for (auto& kv : bots) {
bot* b = kv.second;
if (b->can_give()) {
+ n += 1;
int l0 = b->vs[0];
int h0 = b->vs[1];
if (l0 == l && h0 == h) {
- // idx = b->idx;
- // break;
- } else {
- give(b, b->outputs[0], l0, 0);
- give(b, b->outputs[1], h0, 1);
+ *idx = b->idx;
}
+ give(b, b->outputs[0], l0, 0);
+ give(b, b->outputs[1], h0, 1);
}
}
+ if (n == 0)
+ break;
}
- return idx;
+ int64_t v{1};
+ for (int i = 0; i < 3; i++) {
+ v *= get_output(i)->values[0];
+ }
+ return v;
}
void print(int x, bot* b) {
@@ -127,12 +132,9 @@ std::pair<int64_t, int64_t> day10(line_view file) {
}
return true;
});
- int r = robot_work(17, 61);
-
- // for (auto& kv : outputs) {
- // print(kv.first, kv.second);
- // }
- return {r, 0};
+ int idx{INT32_MAX};
+ auto o = robot_work(17, 61, &idx);
+ return {idx, o};
}
} // namespace aoc2016