diff options
Diffstat (limited to 'src/2017/day10/aoc.cpp')
-rw-r--r-- | src/2017/day10/aoc.cpp | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/src/2017/day10/aoc.cpp b/src/2017/day10/aoc.cpp index 1e8461e..8b652b1 100644 --- a/src/2017/day10/aoc.cpp +++ b/src/2017/day10/aoc.cpp @@ -20,14 +20,14 @@ knot* make_knot(int n) { return k; } -static void print(knot* k) { - knot* n = k; - do { - printf("%d ", n->val); - n = n->next; - } while (n != k); - printf("\n"); -} +// static void print(knot* k) { +// knot* n = k; +// do { +// printf("%d ", n->val); +// n = n->next; +// } while (n != k); +// printf("\n"); +// } void forward(knot** k, int n) { knot* x = *k; @@ -37,8 +37,29 @@ void forward(knot** k, int n) { *k = x; } -// static void reverse(knot* head, knot* tail) { -// } +static void reverse(knot* left, knot* right, int d) { + while (d-- > 0) { + std::swap(left->val, right->val); + left = left->next; + right = right->prev; + } +} + +static void reverse(knot* head, int d) { + knot* tail = head; + int n = d; + while (--n > 0) { + tail = tail->next; + } + reverse(head, tail, d / 2); +} + +static void reverse_skip(knot** current, int d) { + static int skip = 0; + reverse(*current, d); + forward(current, d + skip); + skip += 1; +} static int get_number(const char** pp) { int d{0}; @@ -51,30 +72,18 @@ static int get_number(const char** pp) { return d; } -static void reverse(knot* head, int d) {} - -static void reverse_skip(knot** current, int d) { - static int skip = 0; - - reverse(*current, d); - forward(current, d + skip); - skip += 1; -} - std::pair<int64_t, int64_t> day10(line_view file) { + // knot* k = make_knot(5); // demo knot* k = make_knot(256); const char* p = file.line; knot* current = k; - print(current); while (p < file.line + file.length) { int d = get_number(&p); - // printf("%d\n", d); reverse_skip(¤t, d); p++; } - print(current); - return {0, 0}; + return {k->val * k->next->val, 0}; } } // namespace aoc2017 |