aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-12-22 04:09:54 +0800
committerMistivia <i@mistivia.com>2025-12-22 04:09:54 +0800
commitcb0b1542582f03af967635ee0cd266f015ae44f2 (patch)
tree3484792456b1e9ceb47d16202bca0e609b56d5e0
parent448ae4e1c2dec6074bef1fa81f9aefe3476d2b5a (diff)
day 6 part 2
-rw-r--r--06/part2.c114
1 files changed, 114 insertions, 0 deletions
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 <algds/str.h>
+#include <algds/vec.h>
+#include <ctype.h>
+#include <string.h>
+
+#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