aboutsummaryrefslogtreecommitdiff
path: root/src/2016/day19/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2016/day19/aoc.cpp')
-rw-r--r--src/2016/day19/aoc.cpp61
1 files changed, 60 insertions, 1 deletions
diff --git a/src/2016/day19/aoc.cpp b/src/2016/day19/aoc.cpp
index bef17b4..a4b9d32 100644
--- a/src/2016/day19/aoc.cpp
+++ b/src/2016/day19/aoc.cpp
@@ -2,5 +2,64 @@
namespace aoc2016 {
-std::pair<int64_t, int64_t> day19(line_view) { return {0, 0}; }
+struct elf {
+ int i;
+ elf* next;
+};
+
+void add_elf(elf* e1, elf* ex, elf** last) {
+ ex->next = e1;
+ (*last)->next = ex;
+ *last = ex;
+}
+
+elf* del_elf(elf* e1) {
+ elf* e = e1;
+ while (e->next != e) {
+ elf* n = e->next->next;
+ e->next = n;
+ e = n;
+ }
+ return e;
+}
+
+elf* make_elf(int n) {
+ elf* e1 = new elf;
+ e1->i = 1;
+ e1->next = e1;
+ elf* last = e1;
+ for (int i = 2; i <= n; i++) {
+ elf* e = new elf;
+ e->i = i;
+ add_elf(e1, e, &last);
+ }
+ return e1;
+}
+
+size_t last_elf(size_t n) {
+ size_t x{0};
+ size_t i{1};
+ while (x < n) {
+ x += i;
+ i <<= 1;
+ }
+ x -= (i >> 1);
+ x += 1;
+ size_t a{1};
+ while (x != n) {
+ a += 2;
+ x += 1;
+ }
+ return a;
+}
+
+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);
+ // }
+ return {last_elf(3005290), 0};
+}
+
} // namespace aoc2016