diff options
Diffstat (limited to 'src/2016/day19/aoc.cpp')
-rw-r--r-- | src/2016/day19/aoc.cpp | 61 |
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 |