aboutsummaryrefslogtreecommitdiff
path: root/src/2017/day18/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2017/day18/aoc.cpp')
-rw-r--r--src/2017/day18/aoc.cpp90
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