aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2022-05-06 17:51:22 +0800
committerkaiwu <kaiwu2004@gmail.com>2022-05-06 17:51:22 +0800
commitdde34a27133632aa7892eb4533890aea5ea04efb (patch)
treeebf708f7b9ffa63b5b35ed33171a4597879f482a
parent751c279cefea73b01f6f2457b9c65477d6f2df8d (diff)
downloadadvent-of-code-dde34a27133632aa7892eb4533890aea5ea04efb.tar.gz
advent-of-code-dde34a27133632aa7892eb4533890aea5ea04efb.zip
2021 day7
-rw-r--r--src/2021/day7/aoc.cpp34
-rw-r--r--src/2021/day7/aoc.h2
-rw-r--r--test/test_2021.cpp6
3 files changed, 27 insertions, 15 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
diff --git a/src/2021/day7/aoc.h b/src/2021/day7/aoc.h
index 72234fe..6dd69b6 100644
--- a/src/2021/day7/aoc.h
+++ b/src/2021/day7/aoc.h
@@ -3,5 +3,5 @@
namespace aoc2021 {
-int day7(line_view);
+std::pair<int, int> day7(line_view);
}
diff --git a/test/test_2021.cpp b/test/test_2021.cpp
index 405bf03..173542b 100644
--- a/test/test_2021.cpp
+++ b/test/test_2021.cpp
@@ -56,6 +56,8 @@ TEST_CASE("Lanternfish", "[2021]") {
TEST_CASE("The Treachery of Whales", "[2021]") {
line_view lv = load_file("../src/2021/day7/input");
- // REQUIRE(37 == aoc2021::day7("16,1,2,0,4,2,7,1,2,14"));
- REQUIRE(354129 == aoc2021::day7(lv));
+ // auto p = aoc2021::day7("16,1,2,0,4,2,7,1,2,14");
+ auto p = aoc2021::day7(lv);
+ REQUIRE(354129 == p.first);
+ REQUIRE(98905973 == p.second);
}