From cb0b1542582f03af967635ee0cd266f015ae44f2 Mon Sep 17 00:00:00 2001 From: Mistivia Date: Mon, 22 Dec 2025 04:09:54 +0800 Subject: day 6 part 2 --- 06/part2.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 06/part2.c diff --git a/06/part2.c b/06/part2.c new file mode 100644 index 0000000..38c8ecc --- /dev/null +++ b/06/part2.c @@ -0,0 +1,114 @@ +#include +#include +#include +#include + +#define PANIC do { \ + fprintf(stderr, "panic at %s:%d\n", __FILE__, __LINE__); \ + abort(); \ +} while (0) + +StringVector read_mat() { + StringVector mat; + StringVector_init(&mat); + while (1) { + char *l = fgetline(stdin); + if (!l) { + return mat; + } + if (strlen(l) == 0) { + return mat; + } + int len = strlen(l); + if (l[len - 1] == '\n') { + l[len - 1] = '\0'; + } + StringVector_push_back(&mat, l); + } + return mat; +} + +char mat_read(StringVector *mat, int x, int y) { + const char *line = *StringVector_ref(mat, y); + return line[x]; +} + +char scan_column(StringVector *mat, int x, int *n) { + int out = 0; + int have_digit = 0; + for (int y = 0; y < mat->size - 1; y++) { + char c = mat_read(mat, x, y); + if (c == ' ') { + continue; + } else if (isdigit(c)) { + out = out * 10 + c - '0'; + have_digit = 1; + } else { + PANIC; + } + } + if (have_digit) { + *n = out; + } + return mat_read(mat, x, mat->size - 1); +} + +int main() { + StringVector lines = read_mat(); + long maxlen = 0; + for (int i = 0; i < lines.size; i++) { + long len = strlen(lines.buffer[i]); + if (len > maxlen) { + maxlen = len; + } + } + for (int i = 0; i < lines.size; i++) { + long len = strlen(lines.buffer[i]); + if (len < maxlen) { + char *spaces = malloc(maxlen - len + 1); + memset(spaces, '0', maxlen - len); + spaces[maxlen - len] = '\0'; + char *ns = malloc(maxlen + 1); + strcat(ns, lines.buffer[i]); + strcat(ns + len, spaces); + free(spaces); + free((void*)lines.buffer[i]); + lines.buffer[i] = ns; + } + } + long ret = 0; + IntVector read_nums; + IntVector_init(&read_nums); + for (int x = strlen(lines.buffer[0]) - 1; x >= 0; x--) { + int cur = -1; + char sym = scan_column(&lines, x, &cur); + if (cur >= 0) { + IntVector_push_back(&read_nums, cur); + } + if (sym == '+') { + long sum = 0; + for (int i = 0; i < read_nums.size; i++) { + sum += read_nums.buffer[i]; + } + ret += sum; + IntVector_free(&read_nums); + IntVector_init(&read_nums); + } else if (sym == '*') { + long prod = 1; + for (int i = 0; i < read_nums.size; i++) { + prod *= read_nums.buffer[i]; + } + ret += prod; + IntVector_free(&read_nums); + IntVector_init(&read_nums); + } + } + printf("%ld\n", ret); + + IntVector_free(&read_nums); + for (int i = 0; i < lines.size; i++) { + free((void*)lines.buffer[i]); + } + StringVector_free(&lines); + return 0; +} \ No newline at end of file -- cgit v1.0