aboutsummaryrefslogtreecommitdiff
path: root/src/2022/day23/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-05 09:55:40 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-05 09:55:40 +0800
commit46597275fcf3ea04a57bf333571bbd2681fd5605 (patch)
tree61292c32287bcef00a8d10724eca68a39c2d3688 /src/2022/day23/aoc.cpp
parentbc1cd8a9693e81e5cae299ed0670e60ee65f8264 (diff)
downloadadvent-of-code-46597275fcf3ea04a57bf333571bbd2681fd5605.tar.gz
advent-of-code-46597275fcf3ea04a57bf333571bbd2681fd5605.zip
2022 day23
Diffstat (limited to 'src/2022/day23/aoc.cpp')
-rw-r--r--src/2022/day23/aoc.cpp57
1 files changed, 52 insertions, 5 deletions
diff --git a/src/2022/day23/aoc.cpp b/src/2022/day23/aoc.cpp
index 1d60f78..1b09a2b 100644
--- a/src/2022/day23/aoc.cpp
+++ b/src/2022/day23/aoc.cpp
@@ -86,35 +86,72 @@ static struct elf_test {
elf_move m;
} moves[5] = {{eight, nomove}, {north_three, north}, {south_three, south}, {west_three, west}, {east_three, east}};
-bool duplicate(elf e, const std::vector<elf>& elfs) {
- return false;
+bool duplicate(elf e, const std::map<elf, int>& dups) {
+ auto it = dups.find(e);
+ return it != dups.end() && it->second > 1;
}
-std::vector<elf> round(int i, const std::vector<elf>& elfs, const std::set<elf>& elves) {
+std::vector<elf> round(int i, const std::vector<elf>& elfs, const std::set<elf>& elves, size_t* n) {
std::vector<elf> next;
+ *n = 0;
+
for (auto& e : elfs) {
if (moves[0].p(e, elves)) {
next.emplace_back(moves[0].m(e));
+ *n += 1;
} else {
+ bool can_move{false};
for (int x = 0; x < 4; x++) {
int index = (i + x) % 4 + 1;
if (moves[index].p(e, elves)) {
next.emplace_back(moves[index].m(e));
+ can_move = true;
break;
}
}
+ if (!can_move) {
+ next.emplace_back(e);
+ }
+ }
+ }
+
+ std::map<elf, int> dups;
+ for (auto& e : next) {
+ auto kv = dups.insert({e, 1});
+ if (!kv.second) {
+ kv.first->second += 1;
}
}
// check duplicate of next
for(size_t i = 0; i < next.size(); i++) {
- if (duplicate(next[i], next)) {
+ if (duplicate(next[i], dups)) {
next[i] = elfs[i]; // stay put
}
}
return next;
}
+int count(const std::vector<elf>& elfs, const std::set<elf>& elvs) {
+ int minx{INT32_MAX}, miny{INT32_MAX};
+ int maxx{INT32_MIN}, maxy{INT32_MIN};
+
+ for (auto& e: elfs) {
+ minx = std::min(e.x, minx);
+ miny = std::min(e.y, miny);
+ maxx = std::max(e.x, maxx);
+ maxy = std::max(e.y, maxy);
+ }
+
+ int n{0};
+ for (int y = miny; y <= maxy; y++) {
+ for (int x = minx; x <= maxx; x++) {
+ if (elvs.find(elf{x, y}) == elvs.end()) n++;
+ }
+ }
+ return n;
+}
+
std::pair<int, int> day23(line_view file) {
int height{0};
std::vector<elf> elfs;
@@ -131,6 +168,16 @@ std::pair<int, int> day23(line_view file) {
std::set<elf> elves{elfs.begin(), elfs.end()};
- return {0, 0};
+ size_t n{0};
+ int r{0};
+ while (r < 10 /*true*/) {
+ elfs = round(r++, elfs, elves, &n);
+ if (n == elfs.size()) break;
+ elves.clear();
+ elves = std::set<elf>{elfs.begin(), elfs.end()};
+ }
+
+ int n1 = count(elfs, elves);
+ return {n1, r};
}
} // namespace aoc2022