aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/2022/day11/aoc.cpp185
-rw-r--r--src/2022/day11/aoc.h106
-rw-r--r--src/2022/day11/input1
-rw-r--r--src/2022/day11/input01
4 files changed, 123 insertions, 170 deletions
diff --git a/src/2022/day11/aoc.cpp b/src/2022/day11/aoc.cpp
index 953837a..b92d1a1 100644
--- a/src/2022/day11/aoc.cpp
+++ b/src/2022/day11/aoc.cpp
@@ -4,7 +4,7 @@
namespace aoc2022 {
static int lcm = 1;
-void lcmf(int is[], int n) {
+static void lcmf(int is[], int n) {
for (int i = 0; i < n; i++) {
lcm *= is[i];
}
@@ -15,192 +15,57 @@ void lcmf(int is[], int n) {
lcm /= x;
}
-size_t op1(size_t n) {
+static size_t op1(size_t n) {
return n / 3;
}
-size_t op2(size_t n) {
+static size_t op2(size_t n) {
return n % lcm;
}
-void m0(size_t x, monkey* ms, func f) {
- size_t n = x * 11;
- n = f(n);
- if (n % 7 == 0) {
- ms[6].items.push_back(n);
- ms[6].total += 1;
- }
- else {
- ms[2].items.push_back(n);
- ms[2].total += 1;
- }
-}
-
-void m1(size_t x, monkey* ms, func f) {
- size_t n = x + 1;
- n = f(n);
- if (n % 11 == 0) {
- ms[5].items.push_back(n);
- ms[5].total += 1;
- }
- else {
- ms[0].items.push_back(n);
- ms[0].total += 1;
- }
-}
-
-void m2(size_t x, monkey* ms, func f) {
- size_t n = x * 7;
- n = f(n);
- if (n % 13 == 0) {
- ms[4].items.push_back(n);
- ms[4].total += 1;
- }
- else {
- ms[3].items.push_back(n);
- ms[3].total += 1;
- }
-}
-
-void m3(size_t x, monkey* ms, func f) {
- size_t n = x + 3;
- n = f(n);
- if (n % 3 == 0) {
- ms[1].items.push_back(n);
- ms[1].total += 1;
- }
- else {
- ms[7].items.push_back(n);
- ms[7].total += 1;
- }
-}
-
-void m4(size_t x, monkey* ms, func f) {
- size_t n = x + 6;
- n = f(n);
- if (n % 17 == 0) {
- ms[3].items.push_back(n);
- ms[3].total += 1;
- }
- else {
- ms[7].items.push_back(n);
- ms[7].total += 1;
- }
-}
-
-void m5(size_t x, monkey* ms, func f) {
- size_t n = x + 5;
- n = f(n);
- if (n % 2 == 0) {
- ms[0].items.push_back(n);
- ms[0].total += 1;
- }
- else {
- ms[6].items.push_back(n);
- ms[6].total += 1;
- }
-}
-
-void m6(size_t x, monkey* ms, func f) {
- size_t n = x * x;
- n = f(n);
- if (n % 5 == 0) {
- ms[2].items.push_back(n);
- ms[2].total += 1;
- }
- else {
- ms[4].items.push_back(n);
- ms[4].total += 1;
- }
-}
-
-void m7(size_t x, monkey* ms, func f) {
- size_t n = x + 7;
- n = f(n);
- if (n % 19 == 0) {
- ms[5].items.push_back(n);
- ms[5].total += 1;
- }
- else {
- ms[1].items.push_back(n);
- ms[1].total += 1;
- }
-}
-
-
-void play(func f, monkey* m, monkey* ms) {
- if (m->todo != nullptr) {
- while (m->total-- > 0) {
- int x = m->items.front();
- m->items.pop_front();
- m->count += 1;
- m->todo(x, ms, f);
- }
- }
-}
-
-void round(func f, monkey* ms) {
- for(int i = 0; i < 8; i++) {
- play(f, ms+i, ms);
- }
+static void round(func f, monkey* ms) {
for(int i = 0; i < 8; i++) {
monkey* m = ms + i;
- m->update_total();
+ m->transfer(ms, f);
}
}
-size_t twobad(monkey* ms) {
+static size_t two(monkey* ms) {
std::sort(ms, ms+8, [](monkey& m1, monkey& m2){
return m1.count > m2.count;
});
return (size_t) ms[0].count * (size_t) ms[1].count;
}
-void items(int r, monkey* ms) {
- printf("round %d\n", r);
- for(int i = 0; i < 8; i++) {
- monkey* m = ms + i;
- if (m->todo != nullptr) {
- for (auto& i : m->items) {
- printf("%zu ", i);
- }
- printf("\n");
+std::pair<size_t, size_t> day11(line_view file) {
+ std::vector<monkey> vs1;
+
+ const char *p = file.line;
+ const char *p0 = p;
+ while (p < file.line + file.length) {
+ if (*p == '\n' && *(p+1) == '\n'){
+ vs1.emplace_back(line_view{p0, p});
+ p0 = p + 2;
}
+ p++;
}
-}
-
-std::pair<size_t, size_t> day11(line_view file) {
- monkey ms1[8] = {
- {std::vector<size_t>{63,57}, m0},
- {std::vector<size_t>{82, 66, 87, 78, 77, 92, 83}, m1},
- {std::vector<size_t>{97, 53, 53, 85, 58, 54}, m2},
- {std::vector<size_t>{50}, m3},
- {std::vector<size_t>{64, 69, 52, 65, 73}, m4},
- {std::vector<size_t>{57, 91, 65}, m5},
- {std::vector<size_t>{67, 91, 84, 78, 60, 69, 99, 83}, m6},
- {std::vector<size_t>{58, 78, 69, 65}, m7},
- };
- monkey ms2[8] = {
- {std::vector<size_t>{63,57}, m0},
- {std::vector<size_t>{82, 66, 87, 78, 77, 92, 83}, m1},
- {std::vector<size_t>{97, 53, 53, 85, 58, 54}, m2},
- {std::vector<size_t>{50}, m3},
- {std::vector<size_t>{64, 69, 52, 65, 73}, m4},
- {std::vector<size_t>{57, 91, 65}, m5},
- {std::vector<size_t>{67, 91, 84, 78, 60, 69, 99, 83}, m6},
- {std::vector<size_t>{58, 78, 69, 65}, m7},
- };
+ std::vector<monkey> vs2 = vs1;
+ monkey* ms1 = vs1.data();
+ monkey* ms2 = vs2.data();
for (int i = 0; i < 20; i++) {
round(op1, ms1);
}
- int tests[] = {7, 11, 13, 3, 17, 2, 5, 19};
- lcmf(tests, 8);
+ int mods[8];
+ for (int i = 0; i < 8; i++) {
+ mods[i] = vs2[i].mod;
+ }
+ lcmf(mods, 8);
for (int i = 0; i < 10000; i++) {
round(op2, ms2);
}
- return {twobad(ms1), twobad(ms2)};
+ return {two(ms1), two(ms2)};
}
}
diff --git a/src/2022/day11/aoc.h b/src/2022/day11/aoc.h
index 0e0bdd5..4968af0 100644
--- a/src/2022/day11/aoc.h
+++ b/src/2022/day11/aoc.h
@@ -5,24 +5,110 @@
namespace aoc2022 {
+// struct addx {
+// int x;
+// size_t operator()(size_t n) {
+// return n + x;
+// }
+// };
+//
+// struct mulx {
+// int x;
+// size_t operator()(size_t n) {
+// return n * x;
+// }
+// };
+//
+// struct muln {
+// size_t operator()(size_t n) {
+// return n * n;
+// }
+// };
+
typedef size_t(*func)(size_t);
struct monkey {
std::deque<size_t> items;
- std::function<void(int, monkey*, func)> todo;
+ std::function<size_t(size_t)> op;
int count = 0;
- int total = 0;
- monkey(std::vector<size_t> is,
- std::function<void(int, monkey*, func)> f) {
- for(auto& i : is) {
- items.push_back(i);
+ int mod = 0;
+ int to_t = 0;
+ int to_f = 0;
+
+ int get_number(const char* p) {
+ int d{0};
+ while(*p >= '0' && *p <= '9') {
+ d = d * 10 + *p - '0';
+ p++;
+ }
+ return d;
+ }
+
+ bool get_number(const char** pp, int* d) {
+ const char *p = *pp;
+ while(*p >= '0' && *p <= '9') {
+ *d = 10 * (*d) + *p - '0';
+ p++;
+ }
+ *pp = p;
+ return *d > 0;
+ }
+
+ void print() const noexcept {
+ for (auto& i: items) {
+ printf("%zu ", i);
+ }
+ printf("\nmod[%d] to_t[%d] to_f[%d]\n\n", mod, to_t, to_f);
+ }
+
+ monkey(line_view lv) {
+ const char* p = lv.line;
+ while (p < lv.line + lv.length) {
+ if(*p == 's' && *(p+1) == ':') {
+ int d{0};
+ const char *pp = p + 3;
+ while(get_number(&pp, &d)) {
+ items.push_back(d);
+ d = 0;
+ pp += 2;
+ }
+ }
+ if(*p == ' ' && *(p+1) == '*') {
+ int d = get_number(p + 3);
+ op = [d](size_t x){ return x * (d > 0 ? d : x);};
+ }
+ if(*p == ' ' && *(p+1) == '+') {
+ int d = get_number(p + 3);
+ op = [d](size_t x){ return x + d;};
+ }
+ if(*p == 'b' && *(p+1) == 'y') {
+ mod = get_number(p + 3);
+ }
+ if(*p == 'u' && *(p+1) == 'e') {
+ to_t = get_number(p + 20);
+ }
+ if(*p == 's' && *(p+1) == 'e') {
+ to_f = get_number(p + 20);
+ }
+ p++;
}
- todo = f;
- total = items.size();
}
- void update_total() {
- total = items.size();
+ void transfer(monkey* ms, func f) {
+ while (!items.empty()) {
+ size_t x = items.front();
+ items.pop_front();
+ count += 1;
+
+ size_t n = op(x);
+ n = f(n);
+ if ( n % mod == 0) {
+ ms[to_t].items.push_back(n);
+ }
+ else {
+ ms[to_f].items.push_back(n);
+ }
+ }
}
};
diff --git a/src/2022/day11/input b/src/2022/day11/input
index 2af0021..e2a5876 100644
--- a/src/2022/day11/input
+++ b/src/2022/day11/input
@@ -53,3 +53,4 @@ Monkey 7:
Test: divisible by 19
If true: throw to monkey 5
If false: throw to monkey 1
+
diff --git a/src/2022/day11/input0 b/src/2022/day11/input0
index 30e09e5..477d33b 100644
--- a/src/2022/day11/input0
+++ b/src/2022/day11/input0
@@ -25,3 +25,4 @@ Monkey 3:
Test: divisible by 17
If true: throw to monkey 0
If false: throw to monkey 1
+