diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-12-11 20:27:58 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-12-11 20:27:58 +0800 |
commit | c3c5db582f215c1f1beb372ecda8dd43e1042eac (patch) | |
tree | 25c62703f390b02b64435d3ddc99fc4affbc489c /src/2022/day11/aoc.cpp | |
parent | 1c3c2e3f8a72b7e2968f3583e8582333457e583a (diff) | |
download | advent-of-code-c3c5db582f215c1f1beb372ecda8dd43e1042eac.tar.gz advent-of-code-c3c5db582f215c1f1beb372ecda8dd43e1042eac.zip |
2022 day11 parse
Diffstat (limited to 'src/2022/day11/aoc.cpp')
-rw-r--r-- | src/2022/day11/aoc.cpp | 185 |
1 files changed, 25 insertions, 160 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)}; } } |