#include "aoc.h" #include namespace aoc2022 { static int lcm = 1; static void lcmf(int is[], int n) { for (int i = 0; i < n; i++) { lcm *= is[i]; } int x = is[0]; for (int i = 1; i < n; i++) { x = gcd(x, is[i]); } lcm /= x; } static size_t op1(size_t n) { return n / 3; } static size_t op2(size_t n) { return n % lcm; } static void round(func f, monkey* ms) { for(int i = 0; i < 8; i++) { monkey* m = ms + i; m->transfer(ms, f); } } 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; } std::pair day11(line_view file) { std::vector 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::vector vs2 = vs1; monkey* ms1 = vs1.data(); monkey* ms2 = vs2.data(); for (int i = 0; i < 20; i++) { round(op1, ms1); } 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 {two(ms1), two(ms2)}; } }