diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-10 22:43:23 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-10 22:43:23 +0800 |
commit | 4a1e85f964a4079f138b52b5e55b97dfb426b7e5 (patch) | |
tree | 334d6493791dfe0e907e451aeeceee02ed8645ea /src/2018/day5/aoc.cpp | |
parent | ac146284fd54e11c7657a39f45fe8cc0213ebeb7 (diff) | |
download | advent-of-code-4a1e85f964a4079f138b52b5e55b97dfb426b7e5.tar.gz advent-of-code-4a1e85f964a4079f138b52b5e55b97dfb426b7e5.zip |
2018 day5
Diffstat (limited to 'src/2018/day5/aoc.cpp')
-rw-r--r-- | src/2018/day5/aoc.cpp | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/2018/day5/aoc.cpp b/src/2018/day5/aoc.cpp index 5b6d3cb..4ce6e5c 100644 --- a/src/2018/day5/aoc.cpp +++ b/src/2018/day5/aoc.cpp @@ -52,12 +52,45 @@ void deduct(char* p1, char* p2) { char* pb = p + 1; deduct(&pa, &pb, p1, p2); p = pb; + } else if (*p == ' ') { + char* pa = p - 1; + while (*p == ' ') + p++; + char* pb = p; + deduct(&pa, &pb, p1, p2); + p = pb; } else { p++; } } } +void remove(char* p1, char* p2, char c) { + while (p1 < p2) { + if (*p1 == c || *p1 == c - 32) { + *p1 = ' '; + } + p1++; + } +} + +int shortest(line_view file) { + int s{INT32_MAX}; + for (char i = 'a'; i <= 'z'; i++) { + char* p1 = (char*)malloc(file.length); + memcpy(p1, file.line, file.length); + char* p2 = p1 + file.length; + remove(p1, p2, i); + deduct(p1, p2); + int c = count({p1, p2}); + if (c < s) { + s = c; + } + free(p1); + } + return s; +} + void print(char* p1, char* p2) { while (p1 < p2) { if (*p1 != ' ') { @@ -68,13 +101,13 @@ void print(char* p1, char* p2) { printf("\n"); } -int day5(line_view file) { +std::pair<int, int> day5(line_view file) { char* p1 = (char*)malloc(file.length); memcpy(p1, file.line, file.length); char* p2 = p1 + file.length; deduct(p1, p2); // print(p1, p2); - return count({p1, p2}); + return {count({p1, p2}), shortest(file)}; } } // namespace aoc2018 |