diff options
Diffstat (limited to 'src/2021/day7/aoc.cpp')
-rw-r--r-- | src/2021/day7/aoc.cpp | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/2021/day7/aoc.cpp b/src/2021/day7/aoc.cpp index 6ba7c29..8bc4607 100644 --- a/src/2021/day7/aoc.cpp +++ b/src/2021/day7/aoc.cpp @@ -12,17 +12,24 @@ static void get_number(const char** pp, int* d) { *pp = p; } -int fuel(int a, const std::map<int, int>& is) { - int total{0}; +int crab_move(int x, int y) { + int b = std::abs(x - y); + return b * (b + 1) / 2; +} + +std::pair<int, int> fuel(int a, const std::map<int, int>& is) { + int t0{0}; + int t1{0}; for (auto& kv : is) { if (kv.first != a) { - total += std::abs(a - kv.first) * kv.second; + t0 += std::abs(a - kv.first) * kv.second; + t1 += crab_move(a, kv.first) * kv.second; } } - return total; + return {t0, t1}; } -int day7(line_view file) { +std::pair<int, int> day7(line_view file) { std::map<int, int> is; const char* p1 = file.line; const char* p2 = p1 + file.length; @@ -39,16 +46,19 @@ int day7(line_view file) { p1++; } - int min{INT32_MAX}; + int m1{INT32_MAX}; + int m2{INT32_MAX}; for (int i = mi; i <= mx; i++) { - int f = fuel(i, is); - // printf("%d -> %d\n", i, f); - if (f < min) { - min = f; + auto p = fuel(i, is); + // printf("%d -> (%d, %d)\n", i, p.first, p.second); + if (p.first < m1) { + m1 = p.first; + } + if (p.second < m2) { + m2 = p.second; } } - - return min; + return {m1, m2}; } } // namespace aoc2021 |