diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/2019/day8/aoc.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/2019/day8/aoc.cpp b/src/2019/day8/aoc.cpp index c92a054..9109dd1 100644 --- a/src/2019/day8/aoc.cpp +++ b/src/2019/day8/aoc.cpp @@ -7,20 +7,40 @@ struct digits { int chars[10] = {0}; }; -static void count_digit(const char* p1, const char* p2, digits* p) { +struct layer { + char ds[25 * 6] = {0}; +}; + +//static void print(layer * l){ +// for(size_t i = 0; i < ARRAY_SIZE(l->ds); i++) { +// printf("%s", l->ds[i] > 0 ? "#" : "."); +// if ((i + 1) % 25 == 0) { +// printf("\n"); +// } +// } +//} + +static void fold_layers(const char* p1, const char* p2, digits* p, layer* l) { + int index{0}; + auto reset = [](char x, char y) { return y == 0 || y == 1 ? y : x; }; + while (p1 < p2) { p->chars[*p1 - '0'] += 1; + l->ds[index] = reset(*p1 - '0', l->ds[index]); p1++; + index++; } } std::pair<int, int> day8(line_view file) { digits ds[100]; int x = 6 * 25; + layer top; + memset(&top, 2, sizeof(layer)); for (int i = 0; i < 100; i++) { const char* p1 = file.line + i * x; const char* p2 = file.line + (i + 1) * x; - count_digit(p1, p2, &ds[i]); + fold_layers(p1, p2, &ds[i], &top); } struct ct { @@ -31,13 +51,10 @@ std::pair<int, int> day8(line_view file) { for (int i = 0; i < 100; i++) { cs[i].zeros = ds[i].chars[0]; cs[i].times = ds[i].chars[1] * ds[i].chars[2]; - // for (int j : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) { - // printf("%d ", ds[i].chars[j]); - // } - // printf("\n"); } std::sort(cs, cs + 100, [](ct c1, ct c2) { return c1.zeros < c2.zeros; }); + // print(&top); return {cs[0].times, 0}; } } // namespace aoc2019 |