diff options
Diffstat (limited to 'src/2016/day10/aoc.cpp')
-rw-r--r-- | src/2016/day10/aoc.cpp | 36 |
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 |