diff options
Diffstat (limited to 'src/2017/day18/aoc.cpp')
-rw-r--r-- | src/2017/day18/aoc.cpp | 90 |
1 files changed, 49 insertions, 41 deletions
diff --git a/src/2017/day18/aoc.cpp b/src/2017/day18/aoc.cpp index 9cef4c9..7086681 100644 --- a/src/2017/day18/aoc.cpp +++ b/src/2017/day18/aoc.cpp @@ -28,14 +28,21 @@ static int64_t get_number(const char* p, int64_t rs[26]) { return d; } -typedef void (*f18)(size_t*, const char*, const char*, int64_t rs[26], std::deque<int64_t>* qs[2]); +struct message_queue { + std::deque<int64_t>* qs; + std::deque<int64_t>* qr; + size_t c; +}; -static void snd(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { - qs[0]->push_back(get(*p1, rs)); +typedef void (*f18)(size_t*, const char*, const char*, int64_t rs[26], message_queue& q); + +static void snd(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { + q.qs->push_back(get(*p1, rs)); + q.c += 1; *i += 1; } -static void rcv0(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { +static void rcv0(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { auto d = get_number(p1, rs); if (d != 0) { // printf("%ld\n", sounds.back()); @@ -44,36 +51,36 @@ static void rcv0(size_t* i, const char* p1, const char* p2, int64_t rs[26], std: *i += 1; } -static void rcv1(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { - if (!qs[1]->empty()) { - auto x = qs[1]->front(); - qs[1]->pop_front(); - get(*p1, rs) = x; - *i += 1; - } -} +// static void rcv1(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { +// if (!q.qr->empty()) { +// auto x = q.qr->front(); +// q.qr->pop_front(); +// get(*p1, rs) = x; +// *i += 1; +// } +// } -static void set(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { +static void set(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& qs) { get(*p1, rs) = get_number(p2, rs); *i += 1; } -static void add(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { +static void add(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { get(*p1, rs) += get_number(p2, rs); *i += 1; } -static void mul(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { +static void mul(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { get(*p1, rs) *= get_number(p2, rs); *i += 1; } -static void mod(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { +static void mod(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { get(*p1, rs) %= get_number(p2, rs); *i += 1; } -static void jgz(size_t* i, const char* p1, const char* p2, int64_t rs[26], std::deque<int64_t>* qs[2]) { +static void jgz(size_t* i, const char* p1, const char* p2, int64_t rs[26], message_queue& q) { auto d0 = get_number(p1, rs); auto d1 = get_number(p2, rs); *i += d0 > 0 ? d1 : 1; @@ -87,8 +94,7 @@ static void jgz(size_t* i, const char* p1, const char* p2, int64_t rs[26], std:: // printf("\n"); // } -static size_t exec(size_t index, const std::vector<line_view>& todos, int64_t rs[26], std::deque<int64_t>* qs[2], - f18 rcv) { +static size_t exec(size_t index, const std::vector<line_view>& todos, int64_t rs[26], message_queue& q, f18 rcv) { if (index < todos.size()) { f18 fs[] = {snd, set, add, mul, mod, jgz, rcv}; const char* cs[] = {"snd", "set", "add", "mul", "mod", "jgz", "rcv"}; @@ -105,7 +111,7 @@ static size_t exec(size_t index, const std::vector<line_view>& todos, int64_t rs for (size_t i = 0; i < 7; i++) { if (match(p, cs[i])) { - fs[i](&index, p + 4, p + 6, rs, qs); + fs[i](&index, p + 4, p + 6, rs, q); break; } } @@ -117,33 +123,34 @@ static int64_t part1(const std::vector<line_view>& todos) { size_t index{0}; int64_t rs[26] = {0}; std::deque<int64_t> q; - std::deque<int64_t>* qs[2] = {&q, &q}; + message_queue mq = {&q, &q, 0}; while (index < todos.size()) { - index = exec(index, todos, rs, qs, rcv0); + index = exec(index, todos, rs, mq, rcv0); } return q.back(); } -static void part2(const std::vector<line_view>& todos) { - size_t i0{0}; - size_t i1{0}; - - int64_t rs0[26] = {0}; - get('p', rs0) = 0; - int64_t rs1[26] = {0}; - get('p', rs1) = 1; - - std::deque<int64_t> q0; - std::deque<int64_t> q1; - std::deque<int64_t>* qs0[2] = {&q1, &q0}; - std::deque<int64_t>* qs1[2] = {&q0, &q1}; - - while (i0 < todos.size() && i1 < todos.size()) { - i0 = exec(i0, todos, rs0, qs0, rcv1); - i1 = exec(i1, todos, rs1, qs1, rcv1); - } -} +// static void part2(const std::vector<line_view>& todos) { +// size_t i0{0}; +// size_t i1{0}; +// +// int64_t rs0[26] = {0}; +// get('p', rs0) = 0; +// int64_t rs1[26] = {0}; +// get('p', rs1) = 1; +// +// std::deque<int64_t> q0; +// std::deque<int64_t> q1; +// message_queue mq0 = {&q1, &q0, 0}; +// message_queue mq1 = {&q0, &q1, 0}; +// +// while (i0 < todos.size() && i1 < todos.size()) { +// i0 = exec(i0, todos, rs0, mq0, rcv1); +// i1 = exec(i1, todos, rs1, mq1, rcv1); +// printf("%zu %zu\n", mq0.c, mq1.c); +// } +// } std::pair<int64_t, int64_t> day18(line_view file) { std::vector<line_view> todos; @@ -153,6 +160,7 @@ std::pair<int64_t, int64_t> day18(line_view file) { }); auto t0 = part1(todos); + // part2(todos); return {t0, 0}; } } // namespace aoc2017 |