diff options
author | kaiwu <kaiwu2004@gmail.com> | 2023-02-09 17:01:36 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2023-02-09 17:01:36 +0800 |
commit | d496215180f2e8999997c421507fb643fbff876e (patch) | |
tree | 0dc36fed97b5dbbd9f3d903403a4cd284bb07d96 /src/2017/day16/aoc.cpp | |
parent | 6e66e948fd41ad01ec853ee297add1e7fe554298 (diff) | |
download | advent-of-code-d496215180f2e8999997c421507fb643fbff876e.tar.gz advent-of-code-d496215180f2e8999997c421507fb643fbff876e.zip |
2017 day16
Diffstat (limited to 'src/2017/day16/aoc.cpp')
-rw-r--r-- | src/2017/day16/aoc.cpp | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/src/2017/day16/aoc.cpp b/src/2017/day16/aoc.cpp index 6b163a4..b1f3ae0 100644 --- a/src/2017/day16/aoc.cpp +++ b/src/2017/day16/aoc.cpp @@ -2,5 +2,88 @@ namespace aoc2017 { -std::pair<int64_t, int64_t> day16(line_view) { return {0, 0}; } +static int pos(char cs[16], char c) { + for (int i = 0; i < 16; i++) { + if (cs[i] == c) + return i; + } + return 16; +} + +static void spin(char cs[16], int x) { + x %= 16; + char ts[16] = {0}; + memcpy(ts + x, cs, 16 - x); + memcpy(ts, cs + 16 - x, x); + memcpy(cs, ts, 16); +} + +static void exchange(char cs[16], int x, int y) { std::swap(cs[x], cs[y]); } +static void partner(char cs[16], char c1, char c2) { exchange(cs, pos(cs, c1), pos(cs, c2)); } +static void get_number(const char** pp, int* d) { + const char* p = *pp; + while (*p >= '0' && *p <= '9') { + *d = *d * 10 + *p - '0'; + p++; + } + *pp = p; +} + +static void print(char cs[16]) { + for (int i = 0; i < 16; i++) { + printf("%c", cs[i]); + } + printf("\n"); +} + +static void dance(char cs[16], line_view file) { + const char* p0 = file.line; + const char* p1 = p0; + + while (p1 < file.line + file.length) { + if (*p1 == ',' || *p1 == '\n') { + switch (*p0) { + case 's': { + int d = 0; + p0 += 1; + get_number(&p0, &d); + spin(cs, d); + break; + } + case 'x': { + int ds[2] = {0, 0}; + p0 += 1; + get_number(&p0, &ds[0]); + p0 += 1; + get_number(&p0, &ds[1]); + exchange(cs, ds[0], ds[1]); + break; + } + case 'p': + partner(cs, *(p0 + 1), *(p0 + 3)); + break; + default: + break; + } + p0 = p1 + 1; + } + p1++; + } +} + +std::pair<int64_t, int64_t> day16(line_view file) { + const char* s = "abcdefghijklmnop"; + char cs[16] = {0}; + + for (int i = 0; i < 16; i++) { + cs[i] = *(s + i); + } + // size_t billion = 1000000000; + size_t billion = 5; + while (billion-- > 0) { + dance(cs, file); + print(cs); + } + return {0, 0}; +} } // namespace aoc2017 |