aboutsummaryrefslogtreecommitdiff
path: root/src/2016/day19/aoc.cpp
diff options
context:
space:
mode:
authorkaiwu <kaiwu2004@gmail.com>2023-01-26 00:54:11 +0800
committerkaiwu <kaiwu2004@gmail.com>2023-01-26 00:54:11 +0800
commitc4bb3048a264c04fcd4ae14c0a615c8ff32695c8 (patch)
tree4e130a1ec21bbe9c4163bfaa33da89d64b034549 /src/2016/day19/aoc.cpp
parentfa8640ac94b4d14f1922c41f61a90b078f215f22 (diff)
downloadadvent-of-code-c4bb3048a264c04fcd4ae14c0a615c8ff32695c8.tar.gz
advent-of-code-c4bb3048a264c04fcd4ae14c0a615c8ff32695c8.zip
2016 day19
Diffstat (limited to 'src/2016/day19/aoc.cpp')
-rw-r--r--src/2016/day19/aoc.cpp47
1 files changed, 44 insertions, 3 deletions
diff --git a/src/2016/day19/aoc.cpp b/src/2016/day19/aoc.cpp
index a4b9d32..8d08886 100644
--- a/src/2016/day19/aoc.cpp
+++ b/src/2016/day19/aoc.cpp
@@ -23,6 +23,27 @@ elf* del_elf(elf* e1) {
return e;
}
+elf* cross(elf* e, int n) {
+ n = n / 2 - 1;
+ while (n > 0) {
+ e = e->next;
+ n--;
+ }
+ return e;
+}
+
+elf* del_elf(elf* e1, size_t n) {
+ elf* e = e1;
+ while (e->next != e) {
+ elf* ex = cross(e, n);
+ elf* en = ex->next->next;
+ ex->next = en;
+ e = e->next;
+ n -= 1;
+ }
+ return e;
+}
+
elf* make_elf(int n) {
elf* e1 = new elf;
e1->i = 1;
@@ -53,13 +74,33 @@ size_t last_elf(size_t n) {
return a;
}
+size_t final_elf(size_t n) {
+ if (n == 1) return 1;
+ size_t x{0};
+ size_t i{1};
+ while (x + 1 < n) {
+ x += i + i;
+ i *= 3;
+ }
+
+ x -= (i / 3) * 2;
+ x += 1;
+ size_t m = x + i / 3;
+ size_t a{1};
+ while (x != n) {
+ a += x < m ? 1 : 2;
+ x += 1;
+ }
+ return a - 1;
+}
+
std::pair<int64_t, int64_t> day19(line_view) {
// for (int i = 1; i < 100; i++) {
// elf* e = make_elf(i);
- // elf* x = del_elf(e);
- // printf("%d\n", x->i);
+ // elf* x = del_elf(e, i);
+ // printf("%d: %d %zu\n", i, x->i, final_elf(i));
// }
- return {last_elf(3005290), 0};
+ return {last_elf(3005290), final_elf(3005290)};
}
} // namespace aoc2016